網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
Capstone是Kali Linux自帶的一款輕量級(jí)反匯編引擎。它可以支持多種硬件構(gòu)架,如ARM、ARM64、MIPS、X86。該框架使用C語(yǔ)言實(shí)現(xiàn),但支持C++、Python、Ruby、OCaml、C#、Java和Go語(yǔ)言,具有很好的擴(kuò)展性。因此,該框架被256種工具所集成,如Cuckoo、Binwalk、IntelliJ IDEA。滲透測(cè)試人員一額可以通過(guò)Python、Ruby語(yǔ)言編寫(xiě)腳本,引入Capstone引擎,從而構(gòu)建自己的反匯編工具。
Capstone作為一個(gè)輕量級(jí)的多平臺(tái)、多架構(gòu)的反匯編框架,該模塊支持目前所有通用操作系統(tǒng),反匯編架構(gòu)幾乎全部支持。
capstone使用起來(lái)非常簡(jiǎn)單,如果只需要靜態(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)存地址 開(kāi)始位置 長(zhǎng)度 Disassembly("d://Win32Project.exe",401000,0,1024)
如果需要針對(duì).text節(jié)進(jìn)行反匯編,則需要通過(guò)pefile模塊找到該節(jié)所對(duì)應(yīng)到文件中的位置,并從該位置開(kāi)始向下反編譯即可,代碼如下:
from capstone import * import pefile # 遍歷整個(gè)可執(zhí)行文件并返回匯編代碼,有一個(gè)小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)推薦
- 2022-03-21 詳解C語(yǔ)言動(dòng)態(tài)內(nèi)存的分配_C 語(yǔ)言
- 2022-01-19 錯(cuò)誤:Cannot construct instance of `xxxx` (no Creator
- 2022-08-03 python工具之清理?Markdown?中沒(méi)有引用的圖片_python
- 2022-12-07 C語(yǔ)言程序中結(jié)構(gòu)體的內(nèi)存對(duì)齊詳解_C 語(yǔ)言
- 2021-11-01 redux工作原理講解及使用方法_React
- 2022-03-20 關(guān)于Rancher部署并導(dǎo)入K8S集群的問(wèn)題_云其它
- 2022-09-16 C#?Socket數(shù)據(jù)接收的三種實(shí)現(xiàn)方式_C#教程
- 2022-10-12 docker配置阿里云鏡像倉(cāng)庫(kù)的實(shí)現(xiàn)_docker
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支