5

DLL を逆アセンブルすると、いくつかの関数が表示されます。必要な機能が見つかりました。そのアドレスは0x10001340です。

この dll を自分のアプリケーションにロードした場合、このアドレスは変わりませんか? それで、アプリケーションからのアドレスでその関数を呼び出すことは可能でしょうか?

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

4

3 に答える 3

8

Windowsでは、dllには優先ロードアドレスがありますが、仮想アドレス空間のそのような部分がすでに使用されていることに気付いた場合、ローダーはこれらすべての参照を変更できます。このプロセスは「リベース」と呼ばれます。

「デフォルト」のベースアドレスは、リンク時に(/BASEMicrosoftリンカを使用して)指定されます。同じベースアドレスを持つ別のdllと一緒に使用する場合は、デフォルトとは異なる値に設定すると便利です。これにより、ローダーはロードごとにdllの1つをリベースする必要がないため、ロードプロセスが高速化されます。(IIRCには、既存のdllをリベースして、結果をディスクに保存できるツールもあります)

Windows Vista以降、ある種の悪用を避けるために、指定されたフラグでコンパイルされたdllは常にランダムなベースアドレスにロードされることに注意してください。

于 2012-06-10T16:54:36.220 に答える
3

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

/BASE のより良い値を考え出すこともできますが、要求したロード アドレスを取得できるという保証はありません。

于 2012-06-10T16:58:51.483 に答える
2

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

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

于 2012-06-10T17:07:35.767 に答える