我正在研究用Jeffrey Richter的方法来HOOK API,但是却遇到一个奇怪的问题。
我现在是照着他的方法来Hook MessageBox,如果我得例程中直接调用::MessageBox,并且是Debug方式就可以正常的HOOK住MessageBox,但是如果是调用的CWnd的MessageBox就不行了,而且如果编译的方式是Release时即时调用的::MessageBox也Hook不到,不知道是怎么回事。
有没有哪位对这方面有研究,知道是怎么回事?
我现在是照着他的方法来Hook MessageBox,如果我得例程中直接调用::MessageBox,并且是Debug方式就可以正常的HOOK住MessageBox,但是如果是调用的CWnd的MessageBox就不行了,而且如果编译的方式是Release时即时调用的::MessageBox也Hook不到,不知道是怎么回事。
有没有哪位对这方面有研究,知道是怎么回事?
1.
//必须修改相应的页面属性,否则有可能无法写入代码
VirtualProtect(ppfn,sizeof(pfnNew),PAGE_READWRITE,&dwOldProtect);
WriteProcessMemory(GetCurrentProcess(), ppfn, &pfnNew,sizeof(pfnNew), NULL);
VirtualProtect(ppfn,sizeof(pfnNew),dwOldProtect,0);
2.
在debug模式下,你调用CWnd::MessageBox的时候,实际上是在调用从mfc42d.dll导出的CWnd::MessageBox函数,而mfc42d.dll又从user32.dll导入了MessageBox,所以如果你只修改EXE本身的IAT,是不能HOOK到MFC函数的,你要把mfc42d.dll的IAT中的MessageBox地址也改写掉才有用。
hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);
MODULEENTRY32 me32.dwSize = sizeof(MODULEENTRY32);
if (Module32First(hModuleSnap, &me32))
{
do
{
//HOOK这个模块中调用的API
}
while (Module32Next(hModuleSnap, &me32));
}