LyScript获取上一条与下一条汇编指令的方法详解
- 更新时间:2023-01-18 10:27:43
- 编辑:能奇致
参考资料
- 《“笨办法”学Python 3》相关视频 配套资源 / 206.67 KB / (美)泽德·A.肖(zed A.shaw 推荐度:
- Python 全栈开发之数据分析 / 21.6 MB / 码小辫 推荐度:
- 《Python设计模式(第2版)》配套资源 配套资源 / 128.08 KB / [印度]Chetan Giridhar 推荐度:
正文内容
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获取汇编指令内容请搜索码农之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持码农之家!
python相关教程
-
Python datetime包函数知识点总结
这篇文章主要介绍了Python datetime包函数简单介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
发布时间:2021-05-30
-
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
给大家整理了关于Python的教程,这篇文章主要介绍了Python使用numpy产生正态分布随机数的向量或矩阵操作,简单描述了正态分布的概念并结合实例形式分析了Python使用numpy模块结合matplotlib绘制正态分布曲线图相关操作技巧,需要
发布时间:2022-11-03
-
使用Python爬虫爬取小红书完完整整的全过程
给网友朋友们带来一篇关于Python的教程,这篇文章主要介绍了使用Python爬取小红书完完整整的全过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
发布时间:2022-10-18
-
Python开发Tornado网站之RequestHandler:输入捕捉
为网友们分享了关于Python的教程,本篇文章给大家带来的内容是关于Python开发Tornado网站之RequestHandler:输入捕捉 ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
发布时间:2022-07-25
-
Python判断三位数是否为水仙花数的代码讲解
今天小编就为大家分享一篇Python判断一个三位数是否为水仙花数的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
发布时间:2021-06-10
-
Python如何查看list中是否含有某元素
今天小编就为大家分享一篇Python 查看list中是否含有某元素的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
发布时间:2019-08-13
-
单例模式python的作用整理
单例模式可以在资源共享的情况下,避免由于资源操作时导致的性能或损耗等。也可以在控制资源的情况下,方便资源之间的互相通信。如线程池等。多应用于任务管理器、回收站、网站计数器
发布时间:2020-01-03
-
python在WIN运行时去掉DOS窗口显示的方法
Python运行不显示DOS窗口的解决方法 很多朋友在写python程序的时候对DOS界面窗口比较排斥,无论从视觉还是应用上都是感觉怪怪的,我们在这里就给大家整理了运行python程序时候隐藏掉DOS窗口的方法,一起来看下。 方法1: pythonw xxx.py 方法2: 将.py改成.pyw (这个其实就是使用脚本解析程序pythonw.exe) 跟 python.exe 比较起来,pythonw.exe 有以下的不同: 1)执行时不会弹出控制台窗口(也叫
发布时间:2018-10-22
-
python做并行计算的实例方法
python可以做并行计算,Parallel Python是一个python模块,提供在SMP(具有多个处理器或多核的系统)和集群上并行执行python代码的机制。轻巧、方便、与其他python软件集成。
发布时间:2020-02-04