0

GetProcAddressを使用してGetProcAddressのアドレスを取得しようとしています(はい、それ自体で呼び出します)。空のexeプロジェクトから実行すると、有効なアドレス(kernel32の割り当てられたアドレスの間)を取得します。

dllから呼び出していると、無効なアドレスを取得しています(割り当てられたkernel32の範囲内ではありません)

違いはなんですか?私は64ビットのWindows7で実行しています。

プロジェクトは32ビットとしてコンパイルされます。これが私が実行しているコードです:

typedef FARPROC(WINAPI * GetProcAddressType)(HMODULE、LPCSTR);

HMODULE kernel32Hmodule = LoadLibraryW(L "c:\ windows \ system32 \ kernel32.dll");

GetProcAddressType abc =(GetProcAddressType)GetProcAddress(kernel32Hmodule、 "GetProcAddress");

また、次のようなアドレスを取得しようとしました。void * a = GetProcAddress; しかし、dllから実行すると同じ無効なアドレスが返されます...

助けてください。

4

2 に答える 2

0

Exe は通常、優先アドレスにロードされます。DLL は、ASLR を選択した場合や再配置が必要な場合 (優先アドレスが既に使用されている場合など) に再配置されることがよくあります (優先アドレスにロードされません)。これは、行動の間に経験したデルタを説明することができます.

于 2012-03-03T17:22:47.157 に答える
0

わかりました私は問題を見つけました。rundll32 を使用して dll をロードすると、おかしな動作をしました...自分でローダーをビルドすると (getprocaddress よりも loadlibrary)、正常に動作しました。rundll32 が問題の原因です

于 2012-03-04T07:59:43.763 に答える