DWORD dwLoadLibrary = (DWORD)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");
のための実アドレスを返しません。カーネル32.dllがすべてのプロセスの同じ場所にロードされ、GetProcAddressが実際のアドレスを返さない理由を知りたいので、変更されないLoadLibraryAの実際のアドレスを取得したい。のGetProcAddressはLoadLibraryA
DWORD dwLoadLibrary = (DWORD)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");
のための実アドレスを返しません。カーネル32.dllがすべてのプロセスの同じ場所にロードされ、GetProcAddressが実際のアドレスを返さない理由を知りたいので、変更されないLoadLibraryAの実際のアドレスを取得したい。のGetProcAddressはLoadLibraryA
実際のアドレスがkernel32.LoadLibraryA
になると、GetProcAddress()
が実際のアドレスを返します。それはkernel32.LoadLibrayA
の実装がkernel32.dll
からkernelbase.dll
に移動しただけのことで、結果としてkernel32.LoadLibraryA
は、単に単一の命令で構成されています:あなたはkernel32.dll
でより多くの機能を見れば
jmp dword ptr[kernelbase.LoadLibraryA]
が、それらの多くはまた、これと同じを持っていますpattern:
kernel32.somefunc:
jmp [kernelbase.somefunc]
これはLoadLibraryA
の "本当" のアドレスです。ジャンプ命令はそこに間接参照を入れるためのツールです。彼らはそのジャンプの宛先アドレスを何か他のものに入れ替え、フックを指し示し、実際にその機能を実行するためにフックを実行した後に元の位置にジャンプする。
LoadLibraryAのGetProcAddressから返されたアドレスが各プロセスで変更されないことを意味しますか? – Xor
これはダイナミックリンカによって異なりますので、変更できます。 – user2722968
いいえ、これはフックではなく、 'LoadLibraryA'のポイントは変更されません – RbMm
LoadLibraryA
の実際のアドレスではないことをどのように知っていますか?代わりにWinDbgを試してみてください。
私のWindows 8システムでは、GetProcAddress(x, "LoadLibraryA")
は通常のmov edi,edi
ホットパッチの予約(および残りの機能)で始まる機能を返しますが、それは他のバージョンのジャンプでは開始できないということを意味しません。
32ビットプラットフォーム専用のコーディング(奇妙なことです)を決定した場合でも、* pointer *は '(DWORD)'を使用しないでください。代わりに 'DWORD_PTR'または' void * 'を使用してください – RbMm