5

メインプログラムを独自のイメージベースの非常に高い位置にリベースした後。

読み込まれる dll が 0x400000 に読み込まれることを保証するにはどうすればよいですか

dllImageBase = LoadLibrary("test.dll");
printf("imagebase = 0x%x", dllImageBase);

0x400000 ではなく常に 0x460000 を取得します

dll の最初の命令を 0x401000 から開始する必要があります。以前は、リベースする前に 0x600000 で開始していました。

リンカがリベースするコマンドは

#pragma comment( linker, "/BASE:8000000") 

そのため、0x400000 は実際には現在無料ですが、デフォルトでは使用されません。そのため、再配置する必要がある場所に制御できます。多分いくつかのWIN32API?

4

2 に答える 2

5

必要な場所に DLL をロードするには、Address Space Layout Randomization を無効にする必要があります。あなたがやろうとしていることを止めるように設計された機能。/DYNAMICBASE リンカー オプション。試してみると、0x400000 でのロードが機能しました。

于 2011-09-11T18:29:34.357 に答える
3

特定のベースで読み込まれる DLL に依存しないでください。特定のベースで DLL を強制的にロードできる場合は、潜在的なセキュリティ ホールを開いていることになります。

マップ ファイルがあれば、特定の関数のオフセットがわかります。したがって、GetProcAddress を使用して、DLL のベース アドレスを調べることができます。これは、DLL を更新すると DLL をロードするコードが破損することを意味する場合でも、はるかに安全な作業方法です。

于 2011-09-11T18:32:36.710 に答える