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.uj5u.com/qiye/500456.html
標籤:其他
上一篇:SAP各模塊優缺點和發展簡析
下一篇:HTML的一些標簽
