我正在阅读 CodeProject 上的各种内容,发现这篇文章: http: //www.codeproject.com/Articles/29527/Reverse-Engineering-and-Function-Calling-by-Addres
所以我所做的是创建了一个注入器和一个 DLL,并获取了示例可执行文件。当您按 F11 时,它基本上会输出:http: //i.stack.imgur.com/YIygV.jpg
所以我遵循了整个教程,但问题是 DLL 中使用的地址总是在变化。这个要具体:
pFunctionAddress pMySecretFunction = (pFunctionAddress)(0x004113C0);
在他的教程中,函数的地址是 0x004113C0。在我的情况下,它是另一回事,我拿走我拥有的那个并使用它。它工作得很好,但是当我关闭可执行文件并打开它时,它就不再工作了,而且 OllyDbg 显示该地址是一个全新的地址。
因此,我进行了一些研究,并开始使用 OllyDbg 添加断点。我发现地址总是:
main + 4C
我猜“main”是这些可执行文件的主要模块。如何始终找到该函数的地址?因为它一直在变化,我现在一无所知。在本文中,我读到它并没有说明重新打开可执行文件时会发生什么,我花了 5 个小时试图找到解决方案。
提前致谢!
编辑:
非常感谢大家。特别感谢mfc,我终于弄明白了!我最终做的是每当我点击 DLL_PROCESS_ATTACH 时,我将一个全局 HMODULE 设置为可执行文件的地址,如下所示:
HMODULE g_hExeModule;
g_hExeModule = GetModuleHandle(L"TutExample.exe");
经过几次测试后,函数地址似乎总是可执行文件的地址 + 0x11014,所以在调用中我只是这样做:
pFunctionAddress pMySecretFunction = (pFunctionAddress)((DWORD)g_hExeModule + 0x11014);