3

私は DLL インジェクション手法について読んでいましたが、この質問を念頭に置いていました。

kernel32.dll に対して ASLR が有効になっている Windows 7 の宛先プロセスに DLL を挿入するとします。

したがって、注入されたコードのどの部分も winapi またはシステム コールを使用できません。これは、インジェクター コードの loadLibrary 関数のアドレスが宛先プロセスの loadLibrary のアドレスと異なるためです。

したがって、そのような呼び出しは機能しCreateRemoteThreadません:

CreateRemoteThread(hProcess,
                   NULL,
                   0,
                   (LPTHREAD_START_ROUTINE) ::GetProcAddress(hKernel32,
                                                             "LoadLibraryA" ),
                   pLibRemote,
                   0,
                   NULL );

::WaitForSingleObject( hThread, INFINITE );

この推論が間違っている場合は訂正してください。

4

2 に答える 2

8

いいえ、それは間違っていると思います。のようなモジュールのアドレスはkernel32.dll、マシンの起動時にランダム化されますが、すべてのプロセスで同じです。

于 2011-12-19T23:34:32.160 に答える
-3

インジェクターのインポート テーブルから GetModuleHandle (および GetProcAddress) を直接使用できます。これにより、カーネル 32 の GetModuleHandle への呼び出しにリダイレクトされ、任意のプロセスで使用できる KERNEL32 の LoadLibraryA のアドレスを取得できます。

ハードコーディングされた LoadLibraryA のアドレスを直接渡すと、インジェクターのインポート テーブルで LoadLibraryA のアドレスを渡すことになりますが、これはターゲット プロセスでは同じではありません。

「GetModuleHandle と GetProcAddress を呼び出す代わりに、インポート テーブルを変換しないのはなぜですか?」と尋ねる人がいるかもしれません。インポート テーブルは、実行可能ローダーが同じ GetModuleHandle と GetProcAddress を使用して取得した単なるポインターのテーブルです (実際には同じではありませんが、似ています)。

于 2012-06-30T17:44:08.013 に答える