これをリバース エンジニアリング スタック交換に投稿しようとしましたが、可視性を高めるためにここに相互投稿すると思いました。
pydbg で 1 つのスレッドから別のスレッドにデバッグを切り替えるのに問題があります。私はマルチスレッドの経験があまりないので、明らかな何かが欠けているだけだと思っています。
基本的に、すべてのスレッドを一時停止してから、1 つのスレッドでシングル ステップを開始します。私の場合、2 つのスレッドがあります。
まず、すべてのスレッドを中断します。次に、スレッド 2 が再開されたときに EIP が存在する場所にブレークポイントを設定します。(この場所は IDA を使用して確認されています)。次に、他のコンテキストと同じようにシングル ステップを有効にして、スレッド 2 を再開します。
ただし、pydbg はブレークポイントの例外をキャッチしていないようです! スレッド 2 が再開したように見え、そのアドレスに到達する必要がありますが、pydbg がブレークポイントの例外をキャッチしているという兆候はありません。pydbg の内部ブレークポイント ハンドラ内に "print "HIT BREAKPOINT" を含めましたが、スレッド 2 の再開後に呼び出されることはないようです。
次にどこに行けばいいのかよくわからないので、何か提案をいただければ幸いです。
dbg.suspend_all_threads()
print dbg.enumerate_threads()[0]
oldcontext = dbg.get_thread_context(thread_id=dbg.enumerate_threads()[0])
if (dbg.disasm(oldcontext.Eip) == "ret"):
print disasm_at(dbg,oldcontext.Eip)
print "Thread EIP at a ret"
addrstr = int("0x"+(dbg.read(oldcontext.Esp + 4,4))[::-1].encode("hex"),16)
print hex(addrstr)
dbg.bp_set(0x7C90D21A,handler=Thread_Start_bp_Handler)
print dbg.read(0x7C90D21A,1).encode("hex")
dbg.bp_set(oldcontext.Eip + dbg.instruction.length,handler=Thread_Start_bp_Handler)
dbg.set_thread_context(oldcontext,thread_id=dbg.enumerate_threads()[0])
dbg.context = oldcontext
dbg.resume_thread(dbg.enumerate_threads()[0])
dbg.single_step(enable=True)
return DBG_CONTINUE
「マジックナンバー」については申し訳ありませんが、私が知る限り正しいです。