1.PE文件
PE文件结构主要分为4部分:DOS头、NI头、节表头、各节表的内容。

1.1 Dos头
1.1.1 使用python pefile 库读取PE文件,查看DOS头

1.1.2 使用16进制文本编辑器 UltraEdit 打开PE文件

可通过DOS够识别一个文件是否为PE文件;
文件的前两个字节为4D 5A(MZ)以及在0x3c位置有一个地址值,该方式可以判定该文件为PE文件;
1.2 NI头
1.2.1 使用python pefile 库读取PE文件,查看IN头

NI头中保存着,PE文件的一些基本信息
1.3 节表头
1.3.1 使用16进制文本编辑器 UltraEdit 查看各节表头

上图中有:.text、.rdate、.edata等字节头
1.3.2 使用python pefile 库读取PE文件,查看.text节表头

1.4 节表内容(.text)
由.text节表头可知:
VirtualAddress:0x1000 (起始地址)
Misc_VirtualSize:0x6ff6a8 (大小)

2.反汇编
2.1 使用python capstone进行反汇编
思路:
1.解析PE文件,得到PE文件中.text的起始地址和大小;
2.将文件中对应地址和大小的.text节表内容取出,然后使用python capstone进行反汇编;

import pefile
from capstone import *
def main(path):
global ActualOffset, VirtualSize, VirtualAddress
opcode_list = []
pe = pefile.PE(path)
print(pe.DOS_HEADER)
print(pe.NT_HEADERS)
print(pe.FILE_HEADER)
print(pe.OPTIONAL_HEADER)
ImageBase = pe.OPTIONAL_HEADER.ImageBase
for section in pe.sections:
print(section)
for section in pe.sections:
if section.Name == b'.text\x00\x00\x00':
VirtualAddress = section.VirtualAddress
VirtualSize = section.Misc_VirtualSize
StartVA = ImageBase + VirtualAddress
StoptVA = ImageBase + VirtualAddress + VirtualSize
fp = open(path, 'rb')
fp.seek(VirtualAddress)
HexCode = fp.read(VirtualSize)
md = Cs(CS_ARCH_X86, CS_MODE_64)
for item in md.disasm(HexCode, 0):
addr = hex(int(StartVA) + item.address)
dic = {"Addr": str(addr) , "OpCode": item.mnemonic + " " + item.op_str}
print("[+] 反汇编地址: {} 参数: {}".format(addr,dic))
opcode_list.append(dic)
if __name__ == '__main__':
path = "D:\avcodec.dll"
main(path)