这几天研究hook其它进程api。首先把dll注入其它进程已经成功。然后hook其它进行的api。这个目标进程也是我写的测试进程。
我在测试的目标进程中,调用了::MessageBoxA,::MessageBoxW,::DeleteFileA,都成功hook了。然后我在目标进程中,调用了如下代码:
CWindowDC dc(NULL);
dc.DrawText(_T("abc"), 3, CRect(0, 0, 100, 50), DT_SINGLELINE);
往屏幕左上角打印出abc。我Hook的是::DrawTextA和::DrawTextW。没有成功。实际上,dc.DrawText里面,也是调用的::DrawTextA或::DrawTextW,不知道为什么不成功。但我把上面的代码改成:
CWindowDC dc(NULL);
::DrawTextW(dc.GetSafeHdc(), _T("abc"), 3, CRect(0, 0, 100, 50), DT_SINGLELINE);
那么又可以成功hook了。
我不知道这是为什么。怎么解决。谢谢
你用的是Hook IAT的方法吧?
hook的是exe中的::DrawText,而不是exe调用的dll中的DrawText,所以导致问题的出现。详细解释请参考《Windows核心编程》第5版p604页。
如果你使用的是MFC动态库,CDC::DrawText在MFC的DLL中,如果你只Hook了EXE模块而没有Hook其加载的DLL,就是这样的结果。如果用Detour的方法就不会有这种问题。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。