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

Log.i53

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

ODbgScriptの使い方

Unpack ODbgScript

ODbgScript

 ODbgScriptはユーザモードデバッガの(私的)最高傑作であるOllyDbgのプラグインで、以下のリンクからプラグイン本体とそのソースコード、ドキュメントおよびサンプルスクリプトをダウンロードすることができます。sourceforge.net

 OllyDbgにおける最も優れた機能の一つが、ユーザによる機能の拡張を可能とするプラグインアーキテクチャの提供です。ODbgScriptはアセンブリライクな言語でスクリプトを記述することによってOllyDbgの操作を自動化させることのできるプラグインとなっています。アプリケーションのデバッグにおいて、多くのタスクが目的の処理に到達するまでの多くの反復作業を伴います。本プラグインを使用することで、これらの反復作業を自動化するスクリプトを記述することができるようになります。

サンプルスクリプト:sample.osc

 このスクリプトは、SHELL32.DLLの特定の関数にブレークポイントを設置する操作を自動化したものです:

/***********************
   Sample ODbg Script
          by Epsylon3
***********************/
    // プラグインバージョンのチェック
    cmp $VERSION, "1.31"
    jae version_ok
    msg "ERROR: ODbgScript 1.31 needed !"
    ret
version_ok:
    // shell32.dllモジュールの探索
    gpa "LoadLibraryA","kernel32"
    mov handle, $RESULT
    mov sDLL, "SHELL32.DLL"
lbl_checkLibrary:
    go handle
    // esp+4 -> DLL名のポインタ
    scmpi sDLL, [[esp+4]]
    log [[esp+4]]
    log ""+[[esp+4]]
    je lbl_LibraryFound    
    jmp lbl_checkLibrary
lbl_LibraryFound:
    eval "{sDLL} found!"
    msg $RESULT
    // handle <- 戻りアドレス
    mov handle,[esp]    
    // 戻りアドレスにHBPを設置
    bphws handle,"x"    
    // 実行再開 (Shift+F9)
    esto
    // HBPを解除
    bphwc handle
    // share32!DragAcceptFilesにBPを設置
    gpa "DragAcceptFiles", sDLL
    mov handle, $RESULT
    bphws handle,"x"
    eval "Breakpoint on DragAcceptFiles() = {handle}"
    msg $RESULT
notTheGoodBreakPoint:
    esto
    cmp handle, eip
    jne notTheGoodBreakPoint
    // ブレークポイントの解除
    bc handle
    msg "script is successfully executed :)"

 mspaint.exe上でこれを試してみましょう。OllyDbgのプラグインフォルダ(デフォルトであればOLLYDBG.EXEと同一ディレクトリ)にODbgScript.dllを追加してプラグインを導入してから、mspaint.exeをOllyDbgでロードします。

 ロードしたら【Plugins】➤【ODbgScript】➤【Script Window...】でスクリプトウインドウを開きます。スクリプト上で【Load Script】から上記の"sample.osc"をロードしましょう。ロードした時点でスクリプトは実行待機状態になります:
f:id:i53:20150614035537p:plain

 "Run Script"で一括実行する以外に、F2キーでスクリプトにBPを設置、F4キーで指定したカーソルまでスクリプトの実行、Tabキーでスクリプトのステップ実行を行うことも可能です。試しにTABキーでロードしたスクリプトをステップ実行してスクリプトの動作を確かめてみてください。このOllyスクリプトが最終的にshare32!DragAcceptFilesにブレークポイントを設置する操作を自動化していることが分かります:
f:id:i53:20150614042527p:plain

 スクリプトウィンドウにはスクリプトの実行結果が逐次表示されます。またログウィンドウには"log"コマンドでスクリプト実行時の値などをログに記録することができます。単にスクリプトが実行されていくのを眺めるだけでも楽しいですしこれでアンパックの操作を全て自動化できたとすればその楽しさも一塩でしょう:)