我在 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
对“神奇数字”感到抱歉,但据我所知,它们是正确的。