LyScript插件默认不提供获取上一条和下一条汇编指令的功能。当然也可以使用LyScriptTools工具包直接调用内置命令获取,但这种方式显然效率不高。不太理想,我们需要在LyScript插件API的基础上通过封装来实现这个功能。插件地址:https://github.com/lyshark/Ly...获取下一条汇编指令:获取下一条汇编指令,需要注意的是如果是hit指令,应该有是一个占一个字节的CC断点。如果没有,则可以正常获取当前命令。1.我们需要检查当前内存断点是否被命中。如果没有命中,说明我们需要得到原来的汇编指令长度,然后加上当前的eip地址得到。2、如果命中断点,这里有两种情况1.1如果是用户设置的断点,调试器会在指令位置用CC替换,即汇编中的initstop指令,占1字节,需要eip+1才能获取。1.2如果是系统断点,EIP所在的地方,我们需要正常获取当前指令地址。这里,调试器并没有改变汇编指令,只是设置了异常断点。fromLyScript32importMyDebug#获取当前EIP指令的下一条指令defget_disasm_next(dbg,eip):next=0#检查当前内存地址是否跳闸check_breakpoint=dbg.check_breakpoint(eip)#表示有断点,ifIfcheck_breakpoint==True:#然后判断是否是EIP,如果是EIP,需要使用原始字节local_eip=dbg.get_register("eip")#表示是EIP,并打断点iflocal_eip==eip:dis_size=dbg.get_disasm_operand_size(eip)next=eip+dis_sizenext_asm=dbg.get_disasm_one_code(next)returnnext_asmelse:next=eip+1next_asm=dbg.get_disasm_one_code(next)returnnextn_asm#notreturn然后你需要获取原始汇编代码的长度elifcheck_breakpoint==False:#获取当前指令长度dis_size=dbg.get_disasm_operand_size(eip)next=eip+dis_sizenext_asm=dbg.get_disasm_one_code(next)returnnext_asmelse:returnNoneif__name__==“__main__”:数据库g=MyDebug()dbg.connect()eip=dbg.get_register("eip")next=get_disasm_next(dbg,eip)print("下一条指令:{}".format(next))prev=get_disasm_next(dbg,12391436)print("Nextinstruction:{}".format(prev))dbg.close()的结果如下:获取上一条汇编指令:获取上一条指令的难点在于我们无法确定前一条指令当前指令有多长的指令,所以我只能用笨办法逐行扫描比较汇编指令,如果找到就把上一条指令取出来fromLyScript32importMyDebug#获取当前EIP指令的前一条指令defget_disasm_prev(dbg,eip):prev_dasm=None#获取当前汇编指令local_disasm=dbg.get_disasm_one_code(eip)#最多只能扫描10行eip=eip-10disasm=dbg.get_disasm_code(eip,10)#循环扫描汇编代码forindexinrange(0,len(disasm)):#如果找到,取出他最后的汇编代码ifdisasm[index].get("opcode")==local_disasm:prev_dasm=disasm[index-1].get("opcode")中断返回prev_dasmif__name__=="__main__":dbg=MyDebug()dbg.connect()eip=dbg.get_register("eip")next=get_disasm_prev(dbg,eip)print("最后一条指令:{}".format(next))dbg.close()的输出如下:
