網(wǎng)站首頁 編程語言 正文
Capstone是Kali Linux自帶的一款輕量級反匯編引擎。它可以支持多種硬件構(gòu)架,如ARM、ARM64、MIPS、X86。該框架使用C語言實現(xiàn),但支持C++、Python、Ruby、OCaml、C#、Java和Go語言,具有很好的擴展性。因此,該框架被256種工具所集成,如Cuckoo、Binwalk、IntelliJ IDEA。滲透測試人員一額可以通過Python、Ruby語言編寫腳本,引入Capstone引擎,從而構(gòu)建自己的反匯編工具。
Capstone作為一個輕量級的多平臺、多架構(gòu)的反匯編框架,該模塊支持目前所有通用操作系統(tǒng),反匯編架構(gòu)幾乎全部支持。
capstone使用起來非常簡單,如果只需要靜態(tài)反匯編,則幾行代碼即可完成該功能了。
from capstone import * # powerby LyShark def Disassembly(path,BaseAddr,FileOffset,ReadByte): with open(path,"rb") as fp: fp.seek(int(FileOffset)) opcode = fp.read(int(ReadByte)) md = Cs(CS_ARCH_X86, CS_MODE_32) for item in md.disasm(opcode, 0): addr = int(BaseAddr) + item.address dic = {"Addr": str(addr) , "OpCode": item.mnemonic + " " + item.op_str} print(dic) if __name__ == "__main__": # 文件名 內(nèi)存地址 開始位置 長度 Disassembly("d://Win32Project.exe",401000,0,1024)
如果需要針對.text節(jié)進行反匯編,則需要通過pefile模塊找到該節(jié)所對應(yīng)到文件中的位置,并從該位置開始向下反編譯即可,代碼如下:
from capstone import * import pefile # 遍歷整個可執(zhí)行文件并返回匯編代碼,有一個小Bug # powerby LyShark def FOA_Disassembly(FilePath): opcode_list = [] pe = pefile.PE(FilePath) ImageBase = pe.OPTIONAL_HEADER.ImageBase for item in pe.sections: if str(item.Name.decode('UTF-8').strip(b'\x00'.decode())) == ".text": # print("虛擬地址: 0x%.8X 虛擬大小: 0x%.8X" %(item.VirtualAddress,item.Misc_VirtualSize)) VirtualAddress = item.VirtualAddress VirtualSize = item.Misc_VirtualSize ActualOffset = item.PointerToRawData StartVA = ImageBase + VirtualAddress StopVA = ImageBase + VirtualAddress + VirtualSize with open(FilePath,"rb") as fp: fp.seek(ActualOffset) HexCode = fp.read(VirtualSize) md = Cs(CS_ARCH_X86, CS_MODE_32) for item in md.disasm(HexCode, 0): addr = hex(int(StartVA) + item.address) dic = {"Addr": str(addr) , "OpCode": item.mnemonic + " " + item.op_str} print("[+] 反匯編地址: {} 參數(shù): {}".format(addr,dic)) opcode_list.append(dic) return opcode_list if __name__ == "__main__": ref = FOA_Disassembly("d://Win32Project.exe") print(ref)
原文鏈接:https://www.cnblogs.com/LyShark/p/16099380.html
相關(guān)推薦
- 2023-01-01 C語言之如何求三次方根_C 語言
- 2023-10-16 使用elemnt移動端字體大小會自動變小
- 2022-09-15 Android?Jetpack庫剖析之LiveData組件篇_Android
- 2023-12-19 Nacos修改服務(wù)實例權(quán)重時報錯caused: errCode: 500, errMsg: do m
- 2022-09-10 python中的隨機數(shù)種子seed()用法說明_python
- 2023-04-29 springboot整合單機緩存ehcache的實現(xiàn)_python
- 2023-05-20 linux?shell輸出換行簡單實例_linux shell
- 2022-06-25 CentOS?8?安裝調(diào)試KVM的詳細步驟_Kvm
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支