3

最近、私はいくつかの PE 実行可能仕様を読んでいました。次に、小さな C プログラムをpush ebp, pop ebp作成し、コンパイルしました。コンパイルが成功した後、実行可能ファイルで PE ファイルを開きPE_magic + PE_header_size + PE_OPTHDR_entrypoint、PE マジックがファイル内で最初に出現した「PE」文字列の位置を調べました。その位置でアドレス 0x1000 を見つけましたが、ファイルの長さは 0x600 しかありません。それで、私は正しい位置にいますか、それともエントリポイント (ちなみに 0x200 にあります) のアドレスが正しく設定されていませんか?

ファイルの内容とコードの画像を含めています。

0x55 は PUSH EBP を意味し、0x5D は POP EBP を意味します。

コード (プロジェクトのプロパティで、標準ライブラリの追加をオフにしました):

int main() {
    int a = 0;
    __asm {
        push ebp
        pop ebp
    }
}
4

1 に答える 1

2

ファイルに表示される内容は、メモリ内の内容と一致しません。ご覧のとおり、ファイル アライメントは $200 ですが、インメモリ セクション アライメントは $1000 です。これは通常、ファイルが表す画像よりもパディングが少ないことを意味します。

さらに重要なことに、.text のセクション テーブル エントリの相対仮想アドレスは $1000 (イメージ ベースを基準) ですが、生アドレスは $200 (ファイルの先頭を基準) であることがわかります。特定のものがどこにあるかを示すほとんどすべてのフィールドは RVA のものです。つまり、参照するもののオフセットを Image Base からメモリに格納します。

いいえ、アドレスが正しく設定されていません。.text は $1000 (イメージ ベースに対して) から始まり、エントリ ポイントが指している場所です。

于 2013-03-09T12:50:24.933 に答える