網站首頁 編程語言 正文
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()
輸出效果如下:
原文鏈接:https://www.cnblogs.com/LyShark/p/16527744.html
相關推薦
- 2022-07-26 討論nginx?location?順序問題_nginx
- 2022-04-16 python代碼有一行標黃問題的解決方案_python
- 2022-06-12 Flutter仿微信通訊錄實現自定義導航條的示例代碼_Android
- 2023-04-07 C#中將dateTimePicker初始值設置為空_C#教程
- 2022-05-10 二叉樹的遞歸和非遞歸遍歷
- 2023-07-02 Python基于歐拉角繪制一個立方體_python
- 2021-12-04 Qt下監測內存泄漏的方法_C 語言
- 2022-06-24 Python+matplotlib實現簡單曲線的繪制_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支