2012年1月22日日曜日

リバースエンジニアリング

積読になっていた「リバースエンジニアリング」を読み始めました。

主にデバック手法について書かれた本で、サンプルプログラムの記述言語はPythonですがOSのコアライブラリにアクセスするためC言語の知識も必要なようです。

なので、馴染み薄なキーワードをメモしていきます。

1章 開発環境のセットアップ
P.11
構造体・・・変数をグループ化したもの。
C
struct beer_recipe
{
  int amt_barley;
  int amt_water;
}
Python
class beer_recipe(Structure):
  _fields_ = [
    ("amt_barley",c_int),
    ("amt_water",c_int),
  ]

共用体・・・すべてのメンバ変数が同一のメモリ位置を占める。
C
union {
  long  barley_long;
  int    barley_int;
  char barley_char[8];
}barley_amount;
Python
class barley_amount(Union):
  _fields_ = [
    ("barley_long",c_long),
    ("barley_int",c_int),
    ("barley_char",c_char * 8),
  ]
※たまに聞くけどJavaスタートの僕には馴染みが薄い。
P.13
Python ctypesで配列を定義・・・その配列に割り当てたい要素の数だけ型を乗算する。

2章 デバッガの基本原理
P.15
ホワイトボックスデバッガ・・・ソースコードを細やかにトレースする機能を備えたもの。
ブラックボックスデバッガ
ユーザーモード(ring 3)・・・アプリケーションが動作するプロセッサモード(CPUが動作権限を制限するモード)。ユーザモードの場合、アプリケーションは最小の権限で動作する。
カーネルモード(ring 0)・・・権限が最高レベルとなる。OSの中核部分とドライバその他低水準のコンポーネントが作動する。
P.16
OllyDbg・・・ユーザーモードデバッガの代表格。
知的デバッガ・・・スクリプトの利用やコールフックをはじめ広範な機能をサポート。特にバグの検出やリバースエンジニアリングに役立つ高度な機能を備えているのが一般的。
PyDbg・・・知的デバッガの代表格。
Immunity Debugger・・・知的デバッガの代表格。
P.17-18
汎用レジスタ・・・以下8つのレジスタ。
EAX・・・アキュムレータ。計算処理の遂行と関数からの戻り値格納。
EDX・・・データレジスタ。EAXの拡張。
ECX・・・カウントレジスタ。ループ処理用。当レジスタは、上方向ではなく下方向にカウントすることが重要。(ループカウンタがカウントアップの場合、実際のコードとアセンブリコードが逆になる。)
ESI・・・データ処理のソースインデックス。入力データストリームの位置を保持。読み取り用。
EDI・・・デスティネーションインデックス。データ処理の結果を格納する位置を指すポインタ。書き込み用。
ESP・・・スタックポインタ。スタックの先頭を指すため、戻りアドレスを指すことになる。
EBP・・・ベースポインタ。呼び出しスタックの最下部を指す。
EBX・・・特定の用途向けに設計されていない唯一のレジスタ。必要に応じてデータ記憶に使用することも可能。
EIP・・・各時点で実行される命令を指す。上記の汎用レジスタには含まれないが重要なレジスタ。
P.18-20
スタック・・・ローカル変数がスタック上にアロケートされる仕組みが重要。
P.20-21
デバッガ・・・デバッグイベントを待つ永久ループとして作動。
デバックイベント・・・(一般的なもの)ブレークポイント到達。メモリ違反(アクセス違反、セグメンテーションフォールととも言う)。デバッグ対象プログラムが生成した例外。
P.20-28
ブレークポイント
ソフトウェアブレークポイント
ハードウェアブレークポイント
メモリブレークポイント

3章 Windowsデバッガの構築
P.32
windll.kernel32.CreateProcessA()・・・Windowsプロセスの生成。
P.36-37
windll.kernel32.OpenProcess()・・・プロセスのハンドル取得。
windll.kernel32.DebugActiveProcess()・・・プロセスにアタッチ。
windll.kernel32.WaitForDebugEvent()・・・デバッグイベントの捕捉。
windll.kernel32.ContinueDebugEvent()・・・デバッグイベント捕捉後、プロセス再開。
windll.kernel32.DebugActiveProcessStop()・・・デバッガからプロセス切り離し。
P.42-43
windll.kernel32.OpenThread()・・・スレッドのハンドル取得。
windll.kernel32.CreateToolhelp32Snapshot()・・・スレッドを列挙。
windll.kernel32.Thread32First()・・・列挙したスレッドの先頭を取得。
windll.kernel32.Thread32Next()・・・次のスレッドを取得。
windll.kernel32.GetThreadContext()・・・スレッドのコンテキスト情報を取得。
windll.kernel32.SetThreadContext()・・・スレッドのコンテキスト情報を変更。
windll.kernel32.CloseHandle()・・・スレッドのハンドルを解放。
P.46
デバックイベント一覧
イベントコード/イベントコード値/共用体uの値
0x1/EXCEPTION_DBUG_EVENT/u.Exception
0x2/CREATE_THREAD_DEBUG_EVENT/u.CreateThread
0x3/CREATE_PROCESS_DEBUG_EVENT/u.CreateProcessInfo
0x4/EXIT_THREAD_DEBUG_EVENT/u.ExitThread
0x5/EXIT_PROCESS_DEGUG_EVENT/u.ExitProcess
0x6/LOAD_DLL_DEBUG_EVENT/u.LoadDll
0x7/UNLOAD_DLL_DEBUG_EVENT/u.UnloadDll
0x8/OUTPUT_DEBUG_STRING_EVENT/u.DebugString
0x9/RIP_EVENT/u.RipInfo
P48-49
例外イベントコード一覧
例外イベントコード/例外イベントコード値/説明
0xC0000005/EXCEPTION_ACCESS_VIOLATION/アクセス違反
0x80000003/EXCEPTION_BREAKPOINT/ソフトウェアブレークポイント
0x80000001/EXCEPTION_GUARD_PAGE/メモリブレークポイント
0x80000004/EXCEPTION_SINGLE_STEP/ハードウェアブレークポイント
P.50-51
windll.kernel32.ReadProcessMemory・・・プロセスのメモリ読み込み。
windll.kernel32.WriteProcessMemory・・・プロせずのメモリ書き込み。
P.52-53
windll.kernel32.GetModuleHandleA・・・モジュール(.dll、.exe)へのハンドル取得。
windll.kernel32.GetProcAddress・・・関数の仮想アドレスを検出。
P.61
windll.kernel32.GetSystemInfo・・・デフォルトのページサイズの問い合わせなど。
P.61-63
windll.kernel32.VirtualQueryEx・・・該当するページに関する情報を取得。
windll.kernel32.VirtualProtectEx・・・パーミッションを設定するのに利用。

4章 PyDbg - ピュアPythonのWindowsデバッガ
P.67-69
ブレークポイントハンドラ
P.69-72
アクセス違反ハンドラ
クラッシュハンドラ
P.73-75
プロセススナップショット

0 件のコメント:

コメントを投稿