2012-06-10 7 views
5

私はDLLを逆アセンブルし、いくつかの機能を見ました。私が必要とする機能が見つかりました。そのアドレスは0x10001340です。DLL内の関数アドレスをアプリケーションにロードすると変更することは可能ですか?

このDLLをアプリケーションにロードすると、このアドレスは変わらないでしょうか?だから私のアプリケーションからそのアドレスでその関数を呼び出すことは可能でしょうか?

このDLLがロードされたときに、メインアプリケーションの一部の機能がすでに同じアドレスを持っている場合はどうなりますか?したがって、DLL内の関数は、ロード時などにアドレスを変更する可能性があります。

+0

あなたはそれを正しく持っています... –

+0

どのようなオプションについて右ですか? :ロード時にDアドレスが変更される可能性がありますか? – Kosmos

答えて

8

Windows dllには優先ロードアドレスがありますが、ローダーはこれらの参照をすべて変更することができます既に使われた。このプロセスは「リベース」と呼ばれます。

"default"ベースアドレスは、リンク時に指定されています(Microsoftリンカーと/BASE)、dllを別のものと一緒に使用する予定がある場合は、デフォルトとは異なる値に設定すると便利です同じベースアドレス。これは、ローダが各ロード時にdllの1つを再配置する必要がないため、ロード処理を高速化します。 (IIRCには、既存のDLLをリベースして結果をディスクに保存できるツールもあります)

Windows Vista以降では、指定されたフラグでコンパイルされたDLLは常にランダムにロードされますいくつかの種類の悪用を避けるためにベースアドレス。

3

極端にあなたは同じアドレスになることはまずありません。 DLLのリンカのデフォルト/ BASE引数は0x10000000です。これは、あなたのエントリポイントがそのアドレスで終わったところです。しかし、多くの DLLがデフォルト設定を使用してリンクされていますが、実際にそのアドレスに1つしかロードできません。後でロードされる他のすべてのものは再ベースする必要があります。

あなたは/ BASEに対してより良い価値を思いつくことができますが、要求するロードアドレスを取得することは決して保証されません。

2

Matteoによると、DLLには好ましいロードアドレス(IMAGE_OPTIONAL_HEADER構造体のImageBaseフィールドで指定されている)があります。システムがDLLをロードしようとすると、(アドレス空間のランダム化が有効になっていない限り)可能であれば、このアドレスにロードされ、「パッチ適用」は必要ありません。優先アドレスでロードできない場合は、DLLの再配置が行われます。再配置を補うために、DLLに絶対参照が必要です。

質問に答えてください: DLLが優先アドレスでロードされるという保証はありません。一度ロードされると、その後のロードではDLLのコピーがそれ以上ロードされないため、アドレスは変更されません。しかし、いったんアンロードされると(DLLは参照カウントされます)、次回同じアドレスにロードされる保証はありません。

関連する問題