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()
输入成果如下: