LyScript 插件預設提供了一個
get_disasm_code()
方法可以直接擷取到指定行數的反彙編代碼,但如果需要自定義擷取或者是需要自己封裝一個反彙編方法,則你可以用如下兩種方式來得到。
- LyScript項目位址: https://github.com/lyshark/LyScript
第一步直接擷取到指定EIP位置的反彙編代碼,這段代碼可以這樣來寫。
from LyScript32 import MyDebug
if __name__ == "__main__":
dbg = MyDebug()
conn = dbg.connect()
# 擷取目前EIP位址
eip = dbg.get_register("eip")
print("eip = {}".format(hex(eip)))
# 向下反彙編位元組數
count = eip + 15
while True:
# 每次得到一條反彙編指令
dissasm = dbg.get_disasm_one_code(eip)
print("0x{:08x} | {}".format(eip, dissasm))
# 判斷是否滿足退出條件
if eip >= count:
break
else:
# 得到本條反彙編代碼的長度
dis_size = dbg.assemble_code_size(dissasm)
eip = eip + dis_size
dbg.close()
pass
輸出效果如下。

第二步得到目前EIP機器碼,擷取到目前EIP指針所在位置的機器碼,你可以靈活運用反彙編代碼的組合實作。
from LyScript32 import MyDebug
# 得到機器碼
def GetHexCode(dbg,address):
ref_bytes = []
# 首先得到反彙編指令,然後得到該指令的長度
asm_len = dbg.assemble_code_size( dbg.get_disasm_one_code(address) )
# 循環得到每個機器碼
for index in range(0,asm_len):
ref_bytes.append(dbg.read_memory_byte(address))
address = address + 1
return ref_bytes
if __name__ == "__main__":
dbg = MyDebug()
conn = dbg.connect()
# 擷取目前EIP位址
eip = dbg.get_register("eip")
print("eip = {}".format(hex(eip)))
# 得到機器碼
ref = GetHexCode(dbg,eip)
for i in range(0,len(ref)):
print("0x{:02x} ".format(ref[i]),end="")
dbg.close()
pass
輸出效果如下所示:
如果将如上兩種方法結合在一起,那麼你就可以擷取到x64dbg反彙編視窗中的三個主要參數區中的内容了。
from LyScript32 import MyDebug
# 得到機器碼
def GetHexCode(dbg,address):
ref_bytes = []
# 首先得到反彙編指令,然後得到該指令的長度
asm_len = dbg.assemble_code_size( dbg.get_disasm_one_code(address) )
# 循環得到每個機器碼
for index in range(0,asm_len):
ref_bytes.append(dbg.read_memory_byte(address))
address = address + 1
return ref_bytes
if __name__ == "__main__":
dbg = MyDebug()
conn = dbg.connect()
# 擷取目前EIP位址
eip = dbg.get_register("eip")
print("eip = {}".format(hex(eip)))
# 向下反彙編位元組數
count = eip + 20
while True:
# 每次得到一條反彙編指令
dissasm = dbg.get_disasm_one_code(eip)
print("0x{:08x} | {:50} | ".format(eip, dissasm),end="")
# 得到機器碼
ref = GetHexCode(dbg, eip)
for i in range(0, len(ref)):
print("0x{:02x} ".format(ref[i]), end="")
print()
# 判斷是否滿足退出條件
if eip >= count:
break
else:
# 得到本條反彙編代碼的長度
dis_size = dbg.assemble_code_size(dissasm)
eip = eip + dis_size
dbg.close()
pass
擷取效果圖如下:
lyshark (王瑞)
文章出處:https://www.cnblogs.com/LyShark/p/16521385.html
版權聲明:本部落格文章與代碼均為學習時整理的筆記,文章
[均為原創]作品,轉載請
[添加出處],您添加出處是我創作的動力!
轉載文章,請遵守
《中華人民共和國著作權法》相關規定或遵守
《署名CC BY-ND 4.0國際》禁止演繹規範,合理合規,攜帶原創出處轉載。