Boost」など、さまざまなカンファレンスを企画・運営しています。BOOKS(コードジン・ブックス)は、CodeZineの連載からカットアップした、開発現場の課題解決に役立つ書籍シリーズです。2006/06/30C++Windowsポスト本連載では、EXEファイルの内部構造について解説していきます。EXEファイルに関する日本語の資料が少ないのが現状です。筆者自身の経験を踏まえ、実際にEXEファイルの解析ができるようになるための資料となるよう解説していきます。第3回となる今回は、PEヘッダの後に配置されているセクションについて解説します。3リソースセクション(.rsrc)リソースとはリソースディレクトリテーブルリソースデータエントリバイナリデータおわりにはじめに前回で解説したPEヘッダに引き続き、今回もEXEファイル内のデータフォーマットの一部分「セクション」に関する話題で突き進みます。それにしても、EXEファイルは調べ手に休ませる余地を与えません。PEヘッダという大きな構造体をクリアしたと思ったら、お次は複数個も存在するセクションが登場するのです。PEヘッダは大きくても1つしかなかったのでまだ良いのですが、セクションだけは更に細分化されたデータ構造を指定するため、少々厄介です。セクションにはデータサイズ・RVA(イメージベースからの相対オフセット)など、生データに関するより詳細な情報が保持されます。経験豊富な方はこのような文章を読んでお気づきかもしれませんが、薄い資料でセクションに関するリサーチを行うと、メモリダンプと睨めっこという状況に陥ります。筆者は数週間の間、セクション周りのメモリダンプと暮らしたことがあるので間違いありません!(こんなことを自慢しても、何の役にも立ちませんが...)セクションとはPEヘッダの後にネイティブコード、リソース情報、デバッグ情報など、必要に応じてさまざまなデータが配置されています。それらのデータは、種類ごとにセクションという区切りで格納されています。各セクションのファイル内の保存位置、またはメモリにロードされたときの位置はアライメントに従わなければならない点も注意しておきましょう。IMAGE_OPTIONAL_HEADER32構造体のFileAlignmentメンバに0x1000が設定されているときは、各セクションのファイルの保存位置は0x1000で割り切れる数になります。セクションヘッダ(IMAGE_SECTION_HEADER構造体)PEヘッダなどの後に続いて、ネイティブコード、リソース情報などの各セクションが配置される形になりますが、その前にセクションヘッダと呼ばれる、各セクションの「特徴」を示すための領域が存在します。ここで言う特徴とは、対象となるセクションがどのようなサイズで格納されているのか、読み込み専用であるのか、または書き込みもできるのか、実行可能な領域であるのかなどのことを指し、これらの情報はIMAGE_SECTION_HEADER構造体で指定できます。IMAGE_SECTION_HEADER構造体は、PEヘッダの直後にファイルアライメントを考慮しながら配置されます。IMAGE_SECTION_HEADER構造体はセクションの数だけ数珠つながりのように存在します。セクションが3つ存在する場合は、1つ目のIMAGE_SECTION_HEADER構造体2つ目のIMAGE_SECTION_HEADER構造体3つ目のIMAGE_SECTION_HEADER構造体1つ目のセクションデータ2つ目のセクションデータ3つ目のセクションデータという順序でEXEファイル内に格納されます。*PIMAGE_SECTION_HEADER;NameNameにはセクションの名前を指定します。一般的には次に挙げる名前が多く使われています。実際には第2回で解説したデータディクショナリからの指定アドレスでセクションの役割が決定するので、この名前は単なる参考値になります。スレッドごとの静的変数に関する情報VirtualSizeVirtualSizeはメモリ上におけるセクションのサイズです。SizeOfRawDataメンバの値よりも大きいときは、差分領域が0で埋め尽くされます。PointerToRawData次のVirtualAddressはメモリ上におけるセクションの位置であり、SizeOfRawDataはファイル上におけるセクションのサイズです。続く、PointerToRawDataはファイル上におけるセクションの位置です。PointerToRelocationsPointerToRelocationsは、再配置エントリ情報が格納されているファイル上の位置です。一般的なEXEファイルの場合は0です。PointerToLinenumbersPointerToLinenumbersは、行番号エントリ情報が格納されているファイル上の位置です。COFF行番号が存在しないときは0になります。NumberOfLinenumbersNumberOfRelocationsは再配置エントリの数です。一般的なEXEファイルの場合は0です。NumberOfLinenumbersは行番号エントリの数です。COFF行番号が存在しないときは0です。CharacteristicsCharacteristicsにはセクションの特性を指定します。次のフラグを組み合わせることで表現できます。セクションに実行コードが含まれています。セクションに初期化されたデータが含まれています。セクションに初期化されていないデータが含まれています。セクションに拡張された再配置が含まれています。セクションは必要があれば破棄できます。セクションはキャッシュできません。セクションはページングできません。セクションをメモリ中で共有できます。セクションをコードとして実行できます。セクションを読むことができます。セクションに書き込めます。ダイスケ)普段はActiveBasicと周辺ツールの開発を行っています。最近は諸先輩方を見習いながら勉強中の身。NEW1DMM.comの施策から見る、事業をむしばむ「技術負債」への処方箋──リファクタリングの「言語化」でインシデントを予防2企業の7割超が「2025年の崖」を理解していないことが明らかに。NEW1DMM.comの施策から見る、事業をむしばむ「技術負債」への処方箋──リファクタリングの「言語化」でインシデントを予防2企業の7割超が「2025年の崖」を理解していないことが明らかに。NEW1DMM.comの施策から見る、事業をむしばむ「技術負債」への処方箋──リファクタリングの「言語化」でインシデントを予防2企業の7割超が「2025年の崖」を理解していないことが明らかに。12:00法務担当者、6割超が今後業務で「生成AIを使用したい」と回答。新着記事一覧を見るイベント今後の予定を見るCodeZineは、株式会社翔泳社が運営するソフトウェア開発者向けのWebメディアです。「デベロッパーの成長と課題解決に貢献するメディア」をコンセプトに、現場で役立つ最新情報を日々お届けします。イラストの無断転載を禁じます。記載されているロゴ、システム名、製品名は各社及び商標権者の登録商標あるいは商標です。