LyScript獲取上一條與下一條匯編指令的方法詳解
LyScript 插件默認(rèn)并沒有提供上一條與下一條匯編指令的獲取功能,當(dāng)然你可以使用LyScriptTools
工具包直接調(diào)用內(nèi)置命令得到,不過這種方式顯然在效率上并不理想,我們需要在LyScript插件API基礎(chǔ)上自己封裝實(shí)現(xiàn)這個功能。
LyScript項(xiàng)目地址:https://github.com/lyshark/LyScript
獲取下一條匯編指令
下一條匯編指令的獲取需要注意如果是被命中的指令則此處應(yīng)該是CC斷點(diǎn)占用一個字節(jié),如果不是則正常獲取到當(dāng)前指令即可。
1.我們需要檢查當(dāng)前內(nèi)存斷點(diǎn)是否被命中,如果沒有命中則說明此處我們需要獲取到原始的匯編指令長度,然后與當(dāng)前eip地址相加獲得。
2.如果命中了斷點(diǎn),則此處有兩種情況
1.1 如果是用戶下的斷點(diǎn),則此處調(diào)試器會在指令位置替換為CC,也就是匯編中的init停機(jī)指令,該指令占用1個字節(jié),需要eip+1得到。
1.2 如果是系統(tǒng)斷點(diǎn),EIP所停留的位置,則我們需要正常獲取當(dāng)前指令地址,此處調(diào)試器沒有改動匯編指令僅僅只下下了異常斷點(diǎn)。
from LyScript32 import MyDebug # 獲取當(dāng)前EIP指令的下一條指令 def get_disasm_next(dbg,eip): next = 0 # 檢查當(dāng)前內(nèi)存地址是否被下了絆子 check_breakpoint = dbg.check_breakpoint(eip) # 說明存在斷點(diǎn),如果存在則這里就是一個字節(jié)了 if check_breakpoint == True: # 接著判斷當(dāng)前是否是EIP,如果是EIP則需要使用原來的字節(jié) local_eip = dbg.get_register("eip") # 說明是EIP并且命中了斷點(diǎn) 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: # 得到當(dāng)前指令長度 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()
獲取結(jié)果如下:
獲取上一條匯編指令
上一條指令的獲取難點(diǎn)就在于,我們無法確定當(dāng)前指令的上一條指令到底有多長,所以只能用笨辦法,逐行掃描對比匯編指令,如果找到則取出其上一條指令即可。
from LyScript32 import MyDebug # 獲取當(dāng)前EIP指令的上一條指令 def get_disasm_prev(dbg,eip): prev_dasm = None # 得到當(dāng)前匯編指令 local_disasm = dbg.get_disasm_one_code(eip) # 只能向上掃描10行 eip = eip - 10 disasm = dbg.get_disasm_code(eip,10) # 循環(huán)掃描匯編代碼 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()
輸出效果如下:
到此這篇關(guān)于LyScript獲取上一條與下一條匯編指令的方法詳解的文章就介紹到這了,更多相關(guān)LyScript獲取匯編指令內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++通過內(nèi)嵌解釋器調(diào)用Python及間接調(diào)用Python三方庫
本文主要介紹了C++通過內(nèi)嵌解釋器調(diào)用Python及間接調(diào)用Python三方庫,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12Python實(shí)現(xiàn)文件按照日期命名的方法
這篇文章主要介紹了Python實(shí)現(xiàn)文件按照日期命名的方法,涉及Python針對文件的遍歷、讀寫及時間操作相關(guān)技巧,需要的朋友可以參考下2015-07-07python調(diào)用dll出現(xiàn)精度問題解決
本文主要介紹了python調(diào)用dll出現(xiàn)精度問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02淺談Python中re.match()和re.search()的使用及區(qū)別
這篇文章主要介紹了淺談Python中re.match()和re.search()的使用及區(qū)別,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04python函數(shù)默認(rèn)參數(shù)使用避坑指南
這篇文章主要為大家介紹了python函數(shù)默認(rèn)參數(shù)使用的踩雷避坑詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07Scrapy中如何向Spider傳入?yún)?shù)的方法實(shí)現(xiàn)
這篇文章主要介紹了Scrapy中如何向Spider傳入?yún)?shù)的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09