Book description
マルウェア解析は、マルウェアを分析してどのように悪意のある振る舞いをするか、どのような攻撃技術を悪用しているかを洗い出し、インシデント対策に役立てる技術で、近年のサイバー攻撃対策に欠かせない技術です。本書は、そのマルウェア解析技術について丁寧に解説する入門書です。表層解析、動的解析、静的解析、メモリ解析などの必要な技術を、多くの研究やトレーニングの実績を持つ著者が網羅的かつ体系的に解説していきます。基礎の理解に重点を置いており、本書を読むことでマルウェア解析に必要な基礎技術をひと通り習得することができます。これからマルウェア解析を学ぶ方にも、マルウェア解析の知識を再確認したい方にもおすすめの一冊です。
Table of contents
- 表紙
- はじめに
- 本書の想定読者
- 本書の構成
- この本を最大限に活用するために
- カラー画像のダウンロード
- 本書の表記法
- 問い合わせ先
- 謝辞
- 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 まとめ
- 訳者あとがき
- 技術監修者あとがき
- 奥付
Product information
- Title: 初めてのマルウェア解析 ―Windowsマルウェアを解析するための概念、ツール、テクニックを探る
- Author(s):
- Release date: December 2020
- Publisher(s): O'Reilly Japan, Inc.
- ISBN: 9784873119298
You might also like
book
行動を変えるデザイン ―心理学と行動経済学をプロダクトデザインに活用する
深津貴之氏推薦!「行動経済学、データ分析、サービス設計のエッセンスが高度に統合された行動変容デザインの良書です」 本書は、行動経済学と心理学をもとに、人々の行動、日常習慣を変える“行動変容”を促すプロダクトをデザインするための書籍です。主にヘルスケア(健康管理)、金融(資産管理)など、これまでITプロダクト(サービス、アプリなど)がなかなか使われてこなかった分野を対象に、ユーザーがやりたいと思っていたものの実行できなかった行動の実現を助けるプロダクトを作り出すための、実践的な視点や知識を提供します。
book
初めてのGraphQL ―Webサービスを作って学ぶ新世代API
今日では多くのWebサービスがRESTアーキテクチャスタイルで実装されています。RESTは2000年にフィールディングの論文で提唱された後に爆発的に普及し洗練されてきました。一方で、本書で紹介するGraphQLは2015年にFacebookによって公開されたRESTとは異なるアプローチのアーキテクチャです。GraphQLの最大の特徴はクエリ言語を用いてデータを操作する点です。クエリ言語の表現力の高さによりクライアントは本当に必要なリクエストを送ることができます。本書ではGraphQLの概要とGraphQLを用いたWebサービスの開発方法を実装例に沿って紹介します。認証やファイルアップロードといった実践的なトピックまで踏み込んだGraphQLの実用的な入門書です。
book
PythonによるAIプログラミング入門 ―ディープラーニングを始める前に身につけておくべき15の基礎技術
近年ディープラーニングが爆発的人気となっています。しかし、人工知能の手法はディープラーニングに限りません。過去のAIブームの単純なニューラルネットや論理プログラミングもあれば、遺伝的アルゴリズム、自然言語処理、音声信号処理や、画像からの動物体検出、分類問題、回帰問題、連続データ解析、強化学習といった、古典的なデータ解析や機械学習の手法もあります。これらはディープラーニングを始める前に身につけておくべき基礎技術です。「鶏を割くに焉んぞ牛刀を用いん」の諺のように、読者がデータ収集や計算コストがかかるディープラーニングの他にも適材適所の手法を選択できるよう、本書ではさまざまな人工知能の関連分野を扱いながら、Pythonでよく使われるライブラリの基本的な使い方を解説します。
book
リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック
美しいコードを見ると感動する。優れたコードは見た瞬間に何をしているかが伝わってくる。そういうコードは使うのが楽しいし、自分のコードもそうあるべきだと思わせてくれる。本書の目的は、君のコードを良くすることだ。(本書「はじめに」より) コードは理解しやすくなければならない。本書はこの原則を日々のコーディングの様々な場面に当てはめる方法を紹介します。名前の付け方、コメントの書き方など表面上の改善について。コードを動かすための制御フロー、論理式、変数などループとロジックについて。またコードを再構成するための方法。さらにテストの書き方などについて、楽しいイラストと共に説明しています。日本語版ではRubyやgroongaのコミッタとしても著名な須藤功平氏による解説を収録。