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

のための実アドレスを返しません。カーネル32.dllがすべてのプロセスの同じ場所にロードされ、GetProcAddressが実際のアドレスを返さない理由を知りたいので、変更されないLoadLibraryAの実際のアドレスを取得したい。のGetProcAddressはLoadLibraryA

enter image description here

+0

32ビットプラットフォーム専用のコーディング(奇妙なことです)を決定した場合でも、* pointer *は '(DWORD)'を使用しないでください。代わりに 'DWORD_PTR'または' void * 'を使用してください – RbMm

答えて

5

実際のアドレスがkernel32.LoadLibraryAになると、GetProcAddress()が実際のアドレスを返します。それはkernel32.LoadLibrayAの実装がkernel32.dllからkernelbase.dllに移動しただけのことで、結果としてkernel32.LoadLibraryAは、単に単一の命令で構成されています:あなたはkernel32.dllでより多くの機能を見れば

jmp dword ptr[kernelbase.LoadLibraryA] 

が、それらの多くはまた、これと同じを持っていますpattern:

kernel32.somefunc: 
    jmp [kernelbase.somefunc] 
1

これはLoadLibraryAの "本当" のアドレスです。ジャンプ命令はそこに間接参照を入れるためのツールです。彼らはそのジャンプの宛先アドレスを何か他のものに入れ替え、フックを指し示し、実際にその機能を実行するためにフックを実行した後に元の位置にジャンプする。

+0

LoadLibraryAのGetProcAddressから返されたアドレスが各プロセスで変更されないことを意味しますか? – Xor

+0

これはダイナミックリンカによって異なりますので、変更できます。 – user2722968

+0

いいえ、これはフックではなく、 'LoadLibraryA'のポイントは変更されません – RbMm

1

LoadLibraryAの実際のアドレスではないことをどのように知っていますか?代わりにWinDbgを試してみてください。

私のWindows 8システムでは、GetProcAddress(x, "LoadLibraryA")は通常のmov edi,ediホットパッチの予約(および残りの機能)で始まる機能を返しますが、それは他のバージョンのジャンプでは開始できないということを意味しません。

関連する問題