その時々

その時々で違うんです。特に決まっていないんです。

リバースエンジニアリング

オライリーリバースエンジニアリングをやってるんですけど、
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

のままなんです。
原因を調査中。