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

Book description

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

Table of contents

  1. 表紙
  2. はじめに
  3.  本書の想定読者
  4.  本書の構成
  5.  この本を最大限に活用するために
  6.  カラー画像のダウンロード
  7.  本書の表記法
  8.  問い合わせ先
  9.  謝辞
  10. 1章 ようこそ、マルウェア解析の世界へ
  11.  1.1 マルウェアの定義
  12.  1.2 マルウェア解析とは?
  13.  1.3 なぜマルウェア解析が必要なのか?
  14.  1.4 マルウェア解析の種類
  15.  1.5 解析環境の準備
  16.   1.5.1 解析環境の要件
  17.   1.5.2 解析環境の構成について
  18.   1.5.3 Linux VMのセットアップと設定
  19.   1.5.4 Windows VMのセットアップと設定
  20.  1.6 マルウェアの入手先
  21.  1.7 まとめ
  22. 2章 表層解析
  23.  2.1 ファイル形式の判別
  24.   2.1.1 手動によるファイル形式の判別
  25.   2.1.2 ツールによるファイル形式の判別
  26.   2.1.3 Pythonによるファイル形式の判別
  27.  2.2 マルウェアのフィンガープリント
  28.   2.2.1 ツールによるハッシュ値生成
  29.   2.2.2 Pythonによるハッシュ値生成
  30.  2.3 複数のマルウェア対策スキャン
  31.   2.3.1 VirusTotalを利用した分析対象ファイルのスキャン
  32.   2.3.2 VirusTotal Public APIを利用したハッシュ値の問い合わせ
  33.  2.4 文字列の抽出
  34.   2.4.1 ツールによる文字列抽出
  35.   2.4.2 FLOSSによる難読化文字列のデコード
  36.  2.5 ファイル難読化の判別
  37.   2.5.1 パッカー・クリプター
  38.   2.5.2 Exeinfo PEを利用したファイル難読化の検出
  39.  2.6 PEヘッダ情報の分析
  40.   2.6.1 ファイルの依存関係とインポート関数の調査
  41.   2.6.2 エクスポート関数の調査
  42.   2.6.3 PEセクションテーブルとセクションの調査
  43.   2.6.4 コンパイル時刻の分析
  44.   2.6.5 PEリソースの分析
  45.  2.7 マルウェアの比較と分類
  46.   2.7.1 ファジーハッシュを利用したマルウェアの分類
  47.   2.7.2 インポートハッシュを利用したマルウェアの分類
  48.   2.7.3 セクションハッシュを利用したマルウェアの分類
  49.   2.7.4 YARAによるマルウェアの分類
  50.  2.8 まとめ
  51. 3章 動的解析
  52.  3.1 解析環境の概要
  53.  3.2 システムとネットワークの監視
  54.  3.3 動的解析ツール(監視ツール)
  55.   3.3.1 Process Hackerによるプロセス調査
  56.   3.3.2 Process Monitorによるシステム挙動の監視
  57.   3.3.3 Noribenによるシステム挙動の監視
  58.   3.3.4 Wiresharkによるネットワークトラフィックの監視
  59.   3.3.5 INetSimを利用したサービスの模倣
  60.  3.4 動的解析の方法論
  61.  3.5 実践編:実行ファイル型マルウェアの分析
  62.   3.5.1 検体の表層解析
  63.   3.5.2 検体の動的解析
  64.  3.6 DLLの解析
  65.   3.6.1 攻撃者がDLLを悪用する理由
  66.   3.6.2 rundll32.exeを利用したDLL解析
  67.   3.6.3 プロセスチェックによるDLL分析
  68.  3.7 まとめ
  69. 4章 アセンブリ言語と逆アセンブル入門
  70.  4.1 コンピュータの基礎
  71.   4.1.1 メモリ
  72.   4.1.2 CPU
  73.   4.1.3 プログラムの基礎
  74.  4.2 CPUレジスタ
  75.   4.2.1 汎用レジスタ
  76.   4.2.2 命令ポインタ(Instruction Pointer、EIP)
  77.   4.2.3 EFLAGSレジスタ
  78.  4.3 データ移動命令
  79.   4.3.1 レジスタへの定数の格納
  80.   4.3.2 レジスタからレジスタへの値の移動
  81.   4.3.3 メモリからレジスタへの値の移動
  82.   4.3.4 レジスタからメモリへの値の移動
  83.   4.3.5 アセンブリコード練習問題(問題編)
  84.   4.3.6 アセンブリコード練習問題(解答編)
  85.  4.4 算術演算
  86.   4.4.1 アセンブリコード練習問題(問題編)
  87.   4.4.2 アセンブリコード練習問題(解答編)
  88.  4.5 ビット演算
  89.  4.6 分岐と条件
  90.   4.6.1 無条件ジャンプ(Unconditional Jumps)
  91.   4.6.2 条件付きジャンプ(Conditional Jumps)
  92.   4.6.3 If文
  93.   4.6.4 if-else文
  94.   4.6.5 if-elseif-else文
  95.   4.6.6 アセンブリコード練習問題(問題編)
  96.   4.6.7 アセンブリコード練習問題(解答編)
  97.  4.7 ループ
  98.   4.7.1 アセンブリコード練習問題(問題編)
  99.   4.7.2 アセンブリコード練習問題(解答編)
  100.  4.8 関数
  101.   4.8.1 スタック
  102.   4.8.2 関数の呼び出し
  103.   4.8.3 関数の終了
  104.   4.8.4 関数パラメータと戻り値
  105.  4.9 配列と文字列
  106.   4.9.1 アセンブリコード練習問題(問題編)
  107.   4.9.2 アセンブリコード練習問題(解答編)
  108.   4.9.3 文字列
  109.  4.10 構造体
  110.  4.11 x64アーキテクチャ
  111.   4.11.1 64ビットWindowsにおける32ビット実行ファイルの分析
  112.  4.12 さらなる学習のために
  113.  4.13 まとめ
  114. 5章 IDAによる逆アセンブル
  115.  5.1 コード解析ツール
  116.  5.2 IDAによる静的コード解析(逆アセンブル)
  117.   5.2.1 IDAにおけるファイルの読み込み
  118.   5.2.2 IDAの表示画面
  119.   5.2.3 IDAによる逆アセンブル分析
  120.  5.3 Windows APIの逆アセンブル
  121.   5.3.1 Windows APIへの理解
  122.   5.3.2 32ビットAPIと64ビットAPIの比較
  123.  5.4 IDAによるプログラムへのパッチ適用
  124.   5.4.1 実行ファイルへのパッチ適用
  125.   5.4.2 命令コードへのパッチ適用
  126.  5.5 IDAスクリプトとプラグイン
  127.   5.5.1 IDAスクリプトの実行
  128.   5.5.2 IDAPython
  129.   5.5.3 IDAプラグイン
  130.  5.6 まとめ
  131. 6章 マルウェアのデバッグ
  132.  6.1 デバッガの一般的概念について
  133.   6.1.1 プロセスの起動とアタッチ
  134.   6.1.2 プロセスの実行制御
  135.   6.1.3 ブレークポイントを利用したプログラム制御
  136.   6.1.4 プログラム実行のトレース
  137.  6.2 x64dbgによる実行ファイルのデバッグ
  138.   6.2.1 x64dbgによる新しいプロセスの起動
  139.   6.2.2 x64dbgによる既存プロセスへのアタッチ
  140.   6.2.3 x64dbgデバッガインタフェース
  141.   6.2.4 x64dbgによるプロセスの実行制御
  142.   6.2.5 x64dbgにおけるブレークポイント設定
  143.   6.2.6 32ビットマルウェアに対するデバッグ
  144.   6.2.7 64ビットマルウェアに対するデバッグ
  145.   6.2.8 x64dbgによる悪性DLLのデバッグ
  146.   6.2.9 x64dbgにおけるトレース実行
  147.   6.2.10 x64dbgによるプログラムへのパッチ適用
  148.  6.3 IDAによる実行ファイルのデバッグ
  149.   6.3.1 IDAにおける新しいプロセスの起動
  150.   6.3.2 IDAを利用した既存プロセスへのアタッチ
  151.   6.3.3 IDA Debuggerのインタフェース
  152.   6.3.4 IDAを利用したプロセス実行の制御
  153.   6.3.5 IDAにおけるブレークポイントの設定
  154.   6.3.6 IDAを利用したマルウェアのデバッグ
  155.   6.3.7 IDAを利用した悪性DLLのデバッグ
  156.   6.3.8 IDAを利用した実行トレース
  157.   6.3.9 IDAPythonを利用したデバッガスクリプト
  158.  6.4 .NETアプリケーションのデバッグ技法
  159.  6.5 まとめ
  160. 7章 マルウェアの機能と持続性
  161.  7.1 マルウェアの機能
  162.   7.1.1 ダウンローダー
  163.   7.1.2 ドロッパー
  164.   7.1.3 キーロガー
  165.   7.1.4 リムーバブルメディアを介したマルウェアの複製
  166.   7.1.5 マルウェアのC2通信
  167.   7.1.6 PowerShellの実行
  168.  7.2 マルウェアの持続性メカニズム
  169.   7.2.1 RUNレジストリキー
  170.   7.2.2 スケジュールタスク
  171.   7.2.3 スタートアップフォルダ
  172.   7.2.4 Winlogonレジストリ
  173.   7.2.5 イメージファイル実行オプション
  174.   7.2.6 アクセシビリティプログラム
  175.   7.2.7 AppInit_DLLs
  176.   7.2.8 DLL検索順序の悪用(DLL Search Order Hijacking)
  177.   7.2.9 COMハイジャッキング(COM hijacking)
  178.   7.2.10 サービス
  179.  7.3 まとめ
  180. 8章 コードインジェクションとフッキング
  181.  8.1 仮想メモリ
  182.   8.1.1 プロセスメモリの構成要素(ユーザ空間)
  183.   8.1.2 カーネルメモリの構成要素(カーネル空間)
  184.  8.2 ユーザモードとカーネルモード
  185.   8.2.1 Windows API呼び出しフロー
  186.  8.3 コードインジェクション技術
  187.   8.3.1 リモートDLLインジェクション
  188.   8.3.2 APCインジェクション
  189.   8.3.3 SetWindowsHookEx()を悪用したDLLインジェクション
  190.   8.3.4 アプリケーション互換性Shimを悪用したDLLインジェクション
  191.   8.3.5 リモート実行ファイル/シェルコードインジェクション
  192.   8.3.6 プロセスハロウイング
  193.  8.4 フッキング技術
  194.   8.4.1 IATフッキング
  195.   8.4.2 インラインフッキング(インラインパッチ)
  196.   8.4.3 Shimを利用したインメモリパッチング
  197.  8.5 追加リソース
  198.  8.6 まとめ
  199. 9章 難読化手法
  200.  9.1 単純なエンコード
  201.   9.1.1 シーザー暗号
  202.   9.1.2 BASE64エンコーディング
  203.   9.1.3 XORエンコーディング
  204.  9.2 マルウェアの暗号化
  205.   9.2.1 Signsrchを利用した暗号シグニチャの識別
  206.   9.2.2 FindCrypt2を利用した暗号定数の検出
  207.   9.2.3 YARAを利用した暗号シグニチャの検出
  208.   9.2.4 Pythonによる復号
  209.  9.3 カスタムエンコード/暗号化
  210.  9.4 マルウェアのアンパック技法
  211.   9.4.1 手動によるアンパッキング
  212.   9.4.2 自動化されたアンパッキング
  213.  9.5 まとめ
  214. 10章 メモリフォレンジックを利用したマルウェアハンティング
  215.  10.1 メモリフォレンジックの手順
  216.  10.2 メモリイメージの取得
  217.   10.2.1 DumpItを利用したメモリイメージ取得
  218.  10.3 Volatilityの概要
  219.   10.3.1 Volatilityのインストール
  220.   10.3.2 Volatilityの利用
  221.  10.4 プロセスの列挙
  222.   10.4.1 プロセスの概要
  223.   10.4.2 psscanを利用したプロセス列挙
  224.   10.4.3 プロセスの関係性分析
  225.   10.4.4 psxviewを利用したプロセス列挙
  226.  10.5 プロセスハンドルの列挙
  227.  10.6 DLLの列挙
  228.   10.6.1 ldrmodulesを利用した隠しDLLの検出
  229.  10.7 実行ファイルとDLLのダンプ
  230.  10.8 ネットワーク接続とソケットの列挙
  231.  10.9 レジストリの検査
  232.  10.10 サービスの調査
  233.  10.11 コマンド履歴の抽出
  234.  10.12 まとめ
  235. 11章 メモリフォレンジックを利用した高度なマルウェア検出
  236.  11.1 コードインジェクションの検出
  237.   11.1.1 VAD情報の取得
  238.   11.1.2 VADを利用した挿入コードの検出
  239.   11.1.3 プロセスメモリ領域のダンプ
  240.   11.1.4 malfindを利用した挿入コードの検出
  241.  11.2 プロセスハロウイング攻撃の調査
  242.   11.2.1 プロセスハロウイング攻撃のステップ
  243.   11.2.2 プロセスハロウイング攻撃の検出
  244.   11.2.3 プロセスハロウイング攻撃の種類
  245.  11.3 APIフックの検出
  246.  11.4 カーネルモードルートキット
  247.  11.5 カーネルモジュールの列挙
  248.   11.5.1 driverscanを利用したカーネルモジュールの列挙
  249.  11.6 I/O処理
  250.   11.6.1 デバイスドライバの役割
  251.   11.6.2 I/Oマネージャの役割
  252.   11.6.3 デバイスドライバとの通信
  253.   11.6.4 複数層ドライバへのI/Oリクエスト
  254.  11.7 デバイスツリーの表示
  255.  11.8 カーネル空間フッキングの検出
  256.   11.8.1 SSDTフッキングの検出
  257.   11.8.2 IDTフッキングの検出
  258.   11.8.3 インラインカーネルフックの特定
  259.   11.8.4 IRP関数フックの検出
  260.  11.9 カーネルコールバックとタイマー
  261.  11.10 まとめ
  262. 訳者あとがき
  263. 技術監修者あとがき
  264. 奥付

Product information

  • Title: 初めてのマルウェア解析 ―Windowsマルウェアを解析するための概念、ツール、テクニックを探る
  • Author(s): Monnappa K A, 石川 朝久, 北原 憲, 中津留 勇
  • Release date: December 2020
  • Publisher(s): O'Reilly Japan, Inc.
  • ISBN: 9784873119298

You might also like

book

行動を変えるデザイン ―心理学と行動経済学をプロダクトデザインに活用する

by Stephen Wendel, 武山 政直, 相島 雅樹, 反中 望, 松村 草也

深津貴之氏推薦!「行動経済学、データ分析、サービス設計のエッセンスが高度に統合された行動変容デザインの良書です」 本書は、行動経済学と心理学をもとに、人々の行動、日常習慣を変える“行動変容”を促すプロダクトをデザインするための書籍です。主にヘルスケア(健康管理)、金融(資産管理)など、これまでITプロダクト(サービス、アプリなど)がなかなか使われてこなかった分野を対象に、ユーザーがやりたいと思っていたものの実行できなかった行動の実現を助けるプロダクトを作り出すための、実践的な視点や知識を提供します。

book

初めてのGraphQL ―Webサービスを作って学ぶ新世代API

by Eve Porcello, Alex Banks, 尾崎 沙耶, あんどうやすし

今日では多くのWebサービスがRESTアーキテクチャスタイルで実装されています。RESTは2000年にフィールディングの論文で提唱された後に爆発的に普及し洗練されてきました。一方で、本書で紹介するGraphQLは2015年にFacebookによって公開されたRESTとは異なるアプローチのアーキテクチャです。GraphQLの最大の特徴はクエリ言語を用いてデータを操作する点です。クエリ言語の表現力の高さによりクライアントは本当に必要なリクエストを送ることができます。本書ではGraphQLの概要とGraphQLを用いたWebサービスの開発方法を実装例に沿って紹介します。認証やファイルアップロードといった実践的なトピックまで踏み込んだGraphQLの実用的な入門書です。

book

PythonによるAIプログラミング入門 ―ディープラーニングを始める前に身につけておくべき15の基礎技術

by Prateek Joshi, 相川 愛三

近年ディープラーニングが爆発的人気となっています。しかし、人工知能の手法はディープラーニングに限りません。過去のAIブームの単純なニューラルネットや論理プログラミングもあれば、遺伝的アルゴリズム、自然言語処理、音声信号処理や、画像からの動物体検出、分類問題、回帰問題、連続データ解析、強化学習といった、古典的なデータ解析や機械学習の手法もあります。これらはディープラーニングを始める前に身につけておくべき基礎技術です。「鶏を割くに焉んぞ牛刀を用いん」の諺のように、読者がデータ収集や計算コストがかかるディープラーニングの他にも適材適所の手法を選択できるよう、本書ではさまざまな人工知能の関連分野を扱いながら、Pythonでよく使われるライブラリの基本的な使い方を解説します。

book

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック

by Dustin Boswell, Trevor Foucher, 角 征典

美しいコードを見ると感動する。優れたコードは見た瞬間に何をしているかが伝わってくる。そういうコードは使うのが楽しいし、自分のコードもそうあるべきだと思わせてくれる。本書の目的は、君のコードを良くすることだ。(本書「はじめに」より) コードは理解しやすくなければならない。本書はこの原則を日々のコーディングの様々な場面に当てはめる方法を紹介します。名前の付け方、コメントの書き方など表面上の改善について。コードを動かすための制御フロー、論理式、変数などループとロジックについて。またコードを再構成するための方法。さらにテストの書き方などについて、楽しいイラストと共に説明しています。日本語版ではRubyやgroongaのコミッタとしても著名な須藤功平氏による解説を収録。