我在从调试一个线程切换到pydbg中的另一个线程时遇到麻烦。我对多线程没有太多经验,所以我希望我只是缺少明显的东西。

基本上,我想挂起所有线程,然后开始单步执行一个线程。就我而言,有两个问题。

首先,我暂停所有线程。然后,我在恢复线程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


很抱歉,“魔术数字”是正确的,据我所知。

#1 楼

您的问题之一是,您尝试单步执行Thread2,并且仅在代码中引用Thread1:

dbg.enumerate_threads()[0] # <--- Return handle to the first thread.


此外,您发布的代码不是反映了脚本的完整结构,因此很难判断您是否有其他错误。您还尝试在可分解指令的子分支中设置断点,这在逻辑上对我来说没有多大意义。让我尝试解释我所知道的,并以有组织的方式进行布置。这样,您可以回顾一下代码,重新考虑并更正它。

让我们从使用pydbg调试应用程序的基本框架开始:


创建调试器实例
附加到进程
设置断点
运行它
断点被击中-处理它。

它看起来像这样:

from pydbg import *
from pydbg.defines import *

# This is maximum number of instructions we will log
MAX_INSTRUCTIONS = 20

# Address of the breakpoint
func_address = "0x7C90D21A"

# Create debugger instance
dbg = pydbg()

# PID to attach to
pid = int(raw_input("Enter PID: "))

# Attach to the process with debugger instance created earlier.
# Attaching the debugger will pause the process.
dbg.attach(pid)

# Let's set the breakpoint and handler as thread_step_setter,
# which we will define a little later...
dbg.bp_set(func_address, handler=thread_step_setter)

# Let's set our "personalized" handler for Single Step Exception
# It will get triggered if execution of a thread goes into single step mode.
dbg.set_callback(EXCEPTION_SINGLE_STEP, single_step_handler)

# Setup is done. Let's run it...
dbg.run() 


现在有了基本结构,让我们为断点和单步定义个性化处理程序。下面的代码段定义了我们的“自定义”处理程序。当断点命中时,我们将遍历线程并将其设置为单步模式。反过来,它将触发单步异常,我们将处理并反汇编MAX_INSTRUCTIONS条指令:

def thread_step_setter(dbg):
    dbg.suspend_all_threads()
    for thread_id in dbg.enumerate_threads():
        print "Single step for thread: 0x%08x" % thread_id
        h_thread = dbg.open_thread(thread_id)
        dbg.single_step(True, h_thread)
        dbg.close_handle(h_thread)

    # Resume execution, which will pass control to step handler
    dbg.resume_all_threads()

    return DBG_CONTINUE

def single_step_handler(dbg):
    global total_instructions
    if instructions == MAX_INSTRUCTION:
        dbg.single_step(False)
        return DBG_CONTINUE
    else:
        # Disassemble the instruction
        current_instruction = dbg.disasm(dbg.context,Eip)
        print "#%d\t0x%08x : %s" % (total_instructions, dbg.context.Eip, current_instruction)
        total_instructions += 1
        dbg.single_step(True)

    return DBG_CONTINUE


披露者:我不保证上面的代码在以下情况下会起作用复制并粘贴。我打了出来,还没有测试。但是,如果掌握了基本知识,则可以轻松地修复小的语法错误。如果有的话,我深表歉意。我目前没有能力或时间对其进行测试。

我真的希望它能对您有所帮助。