我已經嘗試在反向工程堆棧交換中發佈此內容,但我認爲我會在此處交叉發佈以獲取更多可見性。PyDbg中的線程切換
我無法在pydbg中從一個線程切換到另一個線程。我沒有太多的多線程經驗,所以我希望我只是錯過了一些明顯的東西。
基本上,我想暫停所有線程,然後在一個線程中啓動單步執行。在我的情況下,有兩個線程。
首先,我暫停所有線程。然後,當線程2恢復時,我會在EIP所在的位置設置一個斷點。 (此位置通過使用IDA進行確認)。然後,我在任何其他情況下啓用單步執行,並恢復線程2.
但是,pydbg似乎沒有捕獲到斷點異常!線程2似乎恢復,即使它必須命中該地址,沒有跡象表明pydbg捕捉到斷點異常。我收錄了「打印‘HIT斷點’pydbg內部的斷點處理程序中,而且似乎永遠不會恢復線索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
很抱歉的「幻數」,但他們是正確的,據我可以告訴。