替换 IAT 中的导入函数地址实现 Hook API
来源:互联网 发布:照片音乐视频制作软件 编辑:程序博客网 时间:2024/05/16 00:53
详细说明《Windows 核心编程》中有。贴段代码,我写得比他写得简洁多了。自己会查找 Image Import descriptor 的地址,而不像书中所用的调用 ImageHlp.dll 或者 DbgHelp.dll 中的函数 ImageDirectoryToData 来实现。为了使用一些 PE 结构类型,请 #include (不会导入他的函数)。
使用方法:
HookAPI((PBYTE) GetModuleHandle(NULL), "User32.dll", MessageBox, MyMessageBox);
取消Hook:
HookAPI((PBYTE) GetModuleHandle(NULL), "User32.dll", MyMessageBox, MessageBox);
原本以为用这种方法能 Hook User32.dll 中的 SetScrollInfo 实现 ClassXP 自绘 Scroll 的。因为需要 HookAPI((PBYTE) GetModuleHandle("User32.dll"), "User32.dll", SetScrollInfo, MySetScrollInfo) ,后来发现 User32.dll 根本不是导入自己的函数,而是直接调用——早该想到了,晕死!
所以替换 IAT 方法 Hook,还是有限制的,没办法在ClassXP中使用:(只好替换SetScrollInfo的入口点代码了:(
PVOID HookAPI(PBYTE pbModule, PCSTR pszName, PVOID pvOrg, PVOID pvNew)
{
PIMAGE_THUNK_DATA r;
PIMAGE_NT_HEADERS p;
PIMAGE_IMPORT_DESCRIPTOR q;
p = (PIMAGE_NT_HEADERS) (pbModule + ((PIMAGE_DOS_HEADER) pbModule)->e_lfanew);
q = (PIMAGE_IMPORT_DESCRIPTOR) (pbModule + p->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
for (; q->Name; q++)
{
if (lstrcmpiA(pszName, (PCSTR) (pbModule + q->Name)) == 0)
{
for (r = (PIMAGE_THUNK_DATA) (pbModule + q->FirstThunk); r->u1.Function; r++)
{
if ((PVOID) r->u1.Function == pvOrg)
{
WriteProcessMemory(GetCurrentProcess(), &r->u1.Function, &pvNew, sizeof(PVOID), NULL);
return pvOrg;
}
}
}
}
return NULL;
}
下面是替换函数入口的方法,只能用于X86的平台中,尚不完善。 PVOID HookApi(PVOID pvOrg, PVOID pvNew) { DWORD dwProtect; if (VirtualProtect(pvOrg, 16, PAGE_READWRITE, &dwProtect)) { PBYTE p = (PBYTE) pvOrg; PDWORD q = (PDWORD) (p + 1); *p = 0xE9; *q = (LONG) pvNew - (LONG) (p + 5); VirtualProtect(pvOrg, 16, dwProtect, &dwProtect); return pvOrg; } return NULL; }
- 替换 IAT 中的导入函数地址实现 Hook API
- Hook IAT实现替换 Native API 以及一般 API
- 使用API-HOOK修改IAT的地址
- 修改IAT实现本进程API HOOK
- 修改IAT,HOOK API
- 修改IAT,HOOK API
- 通过下全局API Hook修改IAT中函数地址为何截获不了Ws2_32.dll的recv()
- API HOOK的 IAT方法
- 检测IAT HOOK----进程内存中的IAT
- 用修改IAT法HOOK API
- 修改IAT法来hook api
- IAT HOOK
- IAT HOOK
- HOOK IAT
- IAT HOOK
- IAT HOOK
- IAT HOOK
- IAT HOOK
- CALLBACK回调函数使用之三
- 修改表主键的字段类型
- #pragma 指示符应用举例
- easymock中遇到方法调用次数错误的问题
- 面向接口编程在工厂模式下的实现
- 替换 IAT 中的导入函数地址实现 Hook API
- 爱因斯坦出的谜语
- Java 数据类型之字符串
- MY HOUSE
- 关于程序员的一切一切
- 配置 UltraEdit 为 MASM32 的IDE
- 单词的划分
- 程序员不是神 心态决定一切
- ARM922T核ZCP320A处理器PCI总线操作