我没什么问题。我已经将DLL加载到进程中(它不是我的),我必须在其中使用函数。我有这个功能的偏移,所以我只需要获取DLL地址并将其添加到偏移量以获得该功能。 GetModuleHandle()
返回HMODULE
变量,但实际上我不知道HMODULE
是什么。它是加载DLL的地址还是某种其他标记?
如果它不是加载DLL的地址,我怎么能得到这个地址?我希望我能说清楚。
答案 0 :(得分:10)
您建议的方法可以正常使用。
您似乎已将dll注入目标进程,并希望从注入dll的进程中获取目标进程中该dll中函数的地址。
我假设您还在将dll注入目标进程的进程中加载了dll,并且您希望在目标进程中创建远程线程并让它在目标进程中执行目标函数。 / p>
由于您注入的dll可能无法在目标进程中的同一地址加载,因为它不能简单地使用您在注入过程中对函数调用GetProcAddress所获得的地址。
HMODULE只是DLL的基址(有关详细信息,请参阅this answer)。因此,您可以在注入过程中获取dll的HMODULE,并从函数上的GetProcAddress返回的地址中减去它。然后,您可以将目标进程中注入的dll的HMODULE添加到此偏移量,以获取目标进程中注入的dll中目标函数的地址。假设此函数具有正确的签名,则将其作为线程函数传递给您的调用以创建远程线程,并且您现在正在目标进程中运行目标函数。
我在this answer中详细解释了这一点。
答案 1 :(得分:4)
致电GetProcAddress。偏移取消了,因为您必须同时添加它(以获取函数)并减去它(以获取基址),所以您可能不会打扰。
答案 2 :(得分:1)
它类似于POSIX void*
函数返回的dlopen()
(它可能是一个typedef - 但我肯定不知道)。您将其作为参数传递给GetProcAddress
。你完成了,你也把它传递给FreeLibrary
来卸载DLL。