inline hook内联汇编dll之屏蔽记事本粘贴功能
来源:互联网 发布:java gson解析json 编辑:程序博客网 时间:2024/06/16 12:39
网上大把的inline hook MessageBox的例子,看得是在蛋疼,坑太多,看再多不如自己写一遍来的实际。顺便上传完整的代码上来。
inline hook完成主要分成以下几个部分:
1.定义要HOOK的真实API函数地址类型与声明。
typedef int (WINAPI *SetClipboardData_type)
(
__in UINT uFormat,
__in_opt HANDLE hMem
);
SetClipboardData_type RealSetClipboardDate = NULL;
上面这段的意思是:定义一个名字叫SetClipboardData_type的WINAPI类型返回值是int的函数指针。
2.定义要跳转到我们自己定义的API函数
_declspec(naked) void WINAPI mySetClipboardData(
__in UINT uFormat,
__in_opt HANDLE hMem
)
{
__asm
{
PUSH ebp
mov ebp,esp
push esi
}
//要做的事
//....
//MessageBoxA(NULL,"xxxxxxxxxx!","提示",MB_ICONINFORMATION );
//结束
__asm
{
pop esi
// mov ebx,RealSetClipboardDate
// add ebx,5
// jmp ebx //调回原地址
pop ebx
pop edi
leave
ret 8
}
}
因为当我们调用真正的SetClipboardDate,我们要将之前我们换掉的头部换回来,我们要内联汇编,里面不能含有编译器自动添加的代码,所以在mySetClipboardData头部要加上 _declspec(naked)
3.定义结构体,包含跳转命令和跳转地址。
#pragma pack(1)
typedef struct _JMPCODE
{
BYTE jmp;
DWORD addr;
}JMPCODE,*PJMPCODE;
4.HOOK函数
VOID HookSetClipboardDate()
{
JMPCODE jcode;
jcode.jmp = 0xe9;
jcode.addr = (DWORD)mySetClipboardData - (DWORD)RealSetClipboardDate - 5;
::ReadProcessMemory(GetCurrentProcess(),SetClipboardData,&oldjcode,5,NULL);::WriteProcessMemory(GetCurrentProcess(),SetClipboardData,&jcode,sizeof(JMPCODE),NULL);//写入跳转语句
}
ReadProcessMemory用于保存前5个字节内容,WriteProcessMemory写入跳转语句
5.卸载HOOK的函数钩子
VOID UnHookSetClipboardDate()
{
WriteProcessMemory(GetCurrentProcess(),SetClipboardData,&oldjcode,5,NULL);
}
将原来的5个字节写入源地址
6.DllMain部分
BOOL APIENTRY DllMain(HANDLE hModule, DWORD fdwReason, LPVOID lpReserved)
{
HMODULE hMod = LoadLibraryA("user32.dll");
RealSetClipboardDate = (SetClipboardData_type)GetProcAddress(hMod,"SetClipboardData");
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
{
hThread1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Fun1proc,NULL,0,NULL);
CloseHandle(hThread1);
}
break;
case DLL_PROCESS_DETACH:
{
UnHookSetClipboardDate();
//MessageBox(NULL,_T("卸载成功!"),_T("提示"),MB_ICONINFORMATION );
}
break;
}
return TRUE
}
源码下载地址:http://download.csdn.net/detail/qyuewei/7653317
- inline hook内联汇编dll之屏蔽记事本粘贴功能
- Inline Assembler 内联汇编
- inline assembly内联汇编
- HOOK钩子技术2 内联钩子Inline HOOK 通过DLL注入
- Qt4中屏蔽粘贴功能
- Android EditText屏蔽粘贴功能
- c#屏蔽复制粘贴功能
- HOOK钩子技术1 inline HOOK内联钩子
- C++ Inline ASM 内联汇编祥解
- C++ Inline ASM 内联汇编祥解
- C++ Inline ASM 内联汇编详解
- GCC内联汇编(inline assembly)
- GCC Inline ASM GCC内联汇编
- Visual C Inline ASM 内联汇编
- 内联汇编(inline assembler) 的相关资料
- C++ Inline ASM 内联汇编祥解
- GCC Inline ASM GCC内联汇编
- C++ Inline ASM 内联汇编详解
- MFC学习笔记(2)—— 消息(1)
- 随记
- Difference between proxy server and reverse proxy server
- USACO maze1 BFS
- 使用UrlRewriteFilter如何在Tomcat crossContext的情况下上传文件
- inline hook内联汇编dll之屏蔽记事本粘贴功能
- iOS UIButton 設置
- poj 3177&&3352 求边双联通分量,先求桥,然后求分量( 临界表代码)
- 数码相机相机相片删除后如何恢复【天盾数据恢复中心】
- POJ 2560 Freckles
- Java集合源码学习(5)_List接口的基础实现AbstractList
- 29 求转置矩阵问题
- 工单状态BUG
- centos 6.5 安装配置LAMP(linux,apache,mysql,php)环境