2

パッカー/自己解凍 exe タイプのプログラムを作成しようとしていますが、Visual C++ のリンカーによって作成されたセグメントの順序に問題があります。

基本的に、次のように定義された特別な変数を持つスタブ プログラム (ローダー) があります。

#pragma const_seg(".blah")
const char blah[1];
#pragma const_seg()

そして、データを使って何かをしますblah(例えば、データをアンパックします)。

次に、2 番目のプログラム (パッカー) がローダー プログラムをテンプレートとして使用して、blah.

基本的に、パッカーはローダー ファイルをコピーし、古い.blahセクションを新しいデータに置き換えます。新しいファイルが実行されると、ローダーはこの新しいデータで動作します。

exe ファイルを変更するのは難しい作業です。簡単にするため.blahに、ファイルの最後のセグメントにして、単純にデータをローダーに追加し、PE ヘッダーのいくつかのサイズ フィールドを修正できるようにします。

.blahただし、Visual C++ リンカでセグメントの順序を制御して、ローダーをコンパイルするときにファイルの最後に配置する方法がわかりません。

現在、セクションの順序は次のとおりです。

.textbss
.text
.rdata
.data
.idata
.blah
.rsrc
.reloc

ご覧.rsrcのとおり.reloc、場所が間違っています。前にそれらが必要.blahです。

この順序を変更するにはどうすればよいですか?

4

2 に答える 2

2

MSVC がセグメントに対して提供する唯一の制御は、カスタムのものを作成し、既存のものをマージし、各セグメントのアクセス フラグを制御する機能です。これを超えるものは無意味になります。順序付けのルールが設定されていないため、コンパイラは自由に使用できます。最も単純な/最も簡単なオプションを選択してください。

やりたいことは、PEのセグメント記述子をループして最大のベースアドレスを見つけ、それとセグメントサイズを追加アドレスとして使用するだけで、はるかに信頼性が高くなります。

于 2012-10-04T09:20:22.787 に答える
0

これを回避する方法は、リンク時に.javaセクションをローダーに追加しないことです。

代わりに、パッカーはファイルの最後に新しい.javaセクションを作成します。

ローダーが実行されると、(GetModuleHandleから)ベースアドレスを取得し、次にDOS、NT、最後にセクションヘッダーを解析して、.javaセクションの相対仮想アドレスを取得します。

Windowsがセクションヘッダーをロードするとき、ファイルの配置にオフセットされているディスクとは異なり、オプションのヘッダーのデータディレクトリの直後に配置されることに注意してください。

セクションの最終アドレスは、ベースアドレスを相対アドレスに追加することによって検出されます。

于 2012-10-04T14:46:59.077 に答える