LyScript 插件默认并没有提供上一条与下一条汇编指令的获取性能,当然你能够应用LyScriptTools工具包间接调用内置命令失去,不过这种形式显然在效率上并不现实,咱们须要在LyScript插件API根底上本人封装实现这个性能。

  • 插件地址:https://github.com/lyshark/Ly...

获取下一条汇编指令: 下一条汇编指令的获取须要留神如果是被命中的指令则此处应该是CC断点占用一个字节,如果不是则失常获取到以后指令即可。

  • 1.咱们须要查看以后内存断点是否被命中,如果没有命中则阐明此处咱们须要获取到原始的汇编指令长度,而后与以后eip地址相加取得。
  • 2.如果命中了断点,则此处有两种状况

    • 1.1 如果是用户下的断点,则此处调试器会在指令地位替换为CC,也就是汇编中的init停机指令,该指令占用1个字节,须要eip+1失去。
    • 1.2 如果是零碎断点,EIP所停留的地位,则咱们须要失常获取以后指令地址,此处调试器没有改变汇编指令仅仅只下下了异样断点。
from LyScript32 import MyDebug# 获取以后EIP指令的下一条指令def get_disasm_next(dbg,eip):    next = 0    # 查看以后内存地址是否被下了绊子    check_breakpoint = dbg.check_breakpoint(eip)    # 阐明存在断点,如果存在则这里就是一个字节了    if check_breakpoint == True:        # 接着判断以后是否是EIP,如果是EIP则须要应用原来的字节        local_eip = dbg.get_register("eip")        # 阐明是EIP并且命中了断点        if local_eip == eip:            dis_size = dbg.get_disasm_operand_size(eip)            next = eip + dis_size            next_asm = dbg.get_disasm_one_code(next)            return next_asm        else:            next = eip + 1            next_asm = dbg.get_disasm_one_code(next)            return next_asm        return None    # 不是则须要获取到原始汇编代码的长度    elif check_breakpoint == False:        # 失去以后指令长度        dis_size = dbg.get_disasm_operand_size(eip)        next = eip + dis_size        next_asm = dbg.get_disasm_one_code(next)        return next_asm    else:        return Noneif __name__ == "__main__":    dbg = MyDebug()    dbg.connect()    eip = dbg.get_register("eip")    next = get_disasm_next(dbg,eip)    print("下一条指令: {}".format(next))    prev = get_disasm_next(dbg,12391436)    print("下一条指令: {}".format(prev))    dbg.close()

获取后果如下:

获取上一条汇编指令: 上一条指令的获取难点就在于,咱们无奈确定以后指令的上一条指令到底有多长,所以只能用笨办法,逐行扫描比照汇编指令,如果找到则取出其上一条指令即可。

from LyScript32 import MyDebug# 获取以后EIP指令的上一条指令def get_disasm_prev(dbg,eip):    prev_dasm = None    # 失去以后汇编指令    local_disasm = dbg.get_disasm_one_code(eip)    # 只能向上扫描10行    eip = eip - 10    disasm = dbg.get_disasm_code(eip,10)    # 循环扫描汇编代码    for index in range(0,len(disasm)):        # 如果找到了,就取出他的上一个汇编代码        if disasm[index].get("opcode") == local_disasm:            prev_dasm = disasm[index-1].get("opcode")            break    return prev_dasmif __name__ == "__main__":    dbg = MyDebug()    dbg.connect()    eip = dbg.get_register("eip")    next = get_disasm_prev(dbg,eip)    print("上一条指令: {}".format(next))    dbg.close()

输入成果如下: