LyScript 插件默认并没有提供上一条与下一条汇编指令的获取功能,当然你可以使用LyScriptTools
工具包直接调用内置命令得到,不过这种方式显然在效率上并不理想,我们需要在LyScript插件API基础上自己封装实现这个功能。
插件地址:https://github.com/lyshark/LyScript
获取下一条汇编指令: 下一条汇编指令的获取需要注意如果是被命中的指令则此处应该是CC断点占用一个字节,如果不是则正常获取到当前指令即可。
1.我们需要检查当前内存断点是否被命中,如果没有命中则说明此处我们需要获取到原始的汇编指令长度,然后与当前eip地址相加获得。
2.如果命中了断点,则此处有两种情况
1.1 如果是用户下的断点,则此处调试器会在指令位置替换为CC,也就是汇编中的init停机指令,该指令占用1个字节,需要eip+1得到。
1.2 如果是系统断点,EIP所停留的位置,则我们需要正常获取当前指令地址,此处调试器没有改动汇编指令仅仅只下下了异常断点。
from LyScript32 import MyDebugdef get_disasm_next (dbg,eip ): next = 0 check_breakpoint = dbg.check_breakpoint(eip) if check_breakpoint == True : local_eip = dbg.get_register("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 None if __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 MyDebugdef get_disasm_prev (dbg,eip ): prev_dasm = None local_disasm = dbg.get_disasm_one_code(eip) 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_dasm if __name__ == "__main__" : dbg = MyDebug() dbg.connect() eip = dbg.get_register("eip" ) next = get_disasm_prev(dbg,eip) print ("上一条指令: {}" .format (next )) dbg.close()
输出效果如下: