読者です 読者をやめる 読者になる 読者になる

Log.i53

Themidaのアンパックを目指すブログ改め使い物になるえんじにゃを目指すブログ

ODbgScript TIPS

 リファレンスだけ見ても必要な情報にたどり着くのに時間を要したのでどういう場面でどのコマンドを使うべきなのか用例を纏めておくことにしました。随時更新予定です。
 
 各種コマンドの詳細についてはリファレンス翻訳の方を参考にしてください。i53.hatenablog.jp

OllyDbg操作関連

実行させたい【RUN, ERUN】

    // 実行(F9)する
    run
    // 例外無視で実行(Shift+F9)する
    erun

ステップオーバーを実行させたい【STEP, STO, ESTEP】

    // ステップオーバー(F8)を実行する
    step
    sto
    // 例外無視でステップオーバー(Shift+F8)を実行する
    estep

ステップイントゥを実行させたい【STI, ESTI】

    // ステップイントゥ(F7)を実行する
    sti
    // 例外無視でステップイントゥ(Shift+F7)を実行する
    esti

リターン命令まで一気に実行させたい【RTR】

    // "Run to return"機能によりリターン命令まで実行(Ctrl+F9)する
    rtr

ユーザコードまで一気に実行させたい【RTU】

    // "Run to user code"機能によりユーザコードまで実行(Alt+F9)する
    rtu

ループ構文

任意のアドレスに到達するまでステップを繰り返す

STEP_UNTIL:
    // アドレス0x401000以降に到達するまでステップオーバー
    sto
    cmp eip, 401000
    jbe STEP_UNTIL

特定の命令を実行するまでステップを繰り返す

FIND_PUSHAD:
    // GCIコマンドで現在の命令のオペコード文字列を取得
    // PUSHAD命令が実行されるまでステップオーバーを繰り返す
    gci eip, COMMAND 
    cmp $RESULT, "PUSHAD" 
    sto
    jne FIND_PUSHAD 

ブレークポイント関連

無条件ソフトウェアブレークポイントを設置したい【BP】

    // アドレス0x401000にSBPを設置
    bp 4010000

条件付きソフトウェアブレークポイントを設置したい【BPCND】

    // アドレス401000にECXが1の時にのみブレークする条件付きブレークポイントを設置
    bpcnd 401000, "ECX==1" 

指定したAPIにソフトウェアブレークポイントを設置したい【BPX】

    // 現在のモジュール内にある"GetModuleHandleA"APIにSBPを設置
    bpx "GetModuleHandleA"

ソフトウェアブレークポイントをクリアしたい【BC】

    // アドレス0x401000のSBPをクリアする
    bc 401000
    // アドレスの指定がなければ全てのSBPをクリアする
    bc

ハードウェアブレークポイントを設置したい【BPHWS】

    // アドレス0x401000に実行時HBPを設置
    bphws 401000, "x"
    // ESPに読み込み時HBPを設置
    bphws esp, "r"
    // ESP-4に書き込み時HBPを設置
    bphws esp-4, "w"

ハードウェアブレークポイントをクリアしたい【BPHWC】

    // アドレス0x401000のHBPをクリアする
    bphwc 4010000
    // アドレスの指定がなければ全てのHBPをクリアする
    bphwc

ブレーク発生時にスクリプトを遷移させたい【EOB】

    // ブレーク(SBP, HBP)発生時にラベルBREAKに遷移させる
    eob BREAK
    run
BREAK:
    ... // 以下ブレーク後の操作    

検索関連

特定の命令列を検索したい【FIND, FINDOP】

    // 現在のアドレス以降にある以下の命令列を検索
    //  - db 6A 00          : PUSH 0
    //  - db E8 ** ** ** ** : CALL ********
    // 最初に見つかったもののアドレスを$RESULTに格納する
    find eip, #6A00E8#
    // ワイルドカード"?"を含めることも可能
    find eip, #6A??E8#

特定のASMコマンドを検索したい【FINDCMD】

    // GREFコマンドを利用して複数の検索結果を参照できる
    mov line, 1
    findcmd eip, "xor R32,R32"
next:
    gref line
    cmd $RESULT,0
    je finished
    inc line
    jmp next
finished:
    ...
    // セミコロンで複数のコマンド列を指定することも可能
    findcmd 401000, "nop;nop;nop"
    msg $RESULT