初めてのマルウェア解析

―Windowsマルウェアを解析するための概念、ツール、テクニックを探る

[cover photo]
TOPICS
Security
発行年月日
PRINT LENGTH
448
ISBN
978-4-87311-929-8
原書
Learning Malware Analysis
FORMAT
Print PDF EPUB
Ebook
4,400円
Ebookを購入する
Print
4,400円

マルウェア解析は、マルウェアを分析してどのように悪意のある振る舞いをするか、どのような攻撃技術を悪用しているかを洗い出し、インシデント対策に役立てる技術で、近年のサイバー攻撃対策に欠かせない技術です。本書は、そのマルウェア解析技術について丁寧に解説する入門書です。表層解析、動的解析、静的解析、メモリ解析などの必要な技術を、多くの研究やトレーニングの実績を持つ著者が網羅的かつ体系的に解説していきます。基礎の理解に重点を置いており、本書を読むことでマルウェア解析に必要な基礎技術をひと通り習得することができます。これからマルウェア解析を学ぶ方にも、マルウェア解析の知識を再確認したい方にもおすすめの一冊です。

目次

はじめに
    本書の想定読者
    本書の構成
    この本を最大限に活用するために
    カラー画像のダウンロード
    本書の表記法
    問い合わせ先
    謝辞

1章 ようこそ、マルウェア解析の世界へ
    1.1 マルウェアの定義
    1.2 マルウェア解析とは?
    1.3 なぜマルウェア解析が必要なのか?
    1.4 マルウェア解析の種類
    1.5 解析環境の準備
        1.5.1 解析環境の要件
        1.5.2 解析環境の構成について
        1.5.3 Linux VMのセットアップと設定
        1.5.4 Windows VMのセットアップと設定
    1.6 マルウェアの入手先
    1.7 まとめ

2章 表層解析
    2.1 ファイル形式の判別
        2.1.1 手動によるファイル形式の判別
        2.1.2 ツールによるファイル形式の判別
        2.1.3 Pythonによるファイル形式の判別
    2.2 マルウェアのフィンガープリント
        2.2.1 ツールによるハッシュ値生成
        2.2.2 Pythonによるハッシュ値生成
    2.3 複数のマルウェア対策スキャン
        2.3.1 VirusTotalを利用した分析対象ファイルのスキャン
        2.3.2 VirusTotal Public APIを利用したハッシュ値の問い合わせ
    2.4 文字列の抽出
        2.4.1 ツールによる文字列抽出
        2.4.2 FLOSSによる難読化文字列のデコード
    2.5 ファイル難読化の判別
        2.5.1 パッカー・クリプター
        2.5.2 Exeinfo PEを利用したファイル難読化の検出
    2.6 PEヘッダ情報の分析
        2.6.1 ファイルの依存関係とインポート関数の調査
        2.6.2 エクスポート関数の調査
        2.6.3 PEセクションテーブルとセクションの調査
        2.6.4 コンパイル時刻の分析
        2.6.5 PEリソースの分析
    2.7 マルウェアの比較と分類
        2.7.1 ファジーハッシュを利用したマルウェアの分類
        2.7.2 インポートハッシュを利用したマルウェアの分類
        2.7.3 セクションハッシュを利用したマルウェアの分類
        2.7.4 YARAによるマルウェアの分類
    2.8 まとめ

3章 動的解析
    3.1 解析環境の概要
    3.2 システムとネットワークの監視
    3.3 動的解析ツール(監視ツール)
        3.3.1 Process Hackerによるプロセス調査
        3.3.2 Process Monitorによるシステム挙動の監視
        3.3.3 Noribenによるシステム挙動の監視
        3.3.4 Wiresharkによるネットワークトラフィックの監視
        3.3.5 INetSimを利用したサービスの模倣
    3.4 動的解析の方法論
    3.5 実践編:実行ファイル型マルウェアの分析
        3.5.1 検体の表層解析
        3.5.2 検体の動的解析
    3.6 DLLの解析
        3.6.1 攻撃者がDLLを悪用する理由
        3.6.2 rundll32.exeを利用したDLL解析
        3.6.3 プロセスチェックによるDLL分析
    3.7 まとめ

4章 アセンブリ言語と逆アセンブル入門
    4.1 コンピュータの基礎
        4.1.1 メモリ
        4.1.2 CPU
        4.1.3 プログラムの基礎
    4.2 CPUレジスタ
        4.2.1 汎用レジスタ
        4.2.2 命令ポインタ(Instruction Pointer、EIP)
        4.2.3 EFLAGSレジスタ
    4.3 データ移動命令
        4.3.1 レジスタへの定数の格納
        4.3.2 レジスタからレジスタへの値の移動
        4.3.3 メモリからレジスタへの値の移動
        4.3.4 レジスタからメモリへの値の移動
        4.3.5 アセンブリコード練習問題(問題編)
        4.3.6 アセンブリコード練習問題(解答編)
    4.4 算術演算
        4.4.1 アセンブリコード練習問題(問題編)
        4.4.2 アセンブリコード練習問題(解答編)
    4.5 ビット演算
    4.6 分岐と条件
        4.6.1 無条件ジャンプ(Unconditional Jumps)
        4.6.2 条件付きジャンプ(Conditional Jumps)
        4.6.3 If文
        4.6.4 if-else文
        4.6.5 if-elseif-else文
        4.6.6 アセンブリコード練習問題(問題編)
        4.6.7 アセンブリコード練習問題(解答編)
    4.7 ループ
        4.7.1 アセンブリコード練習問題(問題編)
        4.7.2 アセンブリコード練習問題(解答編)
    4.8 関数
        4.8.1 スタック
        4.8.2 関数の呼び出し
        4.8.3 関数の終了
        4.8.4 関数パラメータと戻り値
    4.9 配列と文字列
        4.9.1 アセンブリコード練習問題(問題編)
        4.9.2 アセンブリコード練習問題(解答編)
        4.9.3 文字列
    4.10 構造体
    4.11 x64アーキテクチャ
        4.11.1 64ビットWindowsにおける32ビット実行ファイルの分析
    4.12 さらなる学習のために
    4.13 まとめ

5章 IDAによる逆アセンブル
    5.1 コード解析ツール
    5.2 IDAによる静的コード解析(逆アセンブル)
        5.2.1 IDAにおけるファイルの読み込み
        5.2.2 IDAの表示画面
        5.2.3 IDAによる逆アセンブル分析
    5.3 Windows APIの逆アセンブル
        5.3.1 Windows APIへの理解
        5.3.2 32ビットAPIと64ビットAPIの比較
    5.4 IDAによるプログラムへのパッチ適用
        5.4.1 実行ファイルへのパッチ適用
        5.4.2 命令コードへのパッチ適用
    5.5 IDAスクリプトとプラグイン
        5.5.1 IDAスクリプトの実行
        5.5.2 IDAPython
        5.5.3 IDAプラグイン
    5.6 まとめ

6章 マルウェアのデバッグ
    6.1 デバッガの一般的概念について
        6.1.1 プロセスの起動とアタッチ
        6.1.2 プロセスの実行制御
        6.1.3 ブレークポイントを利用したプログラム制御
        6.1.4 プログラム実行のトレース
    6.2 x64dbgによる実行ファイルのデバッグ
        6.2.1 x64dbgによる新しいプロセスの起動
        6.2.2 x64dbgによる既存プロセスへのアタッチ
        6.2.3 x64dbgデバッガインタフェース
        6.2.4 x64dbgによるプロセスの実行制御
        6.2.5 x64dbgにおけるブレークポイント設定
        6.2.6 32ビットマルウェアに対するデバッグ
        6.2.7 64ビットマルウェアに対するデバッグ
        6.2.8 x64dbgによる悪性DLLのデバッグ
        6.2.9 x64dbgにおけるトレース実行
        6.2.10 x64dbgによるプログラムへのパッチ適用
    6.3 IDAによる実行ファイルのデバッグ
        6.3.1 IDAにおける新しいプロセスの起動
        6.3.2 IDAを利用した既存プロセスへのアタッチ
        6.3.3 IDA Debuggerのインタフェース
        6.3.4 IDAを利用したプロセス実行の制御
        6.3.5 IDAにおけるブレークポイントの設定
        6.3.6 IDAを利用したマルウェアのデバッグ
        6.3.7 IDAを利用した悪性DLLのデバッグ
        6.3.8 IDAを利用した実行トレース
        6.3.9 IDAPythonを利用したデバッガスクリプト
    6.4 .NETアプリケーションのデバッグ技法
    6.5 まとめ

7章 マルウェアの機能と持続性
    7.1 マルウェアの機能
        7.1.1 ダウンローダー
        7.1.2 ドロッパー
        7.1.3 キーロガー
        7.1.4 リムーバブルメディアを介したマルウェアの複製
        7.1.5 マルウェアのC2通信
        7.1.6 PowerShellの実行
    7.2 マルウェアの持続性メカニズム
        7.2.1 RUNレジストリキー
        7.2.2 スケジュールタスク
        7.2.3 スタートアップフォルダ
        7.2.4 Winlogonレジストリ
        7.2.5 イメージファイル実行オプション
        7.2.6 アクセシビリティプログラム
        7.2.7 AppInit_DLLs
        7.2.8 DLL検索順序の悪用(DLL Search Order Hijacking)
        7.2.9 COMハイジャッキング(COM hijacking)
        7.2.10 サービス
    7.3 まとめ

8章 コードインジェクションとフッキング
    8.1 仮想メモリ
        8.1.1 プロセスメモリの構成要素(ユーザ空間)
        8.1.2 カーネルメモリの構成要素(カーネル空間)
    8.2 ユーザモードとカーネルモード
        8.2.1 Windows API呼び出しフロー
    8.3 コードインジェクション技術
        8.3.1 リモートDLLインジェクション
        8.3.2 APCインジェクション
        8.3.3 SetWindowsHookEx()を悪用したDLLインジェクション
        8.3.4 アプリケーション互換性Shimを悪用したDLLインジェクション
        8.3.5 リモート実行ファイル/シェルコードインジェクション
        8.3.6 プロセスハロウイング
    8.4 フッキング技術
        8.4.1 IATフッキング
        8.4.2 インラインフッキング(インラインパッチ)
        8.4.3 Shimを利用したインメモリパッチング
    8.5 追加リソース
    8.6 まとめ

9章 難読化手法
    9.1 単純なエンコード
        9.1.1 シーザー暗号
        9.1.2 BASE64エンコーディング
        9.1.3 XORエンコーディング
    9.2 マルウェアの暗号化
        9.2.1 Signsrchを利用した暗号シグニチャの識別
        9.2.2 FindCrypt2を利用した暗号定数の検出
        9.2.3 YARAを利用した暗号シグニチャの検出
        9.2.4 Pythonによる復号
    9.3 カスタムエンコード/暗号化
    9.4 マルウェアのアンパック技法
        9.4.1 手動によるアンパッキング
        9.4.2 自動化されたアンパッキング
    9.5 まとめ

10章 メモリフォレンジックを利用したマルウェアハンティング
    10.1 メモリフォレンジックの手順
    10.2 メモリイメージの取得
        10.2.1 DumpItを利用したメモリイメージ取得
    10.3 Volatilityの概要
        10.3.1 Volatilityのインストール
        10.3.2 Volatilityの利用
    10.4 プロセスの列挙
        10.4.1 プロセスの概要
        10.4.2 psscanを利用したプロセス列挙
        10.4.3 プロセスの関係性分析
        10.4.4 psxviewを利用したプロセス列挙
    10.5 プロセスハンドルの列挙
    10.6 DLLの列挙
        10.6.1 ldrmodulesを利用した隠しDLLの検出
    10.7 実行ファイルとDLLのダンプ
    10.8 ネットワーク接続とソケットの列挙
    10.9 レジストリの検査
    10.10 サービスの調査
    10.11 コマンド履歴の抽出
    10.12 まとめ

11章 メモリフォレンジックを利用した高度なマルウェア検出
    11.1 コードインジェクションの検出
        11.1.1 VAD情報の取得
        11.1.2 VADを利用した挿入コードの検出
        11.1.3 プロセスメモリ領域のダンプ
        11.1.4 malfindを利用した挿入コードの検出
    11.2 プロセスハロウイング攻撃の調査
        11.2.1 プロセスハロウイング攻撃のステップ
        11.2.2 プロセスハロウイング攻撃の検出
        11.2.3 プロセスハロウイング攻撃の種類
    11.3 APIフックの検出
    11.4 カーネルモードルートキット
    11.5 カーネルモジュールの列挙
        11.5.1 driverscanを利用したカーネルモジュールの列挙
    11.6 I/O処理
        11.6.1 デバイスドライバの役割
        11.6.2 I/Oマネージャの役割
        11.6.3 デバイスドライバとの通信
        11.6.4 複数層ドライバへのI/Oリクエスト
    11.7 デバイスツリーの表示
    11.8 カーネル空間フッキングの検出
        11.8.1 SSDTフッキングの検出
        11.8.2 IDTフッキングの検出
        11.8.3 インラインカーネルフックの特定
        11.8.4 IRP関数フックの検出
    11.9 カーネルコールバックとタイマー
    11.10 まとめ

訳者あとがき
技術監修者あとがき
索引