我已经尝试在逆向工程堆栈交换中发布它,但我想我会在这里交叉发布它以获得更多可见性。
我无法在 pydbg 中从调试一个线程切换到另一个线程。我对多线程没有太多经验,所以我希望我只是遗漏了一些明显的东西。
基本上,我想暂停所有线程,然后开始单步执行一个线程。就我而言,有两个线程。
首先,我暂停所有线程。然后,我在线程 2 恢复时 EIP 所在的位置设置了一个断点。(这个位置是通过使用 IDA 来确认的)。然后,我像在任何其他上下文中一样启用单步执行,并恢复线程 2。
但是,pydbg 似乎没有捕捉到断点异常!线程 2 似乎恢复了,即使它必须命中该地址,也没有迹象表明 pydbg 正在捕获断点异常。我在 pydbg 的内部断点处理程序中包含了一个“打印“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
对“魔术数字”感到抱歉,但据我所知,它们是正确的。