おもちゃバコ

句読点がキショい

「デバッガによるx86プログラム解析入門 x64対応版」を読んだ

ちは~

デバッガによるx86プログラム解析入門 x64対応版 を読んだ感想,備忘録です。


Amazon

Kindleで購入しました。

2014年11月1日発行の第1版第1刷なので,現在(20221105)では内容が少し古いと感じる部分がありました。
ただ,プログラム解析の本質には関係ないので大体の人は気にならないと思います。


対象読者

・プログラム解析に興味がある人
・システム層のプログラムに興味がある人
アセンブリの取っ掛かりが欲しい人
コンピュータサイエンス関係の学生

解析対策と個人的な興味を兼ねて本書を購入しました。
ブレークポイントの仕組みなどについても解説されており,エンジニアなら読んで損はないはず。

何のとは明言しませんが,不正対策を行うエンジニアに特におススメです。

C言語C++を学んでいれば読める内容だと思います。
(この書籍を手に取る人は基本的に問題ないはず)

対象はWindowsなことに注意。


メモ

ちょうざつ~

Chapter1 デバッガとは

・デバッガの用途
 作成したプログラムのデバッグ以外にも,第三者のプログラム解析に利用される。
 -> 開発終了したソフトウェアのバグ修正とかね。

・対象による分類
 ・ユーザモードデバッガ
  OS上でユーザモードで動作するアプリのデバッガ。
  -> 他で実行されているプログラムを制御下に置く権限を持つ。
 ・カーネルモードデバッガ
  OSの中核で動作する特殊なドライバやアプリを対象としたデバッガ。

ソースコードによる分類
 ・シンボリックデバッガ
  あらかじめ出力したデバッグ用情報などをもとにデバッグする。
  -> Visual Studioのデバッガとかかな。
 ・アブソリュートデバッガ
  シンボリックデバッガ以外のデバッガ。

・その他の分類
 ・Just-In-Timeデバッガ
  実行中のプログラムが死んだときに自動的に起動させてデバッグする。
  -> Windowsに備わってるJITデバッグ機能に対応しているデバッガ。
  -> Visual Studioにもあるはず。

・代表的なデバッガ
 1. OllyDbg
  フリーウェア。多分世界で一番人気。
 2. SoftICE
  カーネルモードデバッガ。MSがフリーのカーネルモードデバッガを公開したことで姿を消した。
  個人でカーネルモードデバッガを開発するのは厳しいかもね。
 3. Debugging Tools For Windows
  Microsoftが公開しているデバッグツール群。
  64ビット対応の主要なデバッガ。
 4. IDA
  みんな大好き有能でデバッグツール。
  高機能だけど高価。
  -> マルウェア解析でよく見るよね。

WindowsXPまではデバッガ終了時にプログラムも終了してた。
 1度アタッチされたらデバッガと運命を共にする。
 -> タスマネで終了できないアプリにアタッチしてデバッガごと終了する裏技。

・ステップ実行
 ステップオーバ,ステップイン,ステップアウトを説明できるように。

.NET Framework対応アプリ
 C/C++と違い,プログラム自体にネイティブコード元が格納されている。
 -> .NET Framework側でネイティブコードを実行。

リバースエンジニアリング
 使用許諾で禁止されているが,独禁法著作権的には云々らしい。
 -> エミュレータや互換機開発で行われてるぐらい?
 -> 近年では,マルウェア解析でお盛んになっている。

Chapter2 デバッガと関連ツールを使用するために必要な基礎事項

・基礎は大事
 プログラム解析の前にコンピュータの基礎知識は身に着けよう。
 -> パタヘネとヘネパタを読んでおけば大丈夫だと思う。
 -> よくわからないときは時間を置こう(個人的な感想)

・ニブルとバイト
 コンビ名みたい。
 オクテットも忘れないでね。

・リトルエンディアン
 大体のWindowsが利用しているCPUはこっち。
 -> 家庭用ゲーム機とかだとビッグエンディアンもある。

・データ型
 Byte, Word ,DWord, QWordは頻出。

・メモリアドレス0x400000
 基本的にEXEが読み込まれるプロセスメモリ上のアドレスは0x400000。
 -> ソフト付属のDLLは基本的に0x10000000に読まれる。
 -> 複数DLLを使用する場合は別アドレスにも読まれる(リロケーション)

x86系32ビットCPUの汎用レジスタ
 EAX, EBX, ECX, EDX, ESI, EDI
 特殊用途のESP, EBP, EIP, EFLAGS
 -> 覚えるために書いた。
 EAXとかはAHとALに分けられる。
 -> AHが上位1バイト,ALは~。
 本来の用途はあるが,別にその用途じゃなくても良い。
 -> EAXはアキュームレータとか。

・Address Space Layout Randomization(ASLR)
 脆弱性緩和機能のことで,Vista以降に実装されている。
 -> 0x400000固定ではなくランダムなプロセスメモリ上のアドレスに読まれる。
 -> ASLR対応設定は無効化されやすいかも。

・NOP命令
 既存コードを上書きしたいときによく使用されるよね。

・ネイティブAPI
 Windows NT系OSが内部で使用するAPIで,ユーザモードとカーネルモードの仲介役が多い。
 システム詳細部に入り込めてしまうため,資料は基本的に非公開。
 -> リバースエンジニアリングによって詳細が明らかにされたAPIマルウェアに利用されぎみ。
 -> ntdll.dll格納されているのが多い(NtReadFileとか)

・PEファイル
 大体のWindows用実行ファイルをPortable Executable(PE)ファイルと呼ぶ。
 ・MZスタブ
  実行可能ファイルの先頭ブロック。オフセット。
 ・COFFファイルヘッダ
 ・オプションヘッダ
  Windows上で実行される際の基本情報部分。
  PEファイルヘッダ中で注目の的。
  -> AddressOfEntryPointとか。
  -> ImageBaseを基準とした相対アドレスはRVA(相対仮想アドレス)
 ・セクションテーブル
  プログラムコード,リソースなどを格納する各セクション情報。
  -> .text, .dataなど。

・Import Address Table(IAT)
 プログラムで使用するAPI関数の開始位置アドレスを格納したテーブル。
 -> DLLファイル中のAPI関数がメモリ上のどこにあるかを表現。
 -> プログラム実行時にIATが意味をもつ。

・ntdll.dll/Kernel32.dll/USER32.dll
 Windows上で実行されるプロセスでは,これらDLLのメモリ上アドレスは同一。
 -> 特定DLLのエクスポート関数を実行するにはrundll32.exe

rootkit
 OS深層部にあるデータを変更し,特定プロセスを隠ぺいする機能を持つ。

カーネルドライバのデジタル署名
 Microsoftの認定組織から承認が必要で,プログラム解析用途のツールはデジタル署名が難しい。
 -> Vista以降はカーネルドライバにデジタル署名がほぼ必要。

・プロセスメモリ
 32bit環境では,各プロセスに約4GBののプロセスメモリ空間が割り当てられる。
 -> プロセスメモリを「ページ」に分け,必要な分だけメモリに読み込み,
   後はHDDなどに保存する「ページング方式」が使用される。
 -> プロセスメモリ上のアドレスと記憶装置としてのメモリ上のデータ位置は異なる(仮想アドレス空間)
 -> Windowsのページサイズは0x10000バイト単位らしい。
 -> 0x80000000以降はカーネルモード用。

・プロセスメモリ上の各ページのアクセス種類
 実行,読み込み,書き込み,アクセス不可などの属性がある。
 -> デバッガやプロセスメモリエディタなどは属性変更の機能を持っていることが多い。

ブレークポイント
 ・INT 3命令(0xCC)
 ・メモリアクセス違反
  プロセスメモリ上の任意アドレスを含むページをアクセス不可にして,そこにアクセスしたときにOSに落としてもらう。
  OS上の不正な処理を故意に引き起こしているのであまり良くない。
  -> 独自ASSERT的な奴?
 ・ハードウェアブレークポイント
  ブレーク条件を色々設定でき,プロセスメモリのアクセス属性を書き換えるわけではないのでいい感じ。

・ステップ実行などの仕組み
 デバッギーの処理を停止状態でEFLAGSのトラップフラグをセットする。
 -> 実行後にデバッガ用の例外処理を発生させ,OS経由でデバッガに通知している。

・一般的な解析
 1. 動的解析
 2. 静的解析
 3. ブラックボックス手法
 4. ホワイトボックス手法

Chapter3 デバッガと関連ツール

ツール紹介がメイン。
小話が面白い。

・OllyDbg
 USB等から利用されることを考慮して,設定ファイルは.ini保存らしい。

・ファイルマッピング
 ファイルの編集対象部分のみを読み込む。
 -> メモリ節約。

・プロセスメモリエディタ
 改造コードとかのアレ。
 -> うさみみハリケーンとか

・リソースエディタ
 実行ファイルのリソースセクション解析ソフト。
 -> デバッグ用に封印されている機能を探すときなど。

仮想マシンの利用
 解析ツール対策しているソフトをゲストOSで立ち上げ,ホストOSでは仮想マシン構築ソフトをデバッガに掛ける。
 -> 通常より解析が困難になるがアプローチとしては有効。

Chapter4 デバッガでプログラムの実行処理を追いかける

OllyDbgの説明が主。
著者作成のプログラムを対象に演習を行う。

・どこに注目するか
 1. プログラム解析前
  コンパイラやパッカー,リソースエディタでの項目など。
 2. 解析時
  レジスタ,プロセスメモリの内容。
  条件分岐,呼び出しAPI関数など。
 3. 関連要素
  ソフト同梱のヘルプなどの文書。
  作者の開発日誌や書き込み内容,バグ修正内容など。
  -> ソーシャルエンジニアリング的な要素も重要。

・メッセージボックスセオリー
 CDチェック警告などをわざと表示し,その周辺をバイナリエディタでチョメる。
 -> MessageBox関数が呼び出されていることが多かったのが由来。

Chapter5 実践的な処理の変更

サンプルプログラムのCD/DVDチェック回避から学ぶ。
現代では通じないと思うが,プログラム解析の観点ではわかりやすい。

・パラサイトルーチン
 コードインジェクション

・2重起動チェック
 CreateMutex関数がよく使われる。
 -> ミューテックスオブジェクトが重複しないように。
 -> 用途が限定されやすいので無効化して回避する手段もあり。
 EnumWindows関数で検索も考えられる。

・画面切り替えチェック
 ウィンドウのアクティブを監視する機能。

・デバッガ起動チェック
 プログラム解析対策の基本要素だね。
 -> EnumWindowsやGetClassNameは使われやすいAPI
 IsDebuggerPresent対策
 -> GetProcAddress関数呼び出しを監視する。

・差分パッチコード
 該当する文字列を別文字列に置換する。
 -> なるほどねってなった。

Chapter6 ゼロからはじめるデバッガ自作

Windows7/8用のデバッガを製作方法が解説されている。
Visual Studioの設定やデバッガ作成に必要な各種APIの説明付き。

・デバッガの基本処理
 デバッギーの起動,起動済みプロセスへのアタッチ。
 プロセス作成,例外発生などの通知を待つ。

・SeDebugPrivilege
 デバッガがよく使用する特権
 -> Windowsの制約回避のため使用することを推奨
 -> CreateProcess, OpenProcessなどのAPIを解説

・プロセスメモリのアクセス属性
 アクセス属性の変更はVirtualProtectEx関数を併用する。
 -> PAGE_EXECUTE_READWRITEが多い。
 -> 0x1000バイトのページ単位

・逆アセンブラ
 OllyDbg公式サイトで配布されているソースコードがわかりやすい。

APIフック
 解析対象プロセスのモジュール内のIATを解析し,
 任意のAPI関数アドレスを書き換えるのが主流。
 -> CreateRemoteThread関数など

Chapter7 デバッガ対策

解析ツール検出によく使われるAPI関数が解説されている。

マルウェア解析技術についても解説されている。
-> 別書籍で知っている内容だったので流し見

・基本的に考えは「解析を妨害する」こと
 解析を完全に防ぐことは不可能
 -> 解析行為を諦めさせることを念頭に置く
 -> 耐タンパー化技術,難読化

ロジックボム
 解析を検出したときにシステムファイルを削除するなど
 -> マルウェアがよく使う過剰な対抗手段

・検出技術と対策技術はいたちごっこ

・パッカーとクリプター

Chapter8 デバッガに関する問題

プログラム解析の発展などについて多角的に解説されている。

デジタルミレニアム著作権法(DMCA)
 プログラム解析とPCゲームの著作権について
 -> 解析結果の公開や法律などの問題点が指摘されている。
 -> 解析結果の販売などの判例

・プログラム解析におけるrootkit
 カーネルモードで動作してAPIフック
 -> カーネルレベルのプロセス隠蔽はデバッガでも解析が面倒

・ネットゲーム
 modやチート,RMTなどについて

マルウェア対策としてのrootkit
 ユーザが気づかないままrootkit技術を使用
 -> rootkit技術の利用は賛否が分かれる

ロジックボムの利用
 誤作動や実装時間,存在が知れ渡った際の風評を考慮すべき

Winny
 開発者とソフトウェアのもたらす影響について
 -> ソフトウェアが違法行為を助長する可能性の把握は困難
 -> 関連書籍を購入したのでそっちで詳しく見てみる予定

・プログラム解析技術の悪用
 技術の悪用防止は現実的に不可能
 -> 用途は利用者の良識次第
 -> Winnyがその例

Chapter9 アセンブリ言語によるプログラミング基礎

アセンブリ言語の基礎を解説
-> MASM32やWinAsm Studioなどについても言及

アンセブリを学びたいときはこの章を読み込む
-> プロセスメモリパッチャーの作成を説明している

アセンブリ言語とプログラム解析
 プログラム解析技術を身に着ける方法として優秀
 -> スキルアップとしては優秀だが時間と労力は凄い

Chapter10 64ビットアプリケーションの解析

32ビットと64ビットの解析方法の相違点について解説されている

・32ビットアプリケーション解析の応用
 -> まずは32ビットの解析を学ぼう

Chapter11 情報セキュリティとプログラム解析

・日本における同人ゲームなどの個人製作アプリ
 大手企業のソフトと違い脆弱性対応はほとんどされない
 -> 海外のリバースエンジニアリング界隈で注目されていないだけ
 -> 脆弱性修正パッチと銘打ってマルウェアを仕込む輩がいる


感想

プログラム解析に興味を持った時に出会った書籍でしたが, 解析手法について素人でもわかりやすく解説されていてとても読みやすかったです。

特にプログラム解析手法だけでなく,それら解析ソフトの利用用途や開発して公開することのリスクなど, 技術者の倫理的な観点も絡めて解説されていたので新鮮でした。

また,おまけのページにアセンブリや解析によく利用されるWindowsAPIについても説明されており, 個人的にとりあえず手元に置いておきたい本です。

学生の時に読んでおきたい1冊でした。