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
:返回一系列资源对象
解析对象具有许多属性
signature
machine
numberofsections
timedatestamp
numberofsymbols
characteristics
magic
主要链接器版本
次要链接器版本
代码大小
初始化数据大小
未初始化数据大小
入口点地址
代码基址
数据基址
映像基址
段对齐
文件对齐
主操作系统版本
副操作系统版本
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)。