kobadbadbadbadbad

モチベ維持

PEファイル

PE(Portable Executable) File

Structure

構造例

f:id:kobadlve:20161102142319p:plain

ヘッダには多くの情報が格納されているがその中でも重要なものを説明

PE Header

f:id:kobadlve:20161102142332p:plain

詳しくはMicroSoftの資料参考

  1. MZ スタブ
  2. MS-DOS上で実行可能なプログラム形式
  3. シグネチャの先頭オフセット(0x3C)が格納
  4. シグネチャは 'PE(0x50 0x45)'
  5. COFF ファイルヘッダ
  6. 構造
  typedef struct _IMAGE_FILE_HEADER {
    WORD Machine;
    WORD NumberOfSections;
    DWORD TimeDateStamp;
    DWORD PointerToSymbolTable;
    DWORD NumberOfSymbols;
    WORD SizeOfOptionalHeader;
    WORD Characteristics
  } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;
  • 実行環境とかを表す(Machine = 0x14C -> Intel386以降)
  • オプションヘッダ
  • プログラムが実行される上での基本的な情報を記す
  • SizeOfCode -> プラグラムコードのあるセクションのサイズ
  • AddressOfEntryPoint -> 最初に実行されるプログラムコードのイメージ相対アドレス(RVA)
  • BaseOfCode -> プログラムコードを格納するセクションの先頭のイメージ相対アドレス
  • ImageBase -> 実行ファイルがメモリに書き込まれた時の正しい先頭アドレスで、EXEなら0x400000, DLLなら0x10000000
  • など
  • セクションテーブル
  • プログラムコード、データ、リソースなどを格納する各セクションの構造を示す情報が並ぶ
  • 代表セクション
    • .text -> プログラムコード
    • .edata -> 関数などのエクスポートデータ
    • .idata -> 関数などのインポートデータ
    • .data -> 初期化されたデータ
    • .bss -> 初期化されてないデータ
    • .rsrc -> リソース

IAT (Import Address Table)

プログラムで使用するAPI関数のプログラムコード開始位置のアドレスを格納したテーブル

DLL (Dynamic Link Library)

プログラムに動的にリンクするライブラリ

単体では動かない

実行ファイル内にあらかじめどのDLLがどの関数を使うかの情報を格納しておくことがおおい。実行途中に指定することも可能。LoadLibrary関数を使う

OSからアプリケーションへAPI関数を提供するインターフェイスとも言える

資料