0

私は実行可能ローダーについていくつかの調査を行ってきましたが、特定の仮想アドレスでロードする必要がある (つまり、再配置レコードを持たない) 実行可能ファイルをどのように処理するかが、私を混乱させます。

UPX にはこれを行う機能があることは知っていますが、これが UPX ソースでどのように処理されるかはわかりません (どのコードがロードを担当しているのか正確にはわかりません...)

ローダーを作成しましたが、ロード先の仮想アドレスが問題にならないように、アプリケーションに再配置レコードが必要です。

UPX のスタブのベース アドレスは 0x400000 で、ベース アドレスが 0x400000 の実行可能ファイルをロードする場合は問題ありません。OSは現在のプロセスのベースアドレスに仮想メモリを割り当てる要求を拒否するため、これはどのように可能ですか(少なくとも私にはこのように思われます)

これを達成するために必要と思われる機能である VirtualAlloc の UPX ソースを検索してみましたが、UPX ソースで 1 回だけ発生します ( https://github.com/upx/upx/search?utf8=% E2%9C%93&q=VirtualAlloc ) が一見無関係なコードに含まれているため、非常に混乱しています。

4

1 に答える 1

0

UPX のスタブのベース アドレスは 0x400000 です

本当じゃない。Upx はアプリケーションを保持しますIMAGE_OPTIONAL_HEADER.ImageBase- したがって、upx 圧縮イメージは常に同じベースにロードされます。

UPX は 3 つのセクションを作成します。

UPX0 - VirtualSize = OriginalSizeOfImage - UPX0.VirtualAddress; SizeOfRawData = 0 ERW
UPX1 - stub code + packed data
.rsrc - copy of original .rsrc

したがって、UPX0 は元のイメージのプレース ホルダーです。元のイメージのベース アドレスとサイズを保持します。ディスク上のゼロサイズ。UPX スタブ コードは、元のコード/データを UPX0 にアンパックします。これには VirtualAlloc は使用されません

于 2016-12-15T07:26:34.120 に答える