2017-05-24 85 views
2
DWORD dwLoadLibrary = (DWORD)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA"); 

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

enter image description here

+0

即使您决定只为32位平台编码(奇怪),也不使用'(DWORD)'作为*指针*。使用'DWORD_PTR'代替或'void *' – RbMm

回答

5

由于GetProcAddress()返回实际地址,因此您将得到kernel32.LoadLibraryA的“真实”地址。它就是这么的kernel32.LoadLibrayA实施已经从kernel32.dllkernelbase.dll,并因此kernel32.LoadLibraryA仅由一个单一的指令:

jmp dword ptr[kernelbase.LoadLibraryA] 

如果您在kernel32.dll看看更多的功能,其中不乏也有此相同模式:

kernel32.somefunc: 
    jmp [kernelbase.somefunc] 
1

这是LoadLibraryA “真实” 的地址。那里有跳转指令,用于提供间接的工具。他们会将该跳转的目的地址与其他内容交换,指向该钩子,并在执行钩子以实际执行该功能后跳转到原始位置。

+0

这是否意味着GetProcAddress返回的LoadLibraryA地址在每个进程中都不会改变? – Xor

+0

这取决于动态链接器,所以是的,它可以改变。 – user2722968

+0

不,这不是钩子,并且'LoadLibraryA'的点没有改变 – RbMm

1

你怎么知道它不是LoadLibraryA的真实地址?也许尝试WinDbg呢?

在我的Windows 8系统上,GetProcAddress(x, "LoadLibraryA")返回一个函数,该函数以正常的mov edi,edi hotpatch预留(以及函数的其余部分)开头,但这并不意味着它不能在其他版本中跳转。