【Android 逆向】使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 反汇编二进制机器码 | 打印反汇编数据 )
生活随笔
收集整理的這篇文章主要介紹了
【Android 逆向】使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 反汇编二进制机器码 | 打印反汇编数据 )
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一、反匯編二進制機器碼
- 二、打印反匯編數據
一、反匯編二進制機器碼
在創建 Capstone 實例對象 , 并設置 detail 屬性為 True ;
在之前讀取了 節區 二進制數據 , 這些數據就是需要反匯編的機器碼數據 ;
調用 反匯編解析器 的 disasm 方法 , 向匯編解析器中傳入 節區數據 對應的 二進制數據 , 這些二進制數據都是機器碼數據 , 即 , 需要反匯編這些二進制數據為 匯編 代碼 ;
- 第一個參數設置二進制數據 ;
- 第二個參數指的是讀取 raw 二進制數據的起始地址 , 一般設置 0 即可 ;
調用 反匯編解析器 的 disasm 方法 , 得到的是反匯編后的匯編代碼列表 , 如果反匯編失敗 , 此處為空 ;
# 讀取 節區 二進制數據# 這是需要反匯編的機器碼數據raw = file.read(sh_size)# 創建 Capstone 實例對象capstone = Cs(CS_ARCH_X86, CS_MODE_32)# 此處設置為 true , 表示需要顯示細節 , 打開后 , 會標明每條匯編代碼中對寄存器的影響# 如 : 本條匯編代碼中 , 會讀寫哪些寄存器capstone.detail = True# 向匯編解析器中傳入 節區數據 對應的 二進制數據 , 這些二進制數據都是機器碼數據# 即 , 需要反匯編這些二進制數據為 匯編 代碼# 第一個參數設置二進制數據# 第二個參數指的是讀取 raw 二進制數據的起始地址 , 一般設置 0 即可# 得到的是反匯編后的匯編代碼列表 , 如果反匯編失敗 , 此處為空disasm = capstone.disasm(raw, 0)
二、打印反匯編數據
調用 反匯編解析器 的 disasm 方法 , 得到的是反匯編后的匯編代碼列表 ;
遍歷該匯編代碼列表 , 可以得到該行匯編代碼對應的 匯編代碼 ;
要打印的結果如下 :
00000000: push ebx ; 讀寄存器:esp. 寫寄存器:esp ; 機器碼 :53在開始位置打印匯編代碼地址 , 然后是 匯編指令 , 操作對象 ;
之后將匯編代碼 讀取的寄存器 , 寫出的寄存器 打印出來 ;
最后打印出該行匯編代碼對應的機器碼 ;
打印匯編代碼 :
# 遍歷反匯編代碼列表for line in disasm:# 打印每行匯編代碼的 地址 , 指令 , 操作對象text = '%08X: %s %s ' % (line.address, line.mnemonic, line.op_str)# 統計匯編代碼行的字符串個數 , 保證在第 55 字節處打印寄存器讀寫信息# 00000000: push ebx ; 讀寄存器:esp 寫寄存器:esp ; 機器碼 :53length = len(text)if length < 55:text += ' ' * (55 - length)text += ';'# 讀取操作影響到的寄存器if hasattr(line, 'regs_read') and len(line.regs_read) > 0:text += ' 讀寄存器:'for j, r in enumerate(line.regs_read):if j > 0:text += ','text += '%s' % line.reg_name(r)# 寫出操作影響到的寄存器if hasattr(line, 'regs_write') and len(line.regs_write) > 0:text += ' 寫寄存器:'for j, r in enumerate(line.regs_write):if j > 0:text += ','text += '%s' % line.reg_name(r)text += ' ; 機器碼 :'# 打印 本條匯編代碼對應的 機器碼for i in range(line.size):text += '%02X ' % line.bytes[i]# 打印最終數據print(text)分析 打印結果 :
該操作是 入棧操作 , 肯定會影響到 esp 棧寄存器 ; 該匯編代碼對應的機器碼是 0x53 ;
00000000: push ebx ; 讀寄存器:esp. 寫寄存器:esp ; 機器碼 :53下面的匯編代碼 , 調用 0xab , 會讀取 esp,eip 寄存器 , 寫出 esp 寄存器 ;
00000001: call 0xab ; 讀寄存器:esp,eip. 寫寄存器:esp ; 機器碼 :E8 A5 00 00 00總結
以上是生活随笔為你收集整理的【Android 逆向】使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 反汇编二进制机器码 | 打印反汇编数据 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 逆向】使用 Pytho
- 下一篇: 【Android 逆向】使用 Pytho