pe-parse的Python绑定
项目描述
pepy
pepy(发音为p-pie)是pe-parse解析器的Python绑定。
pepy支持Python 3.6及更高版本。
使用pepy的最简单方法是使用pip安装它
$ pip3 install pepy
构建
如果您可以构建pe-parse并且有一个可工作的Python环境(头文件和库),则可以构建pepy。
- 构建pepy
python3 setup.py build
- 安装pepy
python3 setup.py install
在Windows上构建: Python 3.x通常安装为python.exe,而不是 python3.exe。
使用
解析对象
pepy涉及许多对象。其中最重要的是解析对象。此对象由parse方法返回。
import pepy
p = pepy.parse("/path/to/exe")
解析对象具有许多方法
get_entry_point:返回入口点地址get_machine_as_str:以人类可读的字符串形式返回机器get_subsystem_as_str:以人类可读的字符串形式返回子系统get_bytes:在给定地址返回前N个字节get_sections:返回一系列节对象get_imports:返回一系列导入对象get_exports:返回一系列导出对象get_relocations:返回一系列重定位对象get_resources:返回一系列资源对象
解析对象具有许多属性
signaturemachinenumberofsectionstimedatestampnumberofsymbolscharacteristicsmagic主要链接器版本次要链接器版本代码大小初始化数据大小未初始化数据大小入口点地址代码基址数据基址映像基址段对齐文件对齐主操作系统版本副操作系统版本Win32版本映像大小头大小校验和子系统DLL特征堆栈保留大小堆栈提交大小堆栈保留大小堆栈提交大小加载器标志RVAS和大小
示例
import time
import pepy
p = pepy.parse("/path/to/exe")
print("Timedatestamp: %s" % time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(p.timedatestamp)))
ep = p.get_entry_point()
print("Entry point: 0x%x" % ep)
get_sections、get_imports、get_exports、get_relocations 和 get_resources 方法每个都返回一个对象列表。对象的类型取决于调用的方法。get_sections 返回一个 section 对象列表,get_imports 返回一个 import 对象列表等。
段对象
section 对象具有以下属性
基址长度虚拟地址虚拟大小重定位数量行号数量characteristics数据
导入对象
import 对象具有以下属性
符号名称地址
导出对象
export 对象具有以下属性
模块函数地址
重定位对象
relocation 对象具有以下属性
类型地址
资源对象
resource 对象具有以下属性
类型字符串名称字符串语言字符串类型名称语言代码页RVA大小数据
resource 对象具有以下方法
类型字符串化
资源存储在目录结构中。前三个级别称为 type、name 和 lang。每个级别都可以是预定义值或自定义字符串。预定义值存储在 type、name 和 lang 属性中。如果找到自定义字符串,它将存储在 type_str、name_str 和 lang_str 属性中。type_as_str 方法可以将预定义类型值转换为字符串表示。
以下代码演示了如何遍历资源
import pepy
from hashlib import md5
import sys
p = pepy.parse(sys.argv[1])
resources = p.get_resources()
print("Resources: (%i)" % len(resources))
for resource in resources:
print("[+] MD5: (%i) %s" % (len(resource.data), md5(resource.data).hexdigest()))
if resource.type_str:
print("\tType string: %s" % resource.type_str)
else:
print("\tType: %s (%s)" % (hex(resource.type), resource.type_as_str()))
if resource.name_str:
print("\tName string: %s" % resource.name_str)
else:
print("\tName: %s" % hex(resource.name))
if resource.lang_str:
print("\tLang string: %s" % resource.lang_str)
else:
print("\tLang: %s" % hex(resource.lang))
print("\tCodepage: %s" % hex(resource.codepage))
print("\tRVA: %s" % hex(resource.RVA))
print("\tSize: %s" % hex(resource.size))
请注意,某些二进制文件(尤其是打包的)可能具有损坏的资源条目。在这些情况下,您可能会发现 len(resource.data) 为 0,但 resource.size 大于 0。size 属性是资源数据条目声明的数据大小。
作者
pe-parse 由 Andrew Ruef 设计和实现(andrew@trailofbits.com)。
pepy 由 Wesley Shields 编写(wxs@atarininja.org)。