getprocaddress不同于dll和exe

getprocaddress不同于dll和exe,dll,exe,getprocaddress,Dll,Exe,Getprocaddress,我正在尝试用GetProcAddress获取GetProcAddress的地址(是的,自己调用它)。 当我从一个空的exe项目中执行此操作时,我会得到一个有效的地址(位于分配的kernel32地址之间) 当我从dll调用它时,得到的地址无效(不在分配的内核32的范围内) 有什么区别? 我在64位windows 7上运行 该项目编译为32位。 以下是我正在运行的代码: typedef FARPROC(WINAPI*GetProcAddressType)(HMODULE,LPCSTR) HMODUL

我正在尝试用GetProcAddress获取GetProcAddress的地址(是的,自己调用它)。 当我从一个空的exe项目中执行此操作时,我会得到一个有效的地址(位于分配的kernel32地址之间)

当我从dll调用它时,得到的地址无效(不在分配的内核32的范围内)

有什么区别? 我在64位windows 7上运行

该项目编译为32位。 以下是我正在运行的代码:

typedef FARPROC(WINAPI*GetProcAddressType)(HMODULE,LPCSTR)

HMODULE kernel32Hmodule=LoadLibraryW(L“c:\windows\system32\kernel32.dll”)

GetProcAddressType abc=(GetProcAddressType)GetProcAddress(内核32HM模块,“GetProcAddress”)

我还试图得到这样的地址:void*a=GetProcAddress; 但是当从dll运行时,它返回相同的无效地址


请提供帮助。

Exe通常在其首选地址加载,当他们选择ASLR和需要重新定位时(例如,他们的首选地址已被占用),DLL通常会重新定位(而不是在其首选地址加载)。这可以解释你在两种行为之间所经历的差异。

好的,我发现了问题。当我加载带有rundll32的dll时,它的行为异常。。。当我自己构建一个加载器(loadlibrary,而不是getprocaddress)时,它工作得很好。rundll32是导致问题的原因

Kernel32.dll未重新定位。ASLR偏移量在重新启动之前不会更改。更正Hans,我忘了这个,谢谢!这就是为什么我写了“可以解释…”:-)好的,我发现了问题。当我加载带有rundll32的dll时,它的行为异常。。。当我自己构建一个加载器(loadlibrary,而不是getprocaddress)时,它工作得很好。rundll32是导致问题的原因之一