DWORD dwLoadLibrary = (DWORD)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");
当我转到OllyDbg中的返回地址时,我可以看到该地址指向跳转到LoadLibraryA的实际地址的代码。我想得到LoadLibraryA的真实地址,因为kernel32.dll是在每个进程的同一位置加载的,所以它不会改变,我也想知道为什么GetProcAddress没有返回真实地址。
答案 0 :(得分:5)
您正在获取kernel32.LoadLibraryA
的“真实”地址,因为GetProcAddress()
会返回真实地址。只是kernel32.LoadLibrayA
的实施已从kernel32.dll
移至kernelbase.dll
,因此kernel32.LoadLibraryA
只包含一条指令:
jmp dword ptr[kernelbase.LoadLibraryA]
如果您在kernel32.dll
中查看更多功能,其中许多功能也具有相同的模式:
kernel32.somefunc:
jmp [kernelbase.somefunc]
答案 1 :(得分:1)
这是LoadLibraryA
的“真实”地址。跳转指令用于在那里放置间接的工具。他们会将该跳转的目标地址与其他东西交换,指向钩子,并在执行钩子后跳转到原始位置以实际执行该函数。
答案 2 :(得分:1)
你怎么知道它不是LoadLibraryA
的真实地址?也许试试WinDbg?
在我的Windows 8系统上GetProcAddress(x, "LoadLibraryA")
返回一个以正常mov edi,edi
hotpatch预留(以及函数的其余部分)开头的函数,但这并不意味着它无法以跳转开始在其他版本中。