GetProcAddress不返回LoadLibraryA的实际地址

时间:2017-05-24 16:49:49

标签: windows winapi assembly dll loadlibrary

DWORD dwLoadLibrary = (DWORD)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");

当我转到OllyDbg中的返回地址时,我可以看到该地址指向跳转到LoadLibraryA的实际地址的代码。我想得到LoadLibraryA的真实地址,因为kernel32.dll是在每个进程的同一位置加载的,所以它不会改变,我也想知道为什么GetProcAddress没有返回真实地址。

enter image description here

3 个答案:

答案 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预留(以及函数的其余部分)开头的函数,但这并不意味着它无法以跳转开始在其他版本中。