OllyDbgの基本操作-1

参考書籍 : デバッガによるx86プログラム解析入門【x64対応版】



・ショートカットキー
共通ショートカットキー
 Ctrl + F2 : デバッギーの強制終了と再起動
 Alt + F2 : デバッギーの強制終了
 F7 : ステップイン
 Ctrl + F7 : 自動ステップイン
 F8 : ステップオーバー
 Ctrl + F8 : 自動ステップオーバー
 F9 : 停止したデバッギーの実行を再開
 Ctrl + F9 : リターン命令まで自動ステップ実行
 Alt + F9 : ユーザーコードまで自動ステップ実行
 F12 : デバッギーの実行を停止
 Esc : 各種自動ステップ実行を停止
 Alt + B : ブレークポイントを前面に表示
 Alt + C : CPUウィンドウを前面に表示
 Alt + E : モジュール一覧を前面に表示
 Alt + M : メモリウィンドウを前面に表示

・ほとんどのウィンドウで使用可能なショートカットキー
 Alt + F3 : アクティブなウィンドウを閉じる
 F5 : アクティブなウィンドウを最大化
 F6 : 下にあるウィンドウをアクティブにする
 Shift + F6 :下にあるウィンドウを逆順にアクティブにする

リストビュー上では、Shiftを押しながらのクリックやドラッグで複数項目の選択をする
Ctrlではないので注意

こちらも参考に
http://www.ollydbg.de/quickst.htm



・メニュー
1, ファイル
 開く : 実行可能ファイルを開いて実行させデバッグを開始
 アタッチ : 実行されているプロセスを指定してデバッグを開始
 終了 : OllyDbgを終了
2, 表示
 ログ : デバッギーのDLL読み込みやスレッド作成、デバッグ文字列出力などの
    デバッグ関連イベントや、ブレークポイントでのブレークなどの履歴を表示
 実行モジュール : プロセスメモリ上に読み込まれている実行可能モジュールの一覧表示
 メモリ : プロセスメモリ内で割り当てられているメモリ領域の一覧を表示
 ヒープ : プロセスメモリ内にあるヒープの一覧を表示
    Windows7/8などのWindows NT系OSでは使用不可
 スレッド : プロセスで実行されているスレッドの一覧を表示
 ウィンドウ : デバッギーが表示している
 ハンドル : デバッギーが開いているファイルなどのハンドルを一覧表示
    デバッギーがシステム関連プロセスである場合、使用するAPI関数の仕様により
    OllyDbgはハンドル取得処理でフリーズする。
 CPU : CPUウィンドウを表示
 ブレークポイント : INT 3 命令を用いたブレークポイントの設定状況一覧を表示
 ウォッチ : 特定のアドレスやレジスタの内容を監視するためのウィンドウを表示
 参照 : 各種検索実行結果などを表示するウィンドウを表示
 ラントレース : 実行処理内容のログを取得するラントレースウィンドウを表示
 ファイル : ファイルを指定して簡易バイナリエディタを呼び出す
 テキストファイル : ファイルを指定して簡易テキストエディタを呼び出す
3, 解析
 実行 : 停止しているデバッギーの実行を再開
 一時停止 : デバッギーの実行を一時停止
 再スタート : デバッギーを強制終了させて再起動
 解析終了 : デバッギーを強制終了
 詳細ステップ実行 : ステップイン
 ステップ実行 : ステップオーバー
 詳細自動ステップ実行 : ステップインの自動処理を開始
 自動ステップ実行 : ステップオーバーの自動処理を開始
 リターンまで実行 : リターン命令までの自動ステップ実行を開始
 ユーザーコードまで実行 : ユーザーコードまでの自動ステップ実行を開始
 ハードウェアブレークポイント : ハードウェアブレークポイントの設定箇所の一覧表示
4, オプション
 環境設定 : フォントなどOllyDbgの環境設定
 解析詳細設定 : 逆アセンブルコードリストの表示方法など、解析に関連する設定
 ジャスト・イン・タイム デバッグ : Just-In-Timeデバッガの設定
 エクスプローラーメニューに追加 : .exe, .dllに"OllyDbgで開く"を追加



・条件式
条件付きブレークポイント設定時に使用できる条件式
主に以下のものがある。
 0A5 : 符号なし16進数
 100. : 符号付き10進数、ピリオドをつけて入力
 EAX : レジスタの格納値を符号なし整数とみなす
 EAX. : レジスタの格納値を符号付き整数とみなす
 [402148] : アドレス402148の格納値(符号なしDWord)
 DWORD PTR [402148] : 上に同じ
 BYTE PTR [402148] : アドレス402148の格納値(符号なしBYTE)
 [SIGNED BYTE 402148] : アドレス402148の格納値(符号付きBYTE)
 405000 : アドレス405000の格納値のアドレスに格納された符号なしDWord
 2+3-4*5/2 : 四則演算
 DWORD PTR [402148]==0FFFF : 左辺と右辺がイコールならば条件を満たす
 DWORD PTR [402148]!=2356+52/2 : 左辺と右辺が異なるならば条件を満たす
 DWORD PTR [402148]>9999. : 左辺が右辺より大ならば条件を満たす
 DWORD PTR [402148]>=EAX : 左辺が右辺以上ならば条件を満たす
 BYTE PTR [402148]<100 : 左辺が右辺より小ならば条件を満たす
 BYTE PTR [402148]<=AL : 左辺が右辺以下ならば条件を満たす
 EAX<0. : EAXの格納値が0~0x7FFFFFFFでなければ条件を満たす
 MSG==111 : メッセージが定数0x111のWM_COMMAND
 [ESP+8]==WM_ACTIVATE : メッセージ名でメッセージの種類を指定可能
 [STRING 408300]=="Good" : アドレス408300以降の4バイトに文字列Goodが格納
 EAX=="Good" : 上の判定アドレスにEAXを指定
 UNICODE [EAX]=="Good" : 上の例でも文字列がUNICODEの場合



・検索オプション
アセンブルコードリスト上での、ニーモニックの検索に特殊オプションが使用可能
検索はCtrl + Fのショートカットキーで行える。
検索対象を以下の指定名で指定可能
 R8 : すべての1バイトのレジスタ(AL, BL, CL, DL, AH, BH, CH, DH)
 R16 : すべての2バイトのレジスタ(AX, BX, CX, DX, SP, BP, SI, DI)
 R32 : すべての4バイトのレジスタ(EAX, EBX, ECX, EDX, ESP, EBP, ESI, EDI)
 RA, RB : 疑似的な4バイトのレジスタ
 CONST : あらゆる定数
 JCC : すべての条件ジャンプ命令(JE, JC, JNGE, ...)
これにより、「JCC CONST」や「MOV R32 [402148]」といったあいまい検索ができる。
RAを使い、「XOR RA,RA」と検索することで、XORで同じレジスタを演算(0クリア)する部分を検索できる
「LEA RB, 4+RA+RA」の場合は、RBと異なるレジスタRAが、2回加算される命令を検索できる。



・ラントレース
ラントレースで、自動でステップ実行されたコードの情報を記録できる。
実行状況を変化させ、どのような条件分岐が行われたかを比較したり、
EIPレジスタの格納アドレス範囲などの条件を指定して、ステップ実行を停止させることも可能。
ただし、例外の発生やカーネルモードの処理を呼び出すSYSENTERの実行などで、正常にラントレースを行えなくなる場合がある。