リバースエンジニアリング
オライリーのリバースエンジニアリングをやってるんですけど、
pydbgのところで、苦戦中です。
ちなみに環境はPython2.7です。
pydbgのインストール
1. pydbgのインストールはTortoiseSVNをインストール
2. http://paimei.googlecode.com/svn/trunk/からPaiMeiをチェックアウト
3. pydbg, pgraph, pida, utilsをC:\Python27\lib\site-packagesにコピー
4. バイナリエディタでpydbgディレクトリ内のpydasm.pydを開き
5. python26.dllという文字列を検索、python27.dllに置換。(1箇所)
4.1 ブレークポイントハンドラの拡張
printf_loop.py
-*- coding: utf-8 -*- from ctypes import * import time msvcrt = cdll.msvcrt counter = 0 while 1: msvcrt.printf("Loop iteration %d!\n" % counter) time.sleep(2) counter += 1
printf_random.py
# -*- coding: utf-8 -*- from pydbg import * from pydbg.defines import * import struct import random # これがユーザー定義コールパック関数 def printf_randomizer(dbg): # ESP + 0x8に位置するカウンタの値をDWORDとして読み取る parameter_addr = dbg.context.Esp + 0x8 counter = dbg.read_process_memory(parameter_addr, 4) # read_process_memoryからはパックしたバイナリ文字列が返されるため # 利用する前にアンパック処理が必要 counter = struct.unpack("L", counter)[0] print "Counter: %d" % int(counter) # ランダムな数値を生成してから、プロセスに適切に書き戻されるよう # バイナリ形式にパック random_counter = random.randint(1, 100) random_counter = struct.pack("L", random_counter)[0] # ランダムな数値で書き替えてプロセスを再開 dbg.write_process_memory(parameter_addr, random_counter) return DBG_CONTINUE # pydbgクラスをインスタンス化 dbg = pydbg() # printf_loop.pyプロセスのPIDをここで指定 pid = raw_input("Enter the printf_loop.py PID: ") # そのプロセスにアタッチ dbg.attach(int(pid)) # printf_randomizerをコールバック関数に指定して # プレークポイントを設定 printf_address = dbg.func_resolve("msvcrt", "printf") dbg.bp_set(printf_address, description = "printf_address", handler = printf_randomizer) # プロセスを再開 dbg.run()
printf_loop.pyを実行し、PIDを調べる。タスクマネージャーやTASKLISTコマンドなどで。
別のウインドウでprintf_random.pyを実行し
調べたPIDを入力。
そうすると、
Loop iteration 0! Loop iteration 1! Loop iteration 2! Loop iteration 3! Loop iteration 4!
を横取りして、
Counter: 4 Counter: 5 Counter: 6
となり、
Loop iteration 0! Loop iteration 1! Loop iteration 2! Loop iteration 3! Loop iteration 4! Loop iteration 32! Loop iteration 33!
というような感じで、書き変わるみたいなんですけど、
Loop iteration 0! Loop iteration 1! Loop iteration 2! Loop iteration 3! Loop iteration 4! Loop iteration 5! Loop iteration 6!
のままカウントアップし、
Counter: 4 Counter: 4 Counter: 4
のままなんです。
原因を調査中。