2012-02-29 7 views
0

私はGetProcAddressでGetProcAddressのアドレスを取得しようとしています。 空のexeプロジェクトから実行しているときに、有効なアドレス(kernel32の割り当てられたアドレスの間)を取得します。getprocaddressはdllとexeと異なる動作をします

私は、DLLからそれを呼んでいるとき、私は(ない割り当てられたカーネル32の範囲で)無効なアドレスを取得しています

違いは何ですか? 私はWindows 7で64ビットで動作しています。

プロジェクトは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から実行したときには、同じ不正なアドレスを返す...

助けてください。

答えて

0

ok問題が見つかりました。 rundll32でdllをロードすると、wierdが動作しました...自分でloaderをビルドするとき(getprocaddressよりloadlibrary)、うまく動作しました。 rundll32は問題を引き起こしたものです

0

exeファイルは、通常、彼らの優先アドレスにロードされ、DLLは、多くの場合、彼らはASLRを選ぶと再配置が必要な場合(例えば、その優先アドレスがすでに使用されている)とき(好みのアドレスにロードされていない)再配置されます。これは、あなたがその行動の間に経験したデルタを説明することができます。

+0

Kernel32.dllは再配置されません。 ASLRオフセットは再起動するまで変更されません。 –

+0

Hansを修正しました。私はこれを忘れました、ありがとう!だからこそ私は「説明することができる」と書いた:-) – mox

+0

ok私は問題を見つけた。 rundll32でdllをロードしたときにwierdが動作しました...自分でローダーをビルドすると(loadlibrary、getprocaddressより)うまく動作しました。 rundll32が原因で問題が発生しました –

関連する問題