詳細な目次へ

『実践マルウェア解析』への賛辞

「マルウェア解析の素晴らしい集中講座です。」
—Dino Dai Zovi, 独立セキュリティコンサルタント

「現代のマルウェアがもたらす特有の課題を理解するために必要なすべての重要なスキルを詳細にカバーした、最も包括的なマルウェア解析ガイドです。」
— Chris Eagle, コンピュータサイエンス講師, 海軍大学院

「マルウェア解析の実践的な入門書です。Windowsマルウェアを解析したいすべての人にお勧めします。」
— Ilfak Guilfanov,IDA Proの創設者

「マルウェア解析の素晴らしい入門書です。すべての章に詳細な技術説明と実際のマルウェアに即座に触れられる実習課題が含まれています。」
— Sebastian Porst, Googleソフトウェアエンジニア

「すべてのスキルレベルの読者にリバースエンジニアリングを提供します。技術的に豊かでアクセスしやすく、実習課題を通じてリバースエンジニアリングの芸術と科学を深く理解できるように導きます。初心者にも専門家にも強くお勧めします。」
— Danny Quist, PhD, Offensive Computing創設者

「唯一のマルウェア本を読むなら、またはマルウェア解析の世界に飛び込みたいなら、これが手に入れるべき本です。」
— Patrick Engbretson, ダコタ州立大学のIA教授, 『The Basics of Hacking and Pen Testing』の著者

「ソフトウェアセキュリティや侵入検知システムの高度な大学院レベルのコース教材に素晴らしい追加です。特に実習課題は、リバースエンジニアリング、解析、悪意あるソフトウェアの理解方法を学生に教えるのに役立ちます。」
— Sal Stolfo, コロンビア大学教授

WARNING

これはマルウェアについての本です。この本で紹介されているリンクやソフトウェアは悪意のあるものです。未知のコードを実行したり信頼できないURLを訪れたりする際は、十分に注意してください。

マルウェア解析のために安全な仮想環境を作成するヒントについては、第2章を参照してください。軽率な行動は避け、環境をしっかりと保護しましょう。

実践的マルウェア解析
悪意のあるソフトウェアを分析するための実践ガイド
マイケル・シコースキー、アンドリュー・ホニッグ著
サンフランシスコより

「実践マルウェア解析」。著作権 © 2012 マイケル・シコースキーおよびアンドリュー・ホニッグFor information on book distributors or translations, please contact No Starch Press, Inc. directly。

すべての権利を保有します。本書の一部または全部を、電子的、機械的手段を問わず、複製、伝送することはできません。これには、コピー、録音、情報の保存や検索システムを含みます。ただし、著作権者および出版社の事前の書面による許可がある場合は除きます。

16 15 14 13 12   1 2 3 4 5 6 7 8 9

ISBN-10: 1-59327-290-1
ISBN-13: 978-1-59327-290-6

出版社: William Pollock
制作編集者: Alison Law
表紙イラスト: Hugh D’Andrade
内部デザイン: Octopod Studios
開発編集者: William Pollock と Tyler Ortman
技術レビュアー: Stephen Lawler
コピーエディター: Marilyn Smith
組版者: Riley Hoffman
校正者: Irene Barnard
索引作成者: Nancy Guenther

書籍の販売元や翻訳に関する情報については、No Starch Press, Inc. に直接お問い合わせください:

No Starch Press, Inc.
38 Ringold Street, San Francisco, CA 94103
電話: 415.863.9900; ファックス: 415.863.9950; info@nostarch.com; www.nostarch.com

米国議会図書館の出版データ
この本のカタログ記録は米国議会図書館から入手できます。

No Starch PressおよびNo Starch Pressのロゴは、No Starch Press, Inc.の登録商標です。本書に記載されているその他の製品および会社名は、それぞれの所有者の商標である可能性があります。商標名のすべての使用箇所に商標記号を付ける代わりに、編集目的でのみ名前を使用し、商標権を侵害する意図はありません。

本書の情報は「現状のまま」提供されており、保証はありません。本書の準備にあたり細心の注意を払いましたが、著者およびNo Starch Press, Inc.は、本書に含まれる情報に起因または関連して直接的または間接的に生じたとされるいかなる損失や損害についても、いかなる責任も負いません。

簡単な内容

著者について

リチャード・ベイトリックによる序文

謝辞

イントロダクション

第0章: マルウェア分析の入門

第1部: 基本分析

第1章: 基本的な静的技術

第2章: 仮想マシンでのマルウェア分析

第3章: 基本的な動的分析

第2部: 高度な静的分析

第4章: x86逆アセンブルの速習

第5章: IDA Pro

第6章: アセンブリでCコードの構造を認識する

第7章: 悪意のあるWindowsプログラムの分析

第3部: 高度な動的分析

第8章: デバッグ

第9章: OllyDbg

第10章: WinDbgを用いたカーネルデバッグ

第4部: マルウェアの機能

第11章: マルウェアの挙動

第12章: 秘密裏にマルウェアを起動する方法

第13章: データのエンコード

第14章: マルウェアに特化したネットワークシグネチャ

第5部: リバースエンジニアリング対策

第15章: 逆アセンブル対策

第16章: デバッグ対策

第17章: 仮想マシン対策

第18章: パッカーとアンパッキング

第6部: 特別トピック

第19章: シェルコード解析

第20章: C++解析

第21章: 64ビットマルウェア

付録A: 重要なWindows関数

付録B: マルウェア解析ツール

付録C: 実習問題の解答

索引

内容の詳細

著者について
テクニカルレビュアーについて
寄稿者について

リチャード・ベイトリックによる序文

謝辞
個別の感謝

イントロダクション
マルウェア解析とは?
前提条件
実践的なハンズオン学習
本書の内容

0
マルウェア分析の入門
マルウェア解析の目的
マルウェア解析の技術
基本的な静的解析
基本的な動的解析
高度な静的解析
高度な動的解析
マルウェアの種類
マルウェア解析の一般的なルール

第1部
基本分析

1
基本的な静的技術
ウイルス対策スキャン: 役立つ最初のステップ
ハッシュ化:マルウェアの指紋
文字列の検出
パッキングおよび難読化されたマルウェア
ファイルのパッキング
PEiDによるパッカーの検出
ポータブル実行ファイル形式
リンクされたライブラリおよび関数
静的リンク、ランタイムリンク、および動的リンク
Dependency Walker を使用して動的にリンクされた関数の探索
インポートされた関数
エクスポートされた関数
実践的な静的解析
PotentialKeylogger.exe:アンパックされた実行ファイル
PackedProgram.exe:行き詰まり
PE ファイルのヘッダーとセクション
PEview を使った PE ファイルの検査
Resource Hacker でリソースセクションを表示
その他の PE ファイルツールの使用
PE ヘッダーの概要
結論
演習

2
仮想マシンでのマルウェア分析
仮想マシンの構造
マルウェア分析用マシンの作成
VMware の設定
マルウェア分析用マシンの使用
マルウェアをインターネットに接続する
周辺機器の接続と切断
スナップショットの取得
仮想マシンからのファイル転送
マルウェア分析における VMware 使用のリスク
記録/再生:コンピュータを逆方向に動かす
結論

3
基本的な動的分析
サンドボックス:簡易的アプローチ
マルウェアサンドボックスの使用
サンドボックスの欠点
マルウェアの実行
Process Monitor を使った監視
Procmon の表示
Procmon でのフィルタリング
Process Explorer でのプロセス表示
Process Explorer の表示
検証オプションの使用
文字列の比較
Dependency Walker の使用
悪意のある文書の分析
Regshot を使ったレジストリスナップショットの比較
ネットワークの偽装
ApateDNSの使用
Netcatによる監視
Wiresharkによるパケットスニッフィング
INetSimの使用
基本的な動的ツールの実践
結論
演習

第2部
高度な静的解析

4
X86逆アセンブリのクラッシュコース
抽象化のレベル
リバースエンジニアリング
x86アーキテクチャ
主記憶装置
命令
オペコードとエンディアンネス
オペランド
レジスタ
簡単な命令
スタック
条件文
分岐
Rep命令
Cのメインメソッドとオフセット
詳細情報: Intel x86アーキテクチャマニュアル
結論

5
IDA PRO
実行可能ファイルの読み込み
IDA Proのインターフェース
逆アセンブリウィンドウモード
分析に役立つウィンドウ
デフォルトビューに戻る
IDA Proのナビゲーション
検索
クロスリファレンスの使用
コードのクロスリファレンス
データのクロスリファレンス
関数の分析
グラフオプションの使用
逆アセンブルの強化
場所の名前変更
コメント
オペランドのフォーマット
名前付き定数の使用
コードとデータの再定義
プラグインによるIDAの拡張
IDCスクリプトの使用
IDAPythonの使用
商用プラグインの使用
結論
実習

6
アセンブリでCコード構造を認識する
グローバル変数とローカル変数
算術演算の逆アセンブル
if文の認識
IDA Proを用いた関数のグラフィカルな分析
ネストされたif文の認識
ループの認識
forループの検出
whileループの検出
関数呼び出し規約の理解
cdecl
stdcall
fastcall
プッシュ対ムーブ
switch文の分析
Ifスタイル
ジャンプテーブル
配列の逆アセンブル
構造体の識別
リンクリストのトラバーサルの分析
結論
実習

7
悪意のあるWindowsプログラムの分析
Windows API
型とハンガリアン記法
ハンドル
ファイルシステム関数
特殊ファイル
Windowsレジストリ
レジストリのルートキー
レジストリエディタ
自動的に実行されるプログラム
一般的なレジストリ関数
実際のレジストリ コードの分析
.regファイルを使用したレジストリスクリプト
ネットワーキングAPI
Berkeley互換ソケット
ネットワーキングのサーバーとクライアント側
WinINet API
実行中のマルウェアの追跡
DLL
プロセス
スレッド
Mutexを使用したプロセス間の調整
サービス
コンポーネントオブジェクトモデル
例外:問題が発生したとき
カーネルモードとユーザーモード
ネイティブAPI
結論
演習

第3部
高度な動的解析

8
デバッグ
ソースレベルとアセンブリレベルのデバッガー
カーネルモードとユーザーモードのデバッグ
デバッガーの使用
シングルステップ実行
ステップオーバーとステップイント
ブレークポイントでの実行停止
例外
ファーストチャンス例外とセカンドチャンス例外
一般的な例外
デバッガーでの実行修正
実践でのプログラム実行の修正
結論

9
OLLYDBG
マルウェアのロード
実行ファイルのオープン
実行中のプロセスにアタッチ
OllyDbgインターフェース
メモリマップ
リベース
スレッドとスタックの表示
コードの実行
ブレークポイント
ソフトウェアブレークポイント
条件付きブレークポイント
ハードウェアブレークポイント
メモリブレークポイント
DLLの読み込み
トレース
標準バックトレース
コールスタック
ラントレース
ポイズンアイビーのトレース
例外処理
パッチ適用
シェルコードの解析
支援機能
プラグイン
OllyDump
デバッガーの隠蔽
コマンドライン
ブックマーク
スクリプトデバッグ
結論
演習

10
WINDBG を使用したカーネルのデバッグ
ドライバーとカーネルコード
カーネルデバッグのセットアップ
WinDbgの使用
メモリからの読み取り
算術演算子の使用
ブレークポイントの設定
モジュールのリスト化
マイクロソフトのシンボル
シンボルの検索
構造体情報の表示
Windowsシンボルの設定
実践的なカーネルデバッグ
ユーザースペースコードの確認
カーネルモードコードの確認
ドライバーオブジェクトの検索
ルートキット
実践的なルートキット分析
割り込み
ドライバーの読み込み
Windows Vista、Windows 7、およびx64バージョンのカーネル問題
結論
演習

第4部
マルウェアの機能

11
マルウェアの挙動
ダウンローダーとランチャー
バックドア
リバースシェル
RATs(リモートアクセスツール)
ボットネット
RATsとボットネットの比較
資格情報の窃取
GINAインターセプション
ハッシュダンピング
キーストロークのロギング
永続化メカニズム
Windowsレジストリ
トロイの木馬化されたシステムバイナリ
DLLロードオーダーハイジャック
特権昇格
SeDebugPrivilegeの使用
痕跡を隠す—ユーザーモードルートキット
IATフッキング
インラインフッキング
結論
演習

12
隠れたマルウェアの起動
ランチャー
プロセスインジェクション
DLLインジェクション
直接インジェクション
プロセス置換
フックインジェクション
ローカルフックとリモートフック
フックを使用したキーロガー
SetWindowsHookExの使用
スレッドターゲティング
デトアーズ
APCインジェクション
ユーザースペースからのAPCインジェクション
カーネルスペースからのAPCインジェクション
結論
演習

13
データエンコーディング
エンコーディングアルゴリズムの分析の目的
単純な暗号
シーザー暗号
XOR
その他の単純なエンコーディングスキーム
Base64
一般的な暗号アルゴリズム
文字列とインポートの認識
暗号定数の検索
高エントロピーコンテンツの検索
カスタムエンコーディング
カスタムエンコーディングの特定
攻撃者にとってのカスタムエンコーディングの利点
デコード
セルフデコード
デコード関数の手動プログラミング
汎用復号のためのインスツルメンテーションの使用
結論
演習

14
マルウェアに焦点を当てたネットワーク署名
ネットワーク対策
マルウェアを自然な環境で観察する
悪意のある活動の兆候
OPSEC = 操作セキュリティ
攻撃者を安全にオンラインで調査する
間接戦術
IPアドレスとドメイン情報の取得
コンテンツベースのネットワーク対策
Snortを使用した侵入検知
詳細な検査
動的分析と静的分析技術の組み合わせ
過剰分析の危険性
目立たずに隠れる
周囲のコードの理解
ネットワークコードの発見
ネットワークコンテンツのソースを知る
ハードコーディングされたデータ vs. エフェメラルデータ
エンコーディングステップの特定と活用
署名の作成
解析ルーチンの分析
複数の要素をターゲットにする
攻撃者の視点を理解する
結論
演習

第5部
逆コンパイル防止

15
逆アセンブル防止
逆アセンブル防止の理解
逆アセンブルアルゴリズムの攻略
リニア逆アセンブル
フロー指向の逆アセンブル
逆アセンブル防止の技術
同じターゲットを持つジャンプ命令
定数条件を持つジャンプ命令
不可能な逆アセンブル
IDA Proで命令をNOP化する
フロー制御の隠蔽
関数ポインタの問題
IDA Proで不足しているコードのクロスリファレンスを追加する
リターンポインタの悪用
構造化例外ハンドラの誤用
スタックフレーム解析の妨害
スタックフレーム解析の妨害
結論
演習

16
デバッグ防止
Windowsデバッガー検出
Windowsデバッガー検出
Windows APIの使用
構造体の手動チェック
システム残留物のチェック
デバッガーの挙動の識別
INTスキャン
コードチェックサムの実行
タイミングチェック
デバッガー機能の妨害
TLSコールバックの使用
例外の使用
割り込みの挿入
デバッガーの脆弱性
PEヘッダの脆弱性
出力デバッグ文字列の脆弱性
結論
演習

17
仮想マシン対策技術
VMwareのアーティファクト
VMwareのアーティファクト
VMwareアーティファクト検索の回避
メモリアーティファクトのチェック
脆弱な命令
Red Pill Anti-VMテクニックの使用
No Pillテクニックの使用
I/O通信ポートのクエリ
str命令の使用
Anti-VM x86命令
IDA ProでのAnti-VMのハイライト
ScoopyNGの使用
設定の調整
仮想マシンからの脱出
結論
演習

18
パッカーズとアンパッキング
パッカーの解剖
アンパッキングスタブ
実行ファイルの読み込み
インポートの解決
テールジャンプ
アンパッキングの図解
パックされたプログラムの識別
パックされたプログラムの指標
エントロピー計算
アンパッキングのオプション
自動アンパッキング
手動アンパッキング
Import Reconstructorを使用したインポートテーブルの再構築
OEPの特定
手動でのインポートテーブルの修復
一般的なパッカーのためのヒントとトリック
UPX
PECompact
ASPack
Petite
WinUpack
Themida
完全にアンパックせずに分析
パックされたDLLM
結論
演習

第6部
特別なトピック

19
シェルコード解析
解析のためのシェルコードの読み込み
位置に依存しないコード
実行場所の特定
call/popの使用
fnstenvの使用
手動でのシンボル解決
メモリ内のkernel32.dllの特定
PEエクスポートデータの解析
ハッシュされたエクスポート名の使用
完全なHello Worldの例
シェルコードのエンコーディング
NOPスレッド
シェルコードの発見
結論
演習

20
C++解析
オブジェクト指向プログラミング
thisポインタ
オーバーロードとマングリング
継承と関数のオーバーライド
仮想関数と非仮想関数
Vテーブルの使用
Vテーブルの認識
オブジェクトの作成と破壊
結論
演習

21
64ビットマルウェア
なぜ64ビットマルウェアか?
x64アーキテクチャの違い
x64呼び出し規約とスタックの使用の違い
64ビット例外処理
Windows 64ビット上の32ビットWindows
64ビットのマルウェア機能のヒント
結論
演習

A
重要なWindows関数

B
マルウェア解析ツール

C
演習向けのソリューション

Lab 1-1
Lab 1-2
Lab 1-3
Lab 1-4
Lab 3-1
Lab 3-2
Lab 3-3
Lab 3-4
Lab 5-1
Lab 6-1
Lab 6-2
Lab 6-3
Lab 6-4
Lab 7-1
Lab 7-2
Lab 7-3
Lab 9-1
Lab 9-2
Lab 9-3
Lab 10-1
Lab 10-2
Lab 10-3
Lab 11-1
Lab 11-2
Lab 11-3
Lab 12-1
Lab 12-2
Lab 12-3
Lab 12-4
Lab 13-1
Lab 13-2
Lab 13-3
Lab 14-1
Lab 14-2
Lab 14-3
Lab 15-1
Lab 15-2
Lab 15-3
Lab 16-1
Lab 16-2
Lab 16-3
Lab 17-1
Lab 17-2
Lab 17-3
Lab 18-1
Lab 18-2
Lab 18-3
Lab 18-4
Lab 18-5
Lab 19-1
Lab 19-2
Lab 19-3
Lab 20-1
Lab 20-2
Lab 20-3
Lab 21-1
Lab 21-2

索引

著者について

マイケル・シコースキは、Mandiantのコンピューターセキュリティコンサルタントです。彼はインシデント対応調査を支援するために悪意のあるソフトウェアを逆コンパイルし、連邦政府のクライアントに対して専門的な研究開発のセキュリティソリューションを提供しています。Mikeはマルウェア分析の一連のコースを作成し、FBIやBlack Hatなど、さまざまな聴衆にこれらを教えています。彼はMITリンカーン研究所からMandiantに移り、そこではパッシブネットワークマッピングとペネトレーションテストの研究を行っていました。また、MikeはNSAの3年間のシステムおよびネットワーク学際プログラム(SNIP)の卒業生でもあります。NSA在籍中に、彼は逆コンパイル技術の研究に貢献し、ネットワーク分析の分野で複数の発明賞を受賞しました。

アンドリュー・ホニグは国防総省の情報保証の専門家です。彼は、国家暗号学学校でソフトウェア分析、リバースエンジニアリング、Windowsシステムプログラミングのコースを教えており、認定情報システムセキュリティ専門家です。アンディは、VMwareの仮想化製品に関する複数のゼロデイ脆弱性を公に発見したことで知られており、カーネル内の悪意あるソフトウェアを含む革新的な悪意あるソフトウェアを検出するツールを開発しました。悪意あるソフトウェアと無害なソフトウェアの両方の分析と理解の専門家であり、コンピュータセキュリティ業界で10年以上のアナリスト経験があります。

テクニカルレビュアーについて

スティーブン・ローラーは、小規模なコンピュータソフトウェアおよびセキュリティコンサルティング会社の創設者兼社長です。スティーブンは情報セキュリティ分野で7年以上にわたり積極的に活動しており、主にリバースエンジニアリング、マルウェア解析、脆弱性研究に従事しています。彼はマンディアントのマルウェア解析チームのメンバーであり、複数のフォーチュン100企業に影響を及ぼした高プロファイルなコンピュータ侵入事件の対応を支援しました。以前は、マンテック・インターナショナルのセキュリティ&ミッションアシュアランス(SMA)部門で勤務し、ソフトウェア保証活動の一環として多くのゼロデイ脆弱性やソフトウェアエクスプロイト手法を発見しました。コンピュータセキュリティとは無関係だった以前の職歴では、米海軍のSMMTTプログラムのソナーシミュレータコンポーネントの主任開発者を務めていました。

寄稿者について

ニック・ハーバーは、Mandiant社のマルウェアアナリストであり、リバースエンジニアリングの分野で経験豊富なベテランです。彼の情報セキュリティにおける13年のキャリアは、国防総省コンピューターフォレンジック研究所でのコンピューターフォレンジック試験官および研究者として始まりました。過去6年間、NickはMandiantに所属し、主にマルウェア分析に注力してきました。彼は、リバースエンジニアリング防止技術の分野で研究を行っており、PE-Scramblerなどのパッカーやコード難読化ツールをいくつか作成しています。彼はBlack HatやDefconで何度もリバースエンジニアリング防止技術やアンチフォレンジック技術に関する発表を行ってきました。また、Black Hatの高度なマルウェア分析コースの主要開発者および講師でもあります。

リンジー・ラックは、Mandiantのテクニカルディレクターであり、情報セキュリティ分野で12年以上の経験を持ち、マルウェアのリバースエンジニアリング、ネットワーク防御、およびセキュリティオペレーションを専門としています。彼は、セキュリティオペレーションセンターの設立と運営に貢献し、ネットワーク防御の研究を主導し、安全なホスティングソリューションを開発しました。以前は、National Information Assurance Research Laboratory、大統領行政府(EOP)、Cable and Wireless、および米軍で勤務していました。スタンフォード大学でコンピュータサイエンスの学士号を取得しているほか、海軍大学院で情報保証を専門とするコンピュータサイエンスの修士号も取得しています。

ジェロルド "ジェイ" スミスは、Mandiantの主任コンサルタントであり、マルウェアのリバースエンジニアリングおよびフォレンジック分析を専門としています。この役職では、フォーチュン500企業を含む多様なクライアントを支援する多くのインシデント対応に貢献してきました。Mandiantに参加する前は、NSA(国家安全保障局)に勤務していましたが、その詳細について話すことは許されていません。ジェイは、カリフォルニア大学バークレー校で電気工学とコンピューターサイエンスの学士号を取得し、ジョンズ・ホプキンス大学でコンピューターサイエンスの修士号を取得しています。

序文

デジタルセキュリティの分野の中でも、マルウェア、防御ツール、オペレーティングシステムに関わる領域ほど非対称性が顕著なものは少ないでしょう。
 2011年の夏、私はネバダ州ラスベガスで開催されたブラックハットカンファレンスで、ピーテル(マッジ)ザトコの基調講演に参加しました。彼の講演では、現代のソフトウェアの非対称性が紹介されました。マッジは9,000個のマルウェアバイナリを分析し、サンプルセットの平均コード行数(LOC)が125行であると説明しました。
 マッジのサンプルには「単純な」または「平凡な」マルウェアしか含まれていないと主張するかもしれません。では、真に「武器化」されたマルウェア、例えば(息を止めて)Stuxnetはどうでしょうか?ラリー・L・コンスタンティンによれば、Stuxnetは約15,000行のコードを含み、125行の平均的なマルウェアサンプルの120倍のサイズです。Stuxnetは高度に専門化され、標的に特化していたため、平均より大きなサイズだったのでしょう。
 マルウェアの世界を少し離れて、私が使用しているテキストエディタ(GNOMEテキストエディタのgedit)は、gedit.cに295行のコードが含まれており、gedit.cは128個のソースファイル(さらに3つのディレクトリ)中の1つに過ぎません。

1.http://www.informit.com/articles/article.aspx?p=1686289

GNOME GITリポジトリのgeditソースコードにおいて、128のファイルと3つのディレクトリをすべてカウントすると、合計で70,484行のコード(LOC)があります。正当なアプリケーションのLOCとマルウェアの比率は500対1を超えています。テキストエディタのような比較的単純なツールと比べると、平均的なマルウェアは非常に効率的です。
 Mudgeの125 LOCという数字は私には少し低く感じられました。なぜなら、「マルウェア」の定義はさまざまで、多くの悪意のあるアプリケーションは複数の機能やインフラ要素を含む「スイート」として存在するからです。このようなマルウェアを捉えるために、Zeusトロイの木馬のソース要素(.cpp、.obj、.hなど)をカウントし、253,774 LOCを得ました。Mudgeの平均的なサンプルと比較すると、この比率は2,000対1を超えます。
 次に、MudgeはマルウェアのLOCを、それを防ぐためのセキュリティ製品のLOCと比較しました。彼は現代の防御製品に見られるLOCを1,000万と見積もりました。計算を簡単にするために、少なくとも1,250万行のコードを持つ製品があると仮定し、攻撃のLOCと防御のLOCの比率を100,000対1としました。つまり、攻撃側の1 LOCに対して、防御側は100,000 LOCのコードを書くことになります
 また、MudgeはマルウェアのLOCを、それが標的とするオペレーティングシステムのLOCと比較しました。アナリストは、Windows XPは4500万行のコードで構築されていると見積もっており、Windows 7に何行のコードが使われているかは不明です。Mudgeは現代のオペレーティングシステムのコード量を1億5000万行と見積もっていましたが、計算を簡単にするために1億2500万行に修正すると、ターゲットのオペレーティングシステムのサイズとそれを攻撃するマルウェアのサイズの比率は100万対1になります。
 LOCカウント演習から得られた視点をまとめましょう:

  120:1 スタックスネットと一般的なマルウェア
  500:1 シンプルなテキストエディタと一般的なマルウェア
  2,000:1 マルウェアスイートと一般的なマルウェア
  100,000:1 防御ツールと一般的なマルウェア
  1,000,000: ターゲットとなるオペレーティングシステムと一般的なマルウェア

 防御者の観点から見ると、防御ツールや対象のオペレーティングシステムの比率と平均的なマルウェアサンプルの数の関係はかなり厳しいものに見えます。マルウェアスイートのサイズを平均サイズに置き換えても、防御者の状況が大きく改善されるわけではなさそうです。防御者(およびそのベンダー)は、数千行のコードを作成するために多大な労力を費やしているのに、それがずる賢い侵入者によって少ない行数で粉砕されてしまうようです。
 防御者はどうすればいいのでしょうか?答えは、数で劣勢に立たされている指導者が使う戦術を参考にすることです。つまり、「障害」を「機会」として再定義するのです。防御ツールや対象オペレーティングシステムのサイズを気にするのはやめましょう。それらについてできることはあまりありません。マルウェアサンプルが(相対的に見て)小さいことを喜びましょう。

2.http://git.gnome.org/browse/gedit/tree/gedit?id=3.3.1

 ソースコードレベルで防御ツールがどのように機能するかを理解しようとすることを想像してみてください。その12.5百万行のコード(LOC)に向き合うのは大変な作業です。一部の研究者はこのようなペットプロジェクトに取り組んでいます。驚くべき例として、Tavis Ormandyによる「Sophail: A Critical Analysis of Sophos Antivirus」を読んでみてください。この分析は2011年にBlack Hat Las Vegasでも発表されました。このような巨大な分析は例外であり、一般的ではありません。
 数百万行(あるいは数十万行、数万行)のコードを気にする代わりに、1000行以下の領域に集中しましょう。ここには世界のマルウェアの重要な部分が見つかります。防御者としての主な目標は、マルウェアが何をするか、それがどのように環境に現れるか、そしてそれにどう対処するかを判断することです。適切なサイズのサンプルとスキルを持っていれば、これらの質問に答え、企業のリスクを減らすことができます。
 マルウェアの作者がサンプルを提供する準備ができているなら、この本の著者たちはスキルを提供する準備ができています。『Practical Malware Analysis』は、すべてのマルウェアアナリストが手元に置くべき本だと思います。初心者であれば、戦いに参加するために必要な入門的な実践的な資料を読むことができます。中級者であれば、次のレベルに進むための内容が見つかります。上級エンジニアであれば、さらに高みを目指すための貴重な情報が見つかり、メンターする際には「この優れたマニュアルを読んで」と言えるでしょう。
 『Practical Malware Analysis』は実際には二冊の本が一つになっています。まず、現代のマルウェアを分析する方法を読者に示すテキストです。この理由だけで本を購入しても大いに役立ちます。しかし、著者たちはさらに一歩進んで実質的に第二の本を書きました。この追加の本は「Applied Malware Analysis」と呼ばれるべきもので、各章の終わりと付録Cに掲載された演習、短い回答、詳細な調査が含まれています。また、著者たちは例として使用するすべてのマルウェアを自ら作成しており、学習のための豊かで安全な環境を提供しています。
 デジタル防御者が直面する一見不利な状況に絶望する代わりに、現在のマルウェアの形に感謝しましょう。『Practical Malware Analysis』のような本を手にすれば、企業やクライアントの侵入をより良く検知し対応するための優位性を持つことができます。著者たちはこの分野の専門家であり、前線から抽出されたアドバイスが提供されています。理論的な研究室で考え出されたものではありません。この本を楽しんで読み、リバースエンジニアリングして詳細に調べたマルウェアの一つ一つが、相手の暗黒技術を知識の光にさらすことで相手のコストを上げることを知ってください。

    リチャード・ベイトリッチ(@taosecurity)
    Mandiantの最高セキュリティ責任者およびTaoSecurityの創設者
    バージニア州マナサスパーク
    2012年1月2日

3. http://dl.packetstormsecurity.net/papers/virus/Sophail.pdf

謝辞

リンジー・ラック、ニック・ハーバー、ジェロルド “ジェイ” スミスには、それぞれの専門分野での章の執筆に貢献していただきましたことを感謝いたします。
また、技術レビュアーのスティーブン・ローラーには、50以上のラボとすべての章を単独でレビューしていただき、感謝の意を表します。セス・サマーセット、ウィリアム・バレンシン、スティーブン・デイビスには、この本のためにコードを提供していただき、ありがとうございます。
 特別な感謝を、No Starch Pressの皆さんに捧げます。アリソン、ビル、トラビス、タイラー、そしてNo Starch Pressの他の皆さんと共に仕事ができたことを嬉しく思います。

個別の感謝

Mike:この本をレベッカに捧げます。こんなにも支えてくれて愛してくれる人がいるおかげで、この本を完成させることができました。
Andy:最高の家族でいてくれるモリー、クレア、そしてエロイーズに感謝します。

イントロダクション

電話が鳴り、ネットワークチームからあなたがハッキングされ、顧客の機密情報がネットワークから盗まれていると告げられます。あなたは調査を開始し、関与しているホストを特定するためにログを確認します。ホストをウイルス対策ソフトでスキャンし、幸運にもTROJ.snapAKというトロイの木馬が検出されます。ファイルを削除してクリーンアップを試み、ネットワークキャプチャを使用して他のマシンが感染していないことを確認するための侵入検知システム(IDS)のシグネチャを作成します。その後、攻撃者が侵入に使用したと考えられる穴を修正し、再発を防止します。
 しかし、数日後にネットワークチームが再び現れ、機密データが再びネットワークから盗まれていると告げられます。これは同じ攻撃のように見えますが、どうすれば良いのか分かりません。明らかに、IDSシグネチャは失敗し、さらに多くのマシンが感染しており、ウイルス対策ソフトも脅威を隔離するための十分な保護を提供していません。上層部は何が起こったのか説明を求めており、あなたが答えられるのはマルウェアがTROJ.snapAKだったということだけです。最も重要な質問に答えられず、ちょっと情けない状態です。
 正確にTROJ.snapAKが何をするのかをどのように特定し、その脅威を排除するのでしょうか? より効果的なネットワークシグネチャをどのように作成しますか? 他のマシンがこのマルウェアに感染しているかどうかをどのように確認しますか? マルウェアパッケージ全体を削除したことをどうやって確認しますか? マルウェアが何をするのかについて管理者の質問にどう答えますか?
 自分のネットワークを保護できないため、高額な外部コンサルタントを雇う必要があると上司に伝えるしかありません。それは仕事を守るための最良の方法ではありません。
 しかし、幸いなことに、あなたは『実践マルウェア分析』のコピーを手に入れる賢明さを持っていました。この本で学ぶスキルは、これらの難しい質問に答える方法を教え、ネットワークをマルウェアから守る方法を示してくれます。

マルウェア解析とは?

悪意のあるソフトウェア、つまりマルウェアは、多くのコンピュータ侵入やセキュリティインシデントに関与しています。ユーザー、コンピュータ、またはネットワークに害を与える行為をするソフトウェアはすべてマルウェアと見なされます。これには、ウイルス、トロイの木馬、ワーム、ルートキット、スケアウェア、スパイウェアなどが含まれます。これらの様々なマルウェアは、それぞれ異なることを行いますが(本書を通じて詳しく説明します)、マルウェア分析者として、私たちはマルウェアを分析するための基本的なツールや技術を持っています。
 マルウェア分析とは、マルウェアを分解してその動作、識別方法、対策や排除方法を理解する技術です。マルウェア分析を行うために超一流のハッカーである必要はありません。
 世の中には何百万もの悪意のあるプログラムが存在し、毎日新しいものが発見されています。そのため、コンピュータセキュリティインシデントに対応する人々にとってマルウェア分析は非常に重要です。また、マルウェア分析の専門家が不足しているため、熟練したマルウェア分析者の需要は非常に高いです。
 ただし、本書はマルウェアの発見方法についてのものではありません。私たちの焦点は、一度発見されたマルウェアの分析方法にあります。私たちは、今日最も一般的に使用されているオペレーティングシステムであるWindows上で見つかったマルウェアに焦点を当てていますが、ここで学ぶスキルは、他のオペレーティングシステムのマルウェアを分析する際にも役立ちます。また、最も一般的であり、かつ遭遇するのが最も困難なファイルである実行可能ファイルに焦点を当てています。同時に、悪意のあるスクリプトやJavaプログラムの議論は避けています。その代わりに、バックドア、隠れたマルウェア、ルートキットなどの高度な脅威を解剖するための方法に深く踏み込んでいます。

前提条件

どのような背景やマルウェア分析の経験があるかに関わらず、この本には有益な情報が見つかるでしょう。
 第1章から第3章では、セキュリティやプログラミングの経験がない人でも使用できる基本的なマルウェア分析技術について説明しています。第4章から第14章では、中級者向けの内容を扱っており、ほとんどの悪意あるプログラムを分析するために必要な主要なツールやスキルを身につけることができます。これらの章は、ある程度のプログラミングの知識を必要とします。第15章から第19章では、より高度な内容が取り扱われており、アンチ逆アセンブルやアンチデバッグ、パッキング技術を利用した非常に高度な悪意あるプログラムを分析するための戦略や技術が説明されています。これらは熟練したマルウェア分析者にとっても有用です。
 この本では、様々なマルウェア分析技術をどのように、そしていつ使用するかを教えます。特定の技術を使用するタイミングを理解することは、その技術自体を知っていることと同じくらい重要です。なぜなら、間違った状況で間違った技術を使用すると、時間を無駄にするだけでなく、フラストレーションを引き起こす可能性があるからです。すべてのツールをカバーするわけではありません。ツールは常に変化するため、重要なのはコアスキルだからです。また、本書では現実的なマルウェアのサンプルを使用しており、これらは以下のウェブサイトからダウンロードできます(http://www.practicalmalwareanalysis.com/ または http://www.nostarch.com/malware.htm)。これにより、実際のマルウェアを分析する際に遭遇するであろう種類のものに触れることができます。

実践的なハンズオン学習

私たちは、プロフェッショナルなリバースエンジニアリングおよびマルウェア解析のクラスを教える豊富な経験から、生徒が学んでいるスキルを実践できるときに最も効果的に学習できることを学びました。講義の質が重要であるのと同様に、ラボの質も重要であり、ラボがなければマルウェアの解析を学ぶことはほぼ不可能です。
 そのため、ほとんどの章の終わりには、その章で学んだスキルを実践するためのラボ演習を設けています。これらのラボは、現実世界のマルウェアで最も一般的な行動を示すように設計されたリアルなマルウェアで挑戦させます。ラボは、章で教えた概念を強化しつつ、関連のない情報で圧倒されないように設計されています。各ラボには、1つ以上のマルウェアファイル(http://www.practicalmalwareanalysis.com/ または http://www.nostarch.com/malware.htm からダウンロード可能)、ラボを進めるためのガイドとなる質問、質問への短い回答、マルウェアの詳細な解析が含まれています。
 ラボは、現実的なマルウェア解析のシナリオをシミュレートすることを目的としています。そのため、マルウェアの機能に関する洞察を提供しない一般的なファイル名を使用しています。実際のマルウェアと同様に、何の情報もない状態から始め、学んだスキルを使って手がかりを集め、マルウェアの動作を解明する必要があります。
 各ラボに要する時間は、あなたの経験に依存します。自分でラボを完了しようとするか、詳細な解析に沿って実践でさまざまな技術がどのように使用されているかを見ることができます。
 ほとんどの章には3つのラボがあります。最初のラボは一般的に最も簡単で、ほとんどの読者が完了できるでしょう。2番目のラボは中程度の難易度で、ほとんどの読者は解答からの助けを必要とします。3番目のラボは難易度が高く、最も熟練した読者のみが解答の助けなしに完了できるでしょう。

本書の内容

『Practical Malware Analysis』は、比較的単純な悪意のあるプログラムから情報を得るための簡単な方法から始まり、最も高度な悪意のあるプログラムに対処するためのより複雑な技術へと進んでいきます。各章の内容は次の通りです:

 本書の目標は、あらゆる種類のマルウェアを分析し撃退するスキルを身につけることです。多くの資料をカバーし、ラボを通じてそれらを強化します。この本を読み終えるころには、単純なマルウェアの迅速な分析から、最も難解なマルウェアの分析まで、あらゆるマルウェアを分析するためのスキルを学んでいるでしょう。
 それでは始めましょう。

0
マルウェア分析の入門

マルウェアの分析方法について詳しく説明する前に、いくつかの用語の定義、一般的なマルウェアの種類、マルウェア分析の基本的なアプローチを紹介する必要があります。ウイルス、トロイの木馬、ワーム、ルートキット、スケアウェア、スパイウェアなど、ユーザー、コンピュータ、またはネットワークに害を及ぼすソフトウェアはすべてマルウェアと見なすことができます。マルウェアはさまざまな形態で現れますが、マルウェアを分析するための一般的な技術が使用されます。どの技術を使用するかは、目的に応じて選択されます。

マルウェア解析の目的

マルウェア分析の目的は通常、ネットワーク侵入に対応するための情報を提供することです。典型的な目標は、正確に何が起こったのかを特定し、感染したすべてのマシンとファイルを見つけ出すことです。疑わしいマルウェアを分析する際の目標は、特定の疑わしいバイナリが何を行うことができるのか、ネットワーク上でどのように検出するのか、そしてその被害をどのように測定および抑制するのかを特定することです。

マルウェア解析の技術

多くの場合、マルウェア分析を行う際には、マルウェアの実行ファイルだけが手元にあり、それは人間が読めるものではありません。それを理解するためには、様々なツールやトリックを使い、それぞれが少量の情報を明らかにします。全体像を把握するためには、様々なツールを使用する必要があります。
 マルウェア分析には基本的に静的分析と動的分析の2つのアプローチがあります。静的分析はマルウェアを実行せずに調べる方法です。動的分析はマルウェアを実行して調べる方法です。これらの技術はさらに基本的なものと高度なものに分類されます。

基本的な静的解析

基本的な静的分析は、実行ファイルの実際の命令を表示せずに調べることを指します。基本的な静的分析は、ファイルが悪意のあるものであるかどうかを確認し、その機能に関する情報を提供し、場合によっては単純なネットワークシグネチャを作成するための情報を提供することができます。基本的な静的分析は簡単で迅速に行えることが多いですが、高度なマルウェアには効果が低く、重要な動作を見逃すことがあります。

基本的な動的解析

基本的な動的解析技術には、マルウェアを実行してその動作をシステム上で観察し、感染を除去したり、有効なシグネチャを生成したりすることが含まれます。ただし、マルウェアを安全に実行する前に、システムやネットワークに損害を与えずにマルウェアを調査できる環境を整える必要があります。基本的な静的解析技術と同様に、基本的な動的解析技術も深いプログラミング知識を持たない多くの人々が使用できますが、すべてのマルウェアに対して効果的ではなく、重要な機能を見逃す可能性があります。

高度な静的解析

高度な静的解析とは、実行ファイルを逆アセンブラにロードし、プログラムの命令を確認することで、そのプログラムが何をしているかを明らかにすることです。これらの命令はCPUによって実行されるため、高度な静的解析はプログラムが正確に何をしているのかを教えてくれます。しかし、高度な静的解析は基本的な静的解析に比べて学習曲線が急で、逆アセンブリ、コード構造、およびWindowsオペレーティングシステムの概念に関する専門知識を必要とします。これらの知識は本書で学ぶことができます。

高度な動的解析

高度な動的解析では、デバッガを使用して実行中の悪意のある実行ファイルの内部状態を調べます。高度な動的解析技術は、実行ファイルから詳細な情報を抽出するための別の方法を提供します。これらの技術は、他の方法では収集が困難な情報を取得しようとする際に特に有用です。本書では、高度な静的解析と組み合わせて高度な動的解析を使用する方法を示し、疑わしいマルウェアを完全に解析する方法を教えます。

マルウェアの種類

マルウェア解析を行う際には、マルウェアが何をしようとしているのかについて推測し、それを確認することで解析を迅速に進めることができます。当然ながら、マルウェアが通常行うことを知っていれば、より良い推測ができます。そこで、ほとんどのマルウェアが分類されるカテゴリを以下に示します。

 マルウェアは複数のカテゴリにまたがることがよくあります。例えば、パスワードを収集するキーロガーとスパムを送信するワームの機能を持つプログラムがあります。マルウェアをその機能に基づいて分類することにあまりこだわらないでください。
 マルウェアはまた、攻撃者の目的が大量か標的かに基づいて分類することもできます。スケアウェアのような大量マルウェアは散弾銃のアプローチを取り、できるだけ多くのマシンに影響を与えるように設計されています。これらの目標のうち、最も一般的で、通常はあまり高度ではなく、セキュリティソフトウェアがそれをターゲットにしているため、検出および防御が容易です。
 標的型マルウェアは、一つの組織に特化したバックドアのように、特定の組織に合わせて作られています。標的型マルウェアは、広範に普及していないため、セキュリティ製品では保護できないことが多く、ネットワークにとって大量マルウェアよりも大きな脅威です。標的型マルウェアの詳細な分析がなければ、そのマルウェアからネットワークを保護し、感染を除去することはほぼ不可能です。標的型マルウェアは通常非常に高度であり、その分析には本書で扱う高度な分析スキルが必要となります。

マルウェア解析の一般的なルール

解析を行う際に心に留めておくべきいくつかのルールでこの入門編を締めくくります。
 まず、細部にこだわりすぎないようにしてください。ほとんどのマルウェアプログラムは大規模で複雑であり、すべての詳細を理解することは不可能です。代わりに、重要な特徴に焦点を当ててください。難解で複雑な部分に遭遇したら、藪の中に迷い込む前に全体像を把握しようとしてください。
 次に、異なるツールやアプローチが異なる仕事に使用できることを覚えておいてください。一つのアプローチだけではありません。すべての状況が異なり、学んださまざまなツールやテクニックは類似した機能を持ち、時には重なることもあります。あるツールでうまくいかない場合は、別のツールを試してみてください。行き詰まったら、1つの問題に長く費やすことはせず、他のことに進んでください。マルウェアを異なる視点から分析してみたり、異なるアプローチを試してみたりしてみてください。
 最後に、マルウェア解析は猫とねずみのゲームのようなものであることを覚えておいてください。新しいマルウェア解析技術が開発されると、マルウェアの作成者は解析を阻止するための新しい技術で応じます。マルウェアアナリストとして成功するには、これらの技術を認識し、理解し、打ち負かす能力が必要であり、マルウェア解析の技術の変化に対応する必要があります。

第1部
基本分析

1
基本的な静的技術

マルウェア解析の探求を静的解析から始めます。静的解析は通常、マルウェアの研究の最初のステップです。静的解析とは、プログラムのコードや構造を分析してその機能を特定するプロセスを指します。この段階では、プログラム自体は実行されません。これに対し、動的解析を行う際には実際にプログラムを実行します。動的解析については第3章で学びます。
 この章では、実行ファイルから有用な情報を抽出するためのさまざまな方法について説明します。この章で取り上げる技術は以下の通りです。

 それぞれの技術は異なる情報を提供し、使用する技術は目的によって異なります。通常、できるだけ多くの情報を集めるために、複数の技術を使用します。

ウイルス対策スキャン: 役立つ最初のステップ

まず、マルウェアを分析する際の最初のステップとして、複数のアンチウイルスプログラムにかけることが有効です。これにより、すでに特定されているかもしれないマルウェアを見つけることができます。しかし、アンチウイルスツールは完璧ではありません。これらのツールは、既知の疑わしいコード(ファイルシグネチャ)の識別可能な部分のデータベースや、動作とパターンマッチングの分析(ヒューリスティックス)に主に依存しています。問題点の一つは、マルウェアの作成者が簡単にコードを変更し、その結果、プログラムのシグネチャが変わり、ウイルススキャナを回避できることです。また、稀なマルウェアはデータベースに存在しないため、アンチウイルスソフトウェアによって検出されないことがよくあります。さらに、ヒューリスティックスは未知の悪意のあるコードを識別するのに成功することが多いですが、新しいユニークなマルウェアによって回避されることがあります。
 さまざまなアンチウイルスプログラムが異なるシグネチャとヒューリスティックスを使用しているため、疑わしいマルウェアに対して複数の異なるアンチウイルスプログラムを実行することは有益です。VirusTotal(http://www.virustotal.com/)のようなウェブサイトでは、ファイルをアップロードして複数のアンチウイルスエンジンでスキャンすることができます。VirusTotalは、ファイルを悪意があると判断したエンジンの総数、マルウェア名、および利用可能な場合は追加の情報を提供するレポートを生成します。

ハッシュ化:マルウェアの指紋

ハッシュ化は、マルウェアを一意に識別するためによく使用される方法です。悪意のあるソフトウェアをハッシュ化プログラムに通すと、そのマルウェアを識別する一意のハッシュ(指紋のようなもの)が生成されます。マルウェア分析では、メッセージダイジェストアルゴリズム5(MD5)ハッシュ関数が最も一般的に使用されますが、セキュアハッシュアルゴリズム1(SHA-1)も人気があります。
 例えば、無料で利用できるmd5deepプログラムを使用してWindowsに付属しているソリティアプログラムのハッシュを計算すると、以下のような出力が生成されます:


C:\>md5deep c:\WINDOWS\system32\sol.exe
373e7a863a1a345c60edb9e20ec3231 c:\WINDOWS\system32\sol.exe

 ハッシュは 373e7a863a1a345c60edb9e20ec3231 です。
 図1-1に示されているGUIベースのWinMD5計算機は、複数のファイルのハッシュを同時に計算および表示することができます。
 マルウェアのユニークなハッシュを取得したら、次のように使用できます:
図 1-1: WinMD5 の出力

文字列の検出

プログラム内の文字列とは、「the」のような文字の並びのことを指します。プログラムがメッセージを表示したり、URLに接続したり、特定の場所にファイルをコピーしたりする場合、文字列が含まれます。
 文字列を検索することで、プログラムの機能についての手がかりを得ることができます。例えば、プログラムがURLにアクセスする場合、そのURLが文字列としてプログラム内に保存されているのがわかります。Stringsプログラム(http://bit.ly/ic4plL)を使用して、実行ファイル内の文字列を検索できます。これらの文字列は通常、ASCIIまたはUnicode形式で保存されています。

注意   Microsoft は、Unicode 文字列の実装について「ワイド文字列」という用語を使用していますが、これは Unicode 標準とは若干異なります。この本全体で Unicode について言及する際には、Microsoft の実装を指しています。

 ASCII と Unicode の両方の形式は、文字列が完了したことを示すために NULL 終端子で終わる文字のシーケンスを格納します。ASCII 文字列は文字ごとに 1 バイトを使用し、Unicode は文字ごとに 2 バイトを使用します。
 図 1-2 は、ASCII 形式で格納された文字列 BAD を示しています。ASCII 文字列は、バイト 0x42、0x41、0x44、および 0x00 として格納されます。ここで、0x42 は大文字の B の ASCII 表現であり、0x41 は A を表します。最後の 0x00 は NULL 終端子です。


図 1-2: 文字列 BAD の ASCII 表現

 図 1-3 は、Unicode 形式で格納された文字列 BAD を示しています。Unicode 文字列は、バイト 0x42、0x00、0x41 などとして格納されます。大文字の B は 0x42 と 0x00 のバイトで表され、NULL 終端子は 2 つの 0x00 バイトが連続して並んでいます。


図1-3: 文字列 BAD の Unicode 表現

 Strings プログラムが実行ファイル内の ASCII 文字列や Unicode 文字列を検索する際、コンテキストやフォーマットを無視して解析を行います。このため、あらゆるファイルタイプを分析でき、ファイル全体にわたって文字列を検出することができます(ただし、この結果、文字列ではないバイト列を文字列として誤検出することもあります)。Strings プログラムは、3 文字以上の ASCII または Unicode 文字列の後に文字列終端文字が続くシーケンスを検索します。
 Strings プログラムによって検出された文字列が実際の文字列でない場合もあります。例えば、Strings がバイト列 0x56, 0x50, 0x33, 0x00 を見つけた場合、それを文字列 VP3 と解釈します。しかし、それらのバイト列は実際にはその文字列を表していない可能性があります。それらはメモリアドレス、CPU 命令、またはプログラムが使用するデータかもしれません。Strings プログラムは無効な文字列をフィルタリングするのはユーザーに任せています。
 幸いにも、ほとんどの無効な文字列は正当なテキストを表していないため、一目でわかります。例えば、次の抜粋は、Strings プログラムをファイル bp6.ex_ に対して実行した結果を示しています。:


C:>strings bp6.ex_
VP3
VW3
t$@
D$4
99.124.22.1 ④
e-@
GetLayout ①
GDI32.DLL ③
SetLayout ②
M}C
Mail system DLL is invalid.!Send Mail failed to send message. ⑤

 この例では、太字の文字列は無視してかまいません。一般的に、文字列が短く、単語に対応していない場合、それはおそらく意味がありません。
 一方で、① の GetLayout や ② の SetLayout は、Windows グラフィックスライブラリで使用される Windows 関数です。Windows の関数名は通常、大文字で始まり、その後の単語も大文字で始まるため、これらが意味のある文字列であることを簡単に識別できます。
 ③ の GDI32.DLL は、グラフィックスプログラムで使用される一般的な Windows 動的リンクライブラリ (DLL) の名前であるため、意味のあるものです。(DLL ファイルは、複数のアプリケーションで共有される実行可能なコードを含んでいます。)
 ご想像の通り、④ の 99.124.22.1 は IP アドレスです。おそらくマルウェアが何らかの形で使用するものです。
 最終的に、⑤ で、「Mail system DLL is invalid.!Send Mail failed to send message.」というエラーメッセージが表示されます。これはエラーメッセージの一例です。通常、Stringsを実行して得られる最も有用な情報はエラーメッセージにあります。この特定のメッセージは、2つの重要なことを示しています。一つは、このマルウェアがメッセージ(おそらくメール)を送信すること、もう一つは、メールシステムのDLLに依存していることです。この情報から、疑わしいトラフィックについてメールログを確認する必要があること、そしてこのマルウェアには別のDLL(メールシステムのDLL)が関連している可能性があることが分かります。なお、欠落しているDLL自体は必ずしも悪意のあるものではありません。マルウェアはしばしば正当なライブラリやDLLを利用してその目的を達成します。

パッキングおよび難読化されたマルウェア

マルウェア作成者は、ファイルを検出または分析しにくくするために、パッキングや難読化を使用することがよくあります。難読化されたプログラムとは、実行内容を隠そうと試みたものです。パッキングされたプログラムは、圧縮されて分析できない状態の悪意のあるプログラムで、難読化されたプログラムの一部です。これらの技術は、マルウェアの静的分析を著しく制限します。
 正規のプログラムにはほとんどの場合、多くの文字列が含まれています。しかし、パッキングまたは難読化されたマルウェアには非常に少ない文字列しか含まれていません。もし、Stringsコマンドを使用してプログラムを検索し、非常に少ない文字列しか見つからない場合、それはおそらく難読化またはパッキングされており、悪意のある可能性が高いことを示唆しています。このようなプログラムをさらに調査するには、静的分析だけでは不十分なことが多いでしょう。

注意  パッキングおよび難読化されたコードには、LoadLibraryおよびGetProcAddressの関数が少なくとも含まれていることが多いです。これらは、追加の関数をロードし、アクセスするために使用されます。

ファイルのパッキング

パッキングされたプログラムが実行されると、小さなラッパープログラムも実行され、パッキングされたファイルを解凍してから、その解凍されたファイルを実行します(図1-4参照)。パッキングされたプログラムを静的に分析するときには、小さなラッパープログラムだけが分解されます(第18章では、パッキングとアンパッキングについて詳しく説明しています)。


図1-4: 左側のファイルは元の実行ファイルで、すべての文字列、インポート、およびその他の情報が見える状態です。右側はパッキングされた実行ファイルです。パッキングされたファイルのすべての文字列、インポート、およびその他の情報は圧縮されており、ほとんどの静的分析ツールからは見えません。

PEiDによるパッカーの検出

パックファイルを検出する方法の一つとして、PEiDプログラムがあります。PEiDを使用すると、アプリケーションの構築に使用されたパッカーやコンパイラの種類を検出することができ、パックされたファイルの解析がはるかに容易になります。図1-5は、PEiDが報告したorig_af2.ex_ファイルに関する情報を示しています。


図1-5: PEiDプログラム

注意  PEiDの開発とサポートは2011年4月以来中止されていますが、パッカーとコンパイラの検出に関しては依然として最良のツールです。多くの場合、ファイルをパックするために使用されたパッカーも特定できます。

 ご覧の通り、PEiDはこのファイルがUPXバージョン0.89.6-1.02または1.05-2.90でパックされていることを特定しました。(ここで表示されているその他の情報は無視してください。このプログラムについては、第18章で詳しく説明します。)

 プログラムがパックされている場合、解析を行うためにはそれをアンパックする必要があります。アンパックプロセスはしばしば複雑であり、第18章で詳しく説明しますが、UPXパッキングプログラムは非常に人気があり、アンパックも簡単なため、ここで特別に言及する価値があります。例えば、UPXでパックされたマルウェアをアンパックするには、UPX(http://upx.sourceforge.net/)をダウンロードし、パックされたプログラムを入力として次のように実行します:


upx -d PackedProgram.exe

注意  多くのPEiDプラグインは警告なしにマルウェアの実行ファイルを実行します!(マルウェアを実行するための安全な環境の設定方法については、第2章を参照してください。)また、すべてのプログラム、特にマルウェア解析に使用されるプログラムと同様に、PEiDも脆弱性の影響を受ける可能性があります。例えば、PEiDバージョン0.92にはバッファオーバーフローが含まれており、攻撃者が任意のコードを実行できるようになっていました。これにより、巧妙なマルウェア作者がマルウェア解析者のマシンを攻撃するプログラムを書くことができるようになっていました。最新バージョンのPEiDを使用するようにしてください。

ポータブル実行ファイル形式

これまで、実行ファイルのフォーマットに関係なくスキャンするツールについて説明してきました。しかし、ファイルのフォーマットはプログラムの機能について多くの情報を明らかにすることができます。
 ポータブル実行形式(PE)ファイルフォーマットは、Windowsの実行ファイル、オブジェクトコード、およびDLLに使用されます。PEファイルフォーマットは、ラップされた実行可能コードをWindows OSローダーが管理するために必要な情報を含むデータ構造です。Windowsによってロードされる実行可能コードを含むほぼすべてのファイルはPEファイルフォーマットですが、稀にレガシーファイルフォーマットがマルウェアに見られることがあります。
 PEファイルは、コードに関する情報、アプリケーションの種類、必要なライブラリ関数、および必要なスペースについての情報を含むヘッダーから始まります。PEヘッダーの情報はマルウェアアナリストにとって非常に価値があります。

リンクされたライブラリおよび関数

実行可能ファイルについて最も有用な情報の1つは、そのインポートされている関数のリストです。インポートとは、あるプログラムが使用する関数であり、実際には別のプログラムに保存されています。たとえば、多くのプログラムで共通の機能を持つコードライブラリなどです。コードライブラリは、リンクによってメインの実行可能ファイルに接続されます。
 プログラマーは、特定の機能を複数のプログラムで再実装する必要がないように、インポートをプログラムにリンクします。コードライブラリは、静的リンク、ランタイムリンク、動的リンクのいずれかでリンクすることができます。ライブラリコードがどのようにリンクされているかを知ることは、マルウェアの理解において重要です。なぜなら、PEファイルヘッダーに見つけられる情報は、ライブラリコードのリンク方法によって異なるからです。このセクションでは、実行可能ファイルのインポートされた関数を表示するためのいくつかのツールについて説明します。

静的リンク、ランタイムリンク、および動的リンク

静的リンクはライブラリをリンクする最も一般的でない方法ですが、UNIXやLinuxのプログラムでは一般的です。ライブラリが静的に実行可能ファイルにリンクされると、そのライブラリのすべてのコードが実行可能ファイルにコピーされるため、実行可能ファイルのサイズが大きくなります。コードを分析する際には、静的にリンクされたコードと実行可能ファイル自身のコードを区別するのが難しいです。なぜなら、PEファイルヘッダーにはファイルがリンクされたコードを含んでいることを示すものが何もないからです。
 フレンドリーなプログラムでは不人気ですが、ランタイムリンクはマルウェア、特にパックまたは難読化されたマルウェアで一般的に使用されます。ランタイムリンクを使用する実行可能ファイルは、必要な関数が必要になった時にのみライブラリに接続し、動的リンクプログラムのようにプログラムの開始時には接続しません。
 プログラマーがプログラムのファイルヘッダーに記載されていないリンク関数をインポートできるMicrosoft Windowsの関数がいくつかあります。その中で最もよく使用されるのは、LoadLibraryとGetProcAddressです。LdrGetProcAddressとLdrLoadDllも使用されます。LoadLibraryとGetProcAddressは、システム上の任意のライブラリ内の任意の関数にプログラムがアクセスできるようにします。したがって、これらの関数が使用されている場合、疑わしいプログラムがどの関数にリンクしているかを静的に判別することはできません。
 リンク方法の中で、動的リンクは最も一般的であり、マルウェア解析者にとって最も興味深いものです。ライブラリが動的にリンクされると、プログラムがロードされる際にホストOSが必要なライブラリを検索します。プログラムがリンクされたライブラリ関数を呼び出すと、その関数はライブラリ内で実行されます。
 PEファイルヘッダーには、ロードされるすべてのライブラリとプログラムが使用するすべての関数に関する情報が保存されます。使用されるライブラリや呼び出される関数はプログラムの中で最も重要な部分であることが多く、それらを特定することは特に重要です。なぜなら、それによりプログラムが何をするのかを推測することができるからです。たとえば、プログラムがURLDownloadToFile関数をインポートしている場合、そのプログラムがインターネットに接続して何かのコンテンツをダウンロードし、それをローカルファイルに保存することを推測できるかもしれません。

Dependency Walker を使用して動的にリンクされた関数の探索

依存関係ウォーカー (Dependency Walker) プログラム (http://www.dependencywalker.com/) は、いくつかのバージョンの Microsoft Visual Studio およびその他の Microsoft 開発パッケージに含まれており、実行可能ファイル内の動的リンクされた関数のみを一覧表示します。図 1-6 は、SERVICES.EX_ の Dependency Walker による分析を示しています。
 ② の最左端のペインには、プログラムおよびインポートされている DLL(具体的には KERNEL32.DLL と WS2_32.DLL)が表示されています。


図 1-6: Dependency Walker プログラム

 KERNEL32.DLL をクリックすると、③ の右上のペインにそのインポートされた関数が表示されます。いくつかの関数が表示されますが、最も興味深いのは CreateProcessA であり、これはプログラムが別のプロセスを作成する可能性が高いことを示しています。そのため、このプログラムを実行する際には追加のプログラムが起動するかどうかを注意して監視する必要があります。
 右中のペイン ④ には、KERNEL32.DLL 内のすべてのインポート可能な関数が一覧表示されていますが、これらの情報は特に有用ではありません。ペイン ③ と ④ に表示されている Ordinal という列に注目してください。実行可能ファイルは名前の代わりにオーディナル(番号)によって関数をインポートすることができます。オーディナルによって関数をインポートする場合、関数名は元の実行可能ファイルには表示されず、どの関数が使用されているかを解析するのが難しくなります。マルウェアがオーディナルで関数をインポートする場合、④ のペインに表示されているオーディナル値を調べることで、どの関数がインポートされているかを確認することができます。
 下部の ⑤ および ⑥ のペインには、それぞれプログラムを実行した場合に読み込まれる DLL のバージョンに関する追加情報および報告されたエラーが一覧表示されています。
 プログラムの DLL からは、その機能に関する多くの情報を得ることができます。例えば、表 1-1 には一般的な DLL と、それらがアプリケーションに関して示す内容が一覧表示されています。

表1-1:一般的なDLL
DLLDescription
Kernel32.dllこれは、メモリ、ファイル、ハードウェアのアクセスと操作など、コア機能を含む非常に一般的なDLLです。
Advapi32.dllこのDLLは、サービスマネージャやレジストリなど、Windowsのコアコンポーネントへのアクセスを提供します。
User32.dllこのDLLには、ボタン、スクロールバーなどのすべてのユーザーインターフェイスコンポーネント、およびユーザーアクションに応答するためのコンポーネントが含まれています。
Gdi32.dllこのDLLには、グラフィックの表示と操作のための機能が含まれています。
Ntdll.dllこのDLLはWindowsカーネルへのインターフェースです。実行ファイルは通常、このファイルを直接インポートしませんが、Kernel32.dllによって間接的にインポートされることがよくあります。実行ファイルがこのファイルをインポートしている場合、それは通常のプログラムでは利用できない機能を使用することを意図しています。タスクの非表示やプロセスの操作などの一部のタスクは、このインターフェースを使用します。
WSock32.dll and Ws2_32.dllこれらはネットワーキングDLLです。これらのDLLのいずれかにアクセスするプログラムは、ネットワークに接続するか、ネットワーク関連のタスクを実行する可能性が高いです。
Wininet.dllこのDLLには、FTP、HTTP、およびNTPなどのプロトコルを実装する高レベルのネットワーキング機能が含まれています。


関数の命名規則

不慣れなWindows関数を評価する際に、いくつかの命名規則に注意すると役立ちます。これらの規則は頻繁に登場し、それを認識しないと混乱するかもしれません。例えば、CreateWindowExのように、関数名にExの接尾辞が付いていることがあります。Microsoftが関数を更新し、新しい関数が古いものと互換性がない場合でも、Microsoftは古い関数を引き続きサポートします。新しい関数には、古い関数と同じ名前が付けられ、Exの接尾辞が追加されます。関数が二度大幅に更新された場合、その名前にはExの接尾辞が二つ付きます。
 パラメータとして文字列を取る多くの関数には、CreateDirectoryWのように、名前の最後にAまたはWが付いています。この文字は関数のドキュメントには現れず、単にその関数が文字列パラメータを受け取り、ASCII文字列用のバージョンとワイド文字列用のバージョンの二種類があることを示しています。Microsoftのドキュメントで関数を検索する際には、末尾のAまたはWを取り除くことを忘れないでください。



インポートされた関数

PEファイルのヘッダーには、実行ファイルが使用する特定の関数に関する情報も含まれています。これらのWindows関数の名前を見ることで、その実行ファイルが何をするのか大まかに把握することができます。Microsoftは、Microsoft Developer Network (MSDN) ライブラリを通じてWindows APIのドキュメントを非常に良く整備しています。また、付録Aにはマルウェアがよく使用する関数のリストも掲載されています。

エクスポートされた関数

インポートと同様に、DLLやEXEも他のプログラムやコードとやり取りするために関数をエクスポートします。通常、DLLは一つ以上の関数を実装し、それをエクスポートして、実行ファイル(EXE)がそれをインポートして使用できるようにします。
 PEファイルには、そのファイルがエクスポートする関数についての情報が含まれています。DLLは特にEXEが使用する機能を提供するために実装されるため、エクスポートされた関数はDLLに最も一般的です。EXEは他のEXEに機能を提供するようには設計されておらず、エクスポートされた関数は稀です。もし実行ファイルにエクスポートが見つかれば、それは有益な情報を提供することが多いです。
 多くの場合、ソフトウェアの著者はエクスポートされた関数に有益な情報を提供する名前を付けます。一つの一般的な慣例として、Microsoftのドキュメントで使用されている名前を使用することがあります。例えば、プログラムをサービスとして実行するためには、まずServiceMain関数を定義する必要があります。ServiceMainと呼ばれるエクスポートされた関数が存在することは、そのマルウェアがサービスの一部として実行されることを示しています。
 残念ながら、Microsoftのドキュメントではこの関数をServiceMainと呼び、プログラマーも同様にすることが多いですが、関数はどんな名前でも持つことができます。したがって、エクスポートされた関数の名前は高度なマルウェアに対しては実際には限られた有用性しかありません。マルウェアがエクスポートを使用する場合、それはしばしば名前を完全に省略するか、曖昧または誤解を招くような名前を使用します。
 Dependency Walkerプログラムを使用してエクスポート情報を表示することができます。エクスポートされた関数の一覧を表示するには、調べたいファイルの名前をクリックします。図1-6に戻ると、ウィンドウ④にはファイルのすべてのエクスポートされた関数が表示されています。

実践的な静的解析

静的解析の基本を理解したところで、実際のマルウェアを見ていきましょう。ここでは、キーロガーの可能性があるプログラムと、パックされたプログラムを取り上げます。

PotentialKeylogger.exe:アンパックされた実行ファイル

表1-2は、Dependency Walkerを使用して収集されたPotentialKeylogger.exeがインポートしている関数の簡略リストを示しています。非常に多くのインポートが見られるため、このファイルがパックされていないとすぐに結論付けることができます。

表1-2: PotentialKeylogger.exeからインポートされたDLLと関数の簡略リスト



 ほとんどの平均的なサイズのプログラムと同様に、この実行ファイルには多くのインポートされた関数が含まれています。残念ながら、その中でマルウェア解析において特に興味深い関数はごく少数です。本書では、マルウェア解析の観点から最も興味深い関数に焦点を当て、悪意のあるソフトウェアのインポートについて説明します。
 関数の動作が不明な場合は、調べる必要があります。解析を導くために、付録Aにはマルウェア解析者にとって特に重要な関数の多くがリストされています。もし関数が付録Aに記載されていない場合は、MSDNオンラインで検索してください。
 新人アナリストとして、最初はあまり興味深くない関数を調べることが多いかもしれませんが、重要な関数とそうでない関数をすぐに見分けられるようになります。この例では、多くの興味深くないインポートを示し、膨大なデータを見ながら重要な情報を見つける練習をします。
 通常、このマルウェアがキーロガーの可能性があることはわかりません。そのため、手掛かりを提供する機能を探す必要があります。今回はプログラムの機能にヒントを与える関数に注目します。
 表1-2に示されるKernel32.dllからのインポートは、このソフトウェアがプロセス(例えばOpenProcess、GetCurrentProcess、GetProcessHeap)やファイル(例えばReadFile、CreateFile、WriteFile)を開いたり操作したりできることを示しています。特に、FindFirstFileとFindNextFileの関数は、ディレクトリを検索するのに使える興味深いものです。
 User32.dllからのインポートはさらに興味深いです。大量のGUI操作関数(例えばRegisterClassEx、SetWindowText、ShowWindow)は、このプログラムがGUIを持つ可能性が高いことを示しています(ただし、GUIがユーザーに表示されるとは限りません)。
 SetWindowsHookEx関数はスパイウェアでよく使用され、キーロガーがキーボード入力を受け取る最も一般的な方法です。この関数は正当な用途もありますが、マルウェアが疑われる場合にこの関数を見ると、キーロガーの機能を持っている可能性が高いです。
 RegisterHotKey関数も興味深いです。これはホットキー(例えばCTRL-SHIFT-P)を登録し、ユーザーがそのホットキーの組み合わせを押すたびにアプリケーションに通知されます。どのアプリケーションが現在アクティブであっても、ホットキーはユーザーをこのアプリケーションに連れてきます。
 GDI32.dllからのインポートはグラフィック関連であり、このプログラムがGUIを持つことを確認するに過ぎません。Shell32.dllからのインポートは、このプログラムが他のプログラムを起動できることを示しており、これはマルウェアと正当なプログラムの両方に共通する機能です。
 Advapi32.dllからのインポートは、このプログラムがレジストリを使用することを示しており、レジストリキーのような文字列を検索する必要があることを示しています。レジストリ文字列はディレクトリに似ています。この場合、Software\Microsoft\Windows\CurrentVersion\Runという文字列を見つけました。これは、Windowsが起動する際に自動的に実行されるプログラムを制御するレジストリキー(マルウェアによく使われる)です。
 この実行ファイルにはLowLevelKeyboardProcとLowLevelMouseProcというエクスポートもあります。Microsoftのドキュメントによると、「LowLevelKeyboardProcフック手続きは、SetWindowsHookEx関数とともに使用されるアプリケーション定義またはライブラリ定義のコールバック関数です。」つまり、この関数はSetWindowsHookExとともに使用され、特定のイベントが発生したときに呼び出される関数を指定します。この場合、低レベルのキーボードイベントが対象です。SetWindowsHookExのドキュメントは、この関数が特定の低レベルキーボードイベントが発生したときに呼び出されることをさらに説明しています。
 MicrosoftのドキュメントはLowLevelKeyboardProcという名前を使用しており、この場合プログラマーも同じ名前を使用しました。プログラマーがエクスポートの名前を隠さなかったため、貴重な情報を得ることができました。
 静的解析によって得られたインポートとエクスポートの情報を基に、このマルウェアについていくつかの重要な結論や仮説を立てることができます。まず、このマルウェアはSetWindowsHookExを使用してキーストロークを記録するローカルキーロガーである可能性が高いと思われます。また、特定のユーザーにのみ表示されるGUIを持っていることが推測されます。さらに、RegisterHotKeyで登録されたホットキーは、悪意のあるユーザーがキーロガーのGUIを表示して記録されたキーストロークにアクセスするためのホットキーであると考えられます。さらに、レジストリ関数とSoftware\Microsoft\Windows\CurrentVersion\Runの存在から、このプログラムがシステム起動時に自動的に読み込まれるように設定されていることが推測されます。

PackedProgram.exe:行き詰まり

表1-3は、未知のマルウェアの2番目の部分によってインポートされた関数の完全なリストを示しています。このリストが非常に短いことから、このプログラムがパックされているか難読化されていることが分かります。また、このプログラムには読み取り可能な文字列がないことも、その証拠となります。Windowsのコンパイラがこのように少数の関数をインポートするプログラムを作成することはなく、Hello, Worldプログラムでさえもっと多くの関数をインポートします。

表1-3: PackedProgram.exeからインポートされたDLLと関数のリスト


 このプログラムがパックされているという事実は貴重な情報ですが、パックされているため、基本的な静的解析ではこれ以上の情報を得ることができません。より高度な解析技術、例えば動的解析(第3章で解説)やアンパック(第18章で解説)を試す必要があります。

PE ファイルのヘッダーとセクション

PEファイルヘッダーは、インポート情報だけでなく、かなり多くの情報を提供することができます。PEファイル形式はヘッダーに続いて一連のセクションが含まれています。ヘッダーにはファイル自体に関するメタデータが含まれています。ヘッダーに続いてファイルの実際のセクションがあり、それぞれに有用な情報が含まれています。本書を通じて、これらのセクションの情報を表示するための戦略について引き続き議論します。以下はPEファイルで最も一般的で興味深いセクションです:
 セクション名はコンパイラ間で一貫していることが多いですが、異なるコンパイラ間で異なることがあります。例えば、Visual Studioは実行可能コードに.textを使用しますが、Borland DelphiはCODEを使用します。Windowsは実際の名前を気にせず、PEヘッダー内の他の情報を使用してセクションの使用方法を判断します。さらに、セクション名は解析を困難にするために時々難読化されます。幸いなことに、デフォルトの名前が使用されることがほとんどです。表1-4には、最も一般的なセクション名が一覧されています。

表1-4: Windows実行ファイルのPEファイルのセクション


PEview を使った PE ファイルの検査

PEファイル形式は、そのヘッダー内に興味深い情報を保存しています。PEviewツールを使用してその情報を閲覧することができ、図1-7に示されています。
 図の①の左ペインには、PEヘッダーの主な部分が表示されています。現在選択されているため、IMAGE_FILE_HEADERエントリがハイライトされています。
 PEヘッダーの最初の2つの部分であるIMAGE_DOS_HEADERとMS-DOSスタブプログラムは、歴史的なものであり、特に興味を引く情報は提供しません。
 次のPEヘッダーセクションであるIMAGE_NT_HEADERSは、NTヘッダーを示しています。この署名は常に同じで、無視することができます。
 IMAGE_FILE_HEADERエントリは、②の右ペインにハイライト表示され、基本的なファイル情報を含んでいます。③のTime Date Stampの説明は、この実行ファイルがコンパイルされた日時を示しており、マルウェア解析やインシデント対応において非常に有用です。例えば、古いコンパイル日時は古い攻撃を示唆し、アンチウイルスプログラムがそのマルウェアのシグネチャを含んでいる可能性があります。新しいコンパイル日時はその逆を示唆します。


図1-7: PEviewプログラムでIMAGE_FILE_HEADERを表示

 とはいえ、コンパイル時刻には少々問題があります。すべてのDelphiプログラムは1992年6月19日のコンパイル時刻を使用します。そのため、そのコンパイル時刻を見た場合、それがDelphiプログラムである可能性が高く、実際にいつコンパイルされたのかは分かりません。さらに、熟練したマルウェア作成者は簡単にコンパイル時刻を偽装することができます。意味不明なコンパイル時刻を見た場合、それはおそらく偽装されたものでしょう。
 IMAGE_OPTIONAL_HEADERセクションにはいくつかの重要な情報が含まれています。Subsystemの説明には、それがコンソールプログラムかGUIプログラムかが示されます。コンソールプログラムはIMAGE_SUBSYSTEM_WINDOWS_CUIという値を持ち、コマンドウィンドウ内で実行されます。GUIプログラムはIMAGE_SUBSYSTEM_WINDOWS_GUIという値を持ち、Windowsシステム内で実行されます。ネイティブやXboxなど、あまり一般的ではないサブシステムも使用されます。
 最も興味深い情報は、図1-8に示されているように、IMAGE_SECTION_HEADERにあるセクションヘッダーから得られます。これらのヘッダーは、PEファイルの各セクションを説明するために使用されます。コンパイラは通常、実行ファイルのセクションを作成し、名前を付けますが、ユーザーはこれらの名前をほとんど制御できません。その結果、セクションは通常、実行ファイルごとに一貫しており(表1-4参照)、逸脱がある場合は疑わしいと考えられます。
 例えば、図1-8の①の仮想サイズは、ロードプロセス中にセクションに割り当てられるスペースの大きさを示しています。②の生データのサイズは、ディスク上のセクションの大きさを示しています。これらの2つの値は通常等しいはずで、データがメモリ内とディスク上で同じだけのスペースを占めるべきだからです。小さな違いは通常であり、メモリとディスク上のアライメントの違いによるものです。
 セクションサイズは、パックされた実行ファイルの検出に役立つことがあります。例えば、仮想サイズが生データのサイズよりもはるかに大きい場合、そのセクションがディスク上よりもメモリ内で多くのスペースを占めていることが分かります。これは、特に.textセクションがディスク上よりもメモリ内で大きい場合、パックされたコードを示していることがよくあります。


図 1-8: PEview プログラムで IMAGE_SECTION_HEADER .text セクションを表示する

 表1-5には、PotentialKeylogger.exeのセクションが示されています。ご覧のとおり、.text、.rdata、および.rsrcセクションには、ほぼ同じサイズの仮想サイズと生データサイズの値があります。.dataセクションは、生データサイズに比べて仮想サイズがはるかに大きいため、疑わしく見えるかもしれませんが、これはWindowsプログラムの.dataセクションにとって正常なことです。しかし、この情報だけではプログラムが悪意のあるものでないことを示しているわけではありません。単に、プログラムがパックされておらず、PEファイルヘッダーがコンパイラーによって生成された可能性が高いことを示しているだけです。

表 1-5: PotentialKeylogger.exe のセクション情報