今回は一通りは本に書いてあるコードを見ながらPyDbgというPythonのライブラリを触ってみたので、今度は自力でコードが書けるようにしたいと思い、記事を書きます。
はっきり言って眠いです。
なので、誤字脱字、クズコード、やる気のない文章等が蔓延する可能性はございますが、ご容赦ください。
まずはPyDbgの説明。
PyDbgはPythonのライブラリで、オープンソースでかつ強力なWindowsデバッガとして知られています。(インストール方法などは近々、別記事で詳しくまとめます)
次に早速ですが、単純なデバッガのコードを作ってみます。
from pydbg import * from pydbg.defines import * import struct # 後でこの関数をブレークポイント時のコールバック関数に設定する def callback(dbg): # 何か入力しないと先に進まないようにする raw_input("Enter to restart: ") # デバッグを再開する return DBG_CONTINUE # pydbgをインスタンス化 dbg = pydbg() # PIDを入力 pid = raw_input("PID: ") # 入力されたPIDにアタッチ dbg.attach(int(pid)) # printf()関数にブレークポイントを設定し、その時callback()関数を呼び出す checking_address = dbg.func_resolve("msvcrt","printf") dbg.bp_set(checking_address, description="checking_address", handler=callback) # デバッガを起動 dbg.run()
このスクリプトを起動し、お目当てのprintf文の入ったプログラムのプロセスのPIDを入力すると、printf()関数の部分でプログラムが停止するはずです。
スクリプト側で何か入力して(または何も入力せずに)Enterを押すと、また次の処理に移るはずです。
今回は簡単な処理ですが、PyDbgの様々な機能を使うといろんなデバッグが可能となります。
ちなみに、私は初心者なのでまだあまりアドレス空間の考え方に慣れていません。
本などのサンプルコードで、[esp+0x8]などと書いてあっても、一瞬何をしているのかわからない程度です。
この辺にもなれながら、PyDbgを使ったデバッグの仕方を勉強していきたいと思います。
追記:C++のコンパイラでコンパイルしたEXEファイルでは、名前修飾が存在するため、ブレークポイントを設定できません。
またextern "C"を設定して試してみましたが、これでも動かないようでした。
とりあえず、C言語のコンパイラでコンパイルするようにすると動きます。