我正在编写代码以在 Windows 中执行 IAT 的挂钩。我可以在 IAT (Kernel32!GetCurrentProcessId) 中更改目标函数的地址,但是稍后在程序中调用挂钩函数时会调用 Kernel32!GetCurrentProcessId 而不是挂钩。
在调试过程中,我可以看到 Kernel!GetCurrentProcessId 的原始 IAT 地址:
GetCurrentProcessId 地址:7C8099C0
我要交换的功能是:
MyGetCurrentProcessId 地址:100118BB
我挂钩 thunkIAT->u1.Function 的地址并将其从 7C8099C0 更改为 100118BB,但是正如我之前提到的,当从程序中调用 GetCurrentProcessId() 时,会调用 Kernel32 函数(不是我注入的那个)。
执行钩子的部分代码是:
if(strcmp(apiName,(char*)(*nameData).Name)==0)
{
DBG_PRINT2("[processImportDescriptor]: found match for %s\n", apiName);
VirtualProtect(
&thunkIAT->u1.Function, // start addres of the zone to "unlock"
0x010, // size to protect
PAGE_EXECUTE_READWRITE, // new permission
&dwOldProtect // old permission
);
procPtr = MyGetCurrentProcessId;
thunkIAT->u1.Function = (DWORD)procPtr;
DBG_PRINT2("MyGetCurrentProcessId() address: %08X\n", MyGetCurrentProcessId);
DBG_PRINT2("procPtr address: %08X\n", procPtr);
DBG_PRINT2("thunkIAT->u1.Function address: %08X\n", thunkIAT->u1.Function);
VirtualProtect(
&thunkIAT->u1.Function, // start addres of the zone to "relock"
0x0010, // size to protect
dwOldProtect, // new permission
&dwOldProtect2 // old permission
);
}
有什么想法吗?谢谢你。