世界关注:LyScript获取上一条与下一条汇编指令的方法详解
LyScript 插件默认并没有提供上一条与下一条汇编指令的获取功能,当然你可以使用LyScriptTools
工具包直接调用内置命令得到,不过这种方式显然在效率上并不理想,我们需要在LyScript插件API基础上自己封装实现这个功能。
(相关资料图)
LyScript项目地址:https://github.com/lyshark/LyScript
获取下一条汇编指令
下一条汇编指令的获取需要注意如果是被命中的指令则此处应该是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 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 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_dasm if __name__ == "__main__": dbg = MyDebug() dbg.connect() eip = dbg.get_register("eip") next = get_disasm_prev(dbg,eip) print("上一条指令: {}".format(next)) dbg.close()
输出效果如下:
到此这篇关于LyScript获取上一条与下一条汇编指令的方法详解的文章就介绍到这了,更多相关LyScript获取汇编指令内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
X 关闭
X 关闭
- 1转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 2充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 3好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 4名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?
- 5亚马逊云科技成立量子网络中心致力解决量子计算领域的挑战
- 6京东绿色建材线上平台上线 新增用户70%来自下沉市场
- 7网红淘品牌“七格格”chuu在北京又开一家店 潮人新宠chuu能红多久
- 8市场竞争加剧,有车企因经营不善出现破产、退网、退市
- 9北京市市场监管局为企业纾困减负保护经济韧性
- 10市场监管总局发布限制商品过度包装标准和第1号修改单