PE 文件

PE(”portable executable”,可移植的可执行文件)文件是 Windows 操作系统中常见的目标文件、库文件和可执行文件格式,常见的 EXE、DLL、OCX、SYS、COM 都是 PE 文件。深入地了解 PE 文件格式不仅是做一些 Windows hack 相关编程所必须的,同时对我们理解 Windows 系统的内部构造也有很大的帮助。

关于 PE 文件格式的具体细节,我就不在这里介绍了,感兴趣的可以阅读一下这两篇博客:

pefile 模块

这是一个用 Python 写的模块,可以用来解析 PE 文件的文件头(header)、所有的段(section)和一些数据,并支持一些读写操作。更多信息可以参看 https://code.google.com/p/pefile/

安装

  1. 支持直接利用 pip 工具键入 pip install pefile 安装
  2. 此外还可以直接在 https://code.google.com/p/pefile/downloads/list下载各个版本,利用 python setup.py 进行安装

实验一:打印段信息

# -*- coding: utf-8 -*-
import pefile


PEfile_Path = "opencv_photo248.dll"  
pe = pefile.PE(PEfile_Path)  

for section in pe.sections:
  print (section.Name, hex(section.VirtualAddress),
    hex(section.Misc_VirtualSize), section.SizeOfRawData)

运行这段代码就可以得到一下的信息,分别是段名、RVA以及段的大小等信息

('.text\x00\x00\x00', '0x1000', '0x24a12', 150528)  
('.rdata\x00\x00', '0x26000', '0xa65f', 43008)  
('.data\x00\x00\x00', '0x31000', '0x7f4', 1536)
('.rsrc\x00\x00\x00', '0x32000', '0x1e0', 512)
('.reloc\x00\x00', '0x33000', '0x189a', 6656)

建议可以用 PyCharm 这样类似的IDE可以调试查看 pe 类更为详细的一些属性字段信息。

实验二:读写特定位置数据

# -*- coding: utf-8 -*-
import pefile
import binascii

PEfile_Path = "opencv_photo248.dll"  
pe = pefile.PE(PEfile_Path)  

pe.set_dword_at_rva(0x10000, 0x999999ee)
print binascii.b2a_hex(pe.get_data(0x10000,4))

运行结果如下,之所以颠倒,是由于小端模式的缘故。

ee999999

根据以上特性我们可以通过利用 VS 自带的工具 Dia2Dump (一般在 Microsoft Visual Studio 11.0\DIA SDK\Samples\DIA2Dump 目录下)来获取 DLL 文件的一些符号信息,获取特定符号的 RVA,然后可以修改符号指向的值
关于 pefile 更多的用法可以参考 https://code.google.com/p/pefile/w/list,也可以直接读 pefile.py 的源码来获取。