日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

Python利用capstone實(shí)現(xiàn)反匯編_python

作者:lyshark ? 更新時(shí)間: 2022-06-07 編程語(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

欄目分類(lèi)
最近更新