DWORD WINAPI HookAPI(LPVOID lpParam)
{
HMODULE hMod;
TEXTOUTA lpfnTextOutA;
EXTTEXTOUTA lpfnExtTextOutA;
DWORD dwProtectA;
DWORD dwProtectB;
MEMORY_BASIC_INFORMATION mbiA;
MEMORY_BASIC_INFORMATION mbiB;
hMod = GetModuleHandle("GDI32.dll");
lpfnTextOutA = (TEXTOUTA)GetProcAddress(hMod, "TextOutA");
lpfnExtTextOutA = (EXTTEXTOUTA)GetProcAddres(hMod, "ExtTextOutA");
VirtualQuery(lpfnTextOutA, &mbiA, sizeof(mbiA));
VirtualQuery(lpfnExtTextOutA, &mbiB, sizeof(mbiB));
VirtualProtect(
lpfnTextOutA, 5,
PAGE_READWRITE, &dwProtectA
);
VirtualProtect(
lpfnExtTextOutA, 5,
PAGE_READWRITE, &dwProtectB
);
WriteProcessMemory(
GetCurrentProcess(),
byTextOutAOldEntry,
&lpfnTextOutA,
5,
NULL
);
WriteProcessMemory(
GetCurrentProcess(),
byExtTextOutAOldEntry,
&lpfnExtTextOutA,
5,
NULL
);
byTextOutANewEntry[0] = 0xE9;
*((PDWORD)(byTextOutANewEntry + 1)) = (DWORD)(TextOutAProxy); //改写原函数的入口地址
byExtTextOutANewEntry[0] = 0xE9;
*((PDWORD)(byExtTextOutANewEntry + 1)) = (DWORD)(ExtTextOutAProxy); //注意这里, 改写原函数的入口地址
WriteProcessMemory(
GetCurrentProcess(),
lpfnTextOutA,
byTextOutANewEntry,
5,
NULL
);
//MessageBox(NULL, "A", NULL, MB_OK);
WriteProcessMemory(
GetCurrentProcess(),
lpfnExtTextOutA,
byExtTextOutANewEntry,
5,
NULL
);
//MessageBox(NULL, "B", NULL, MB_OK);
VirtualProtect(
lpfnTextOutA, 5,
dwProtectA, NULL
);
VirtualProtect(
lpfnExtTextOutA, 5,
dwProtectB, NULL
);
return 0;
}
以上是一个挂接API的函数,它被放在一个DLL中, 而这个DLL将被插如到一个远程进程空间里。这个函数通过将TextOutA, ExtTextOutA函数的前5个字节改成一条
JMP XXXXXXXX指令来实现对TextOutA和ExtTextOutA函数的挂接.朋友请看那个两个注释有“改写原函数入口地址”的地方。 这个函数执行后, 确实改变了原函数的前5个字节, 但是JMP后面的地址却很是奇怪,变成了8XXXXXXX, 而在这个位置根本没有任何指令。 为什么在我的函数中我赋的值是我自己的函数地址, 而改写后却是个无效的指令地址呢? 是不是这个地址的东东我还没搞懂啊? 朋友帮我看看。 谢谢了。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)