跳转到主要内容

pe-parse的Python绑定

项目描述

pepy

pepy(发音为p-pie)是pe-parse解析器的Python绑定。

pepy支持Python 3.6及更高版本。

使用pepy的最简单方法是使用pip安装它

$ pip3 install pepy

构建

如果您可以构建pe-parse并且有一个可工作的Python环境(头文件和库),则可以构建pepy。

  1. 构建pepy
  • python3 setup.py build
  1. 安装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_sectionsget_importsget_exportsget_relocationsget_resources 方法每个都返回一个对象列表。对象的类型取决于调用的方法。get_sections 返回一个 section 对象列表,get_imports 返回一个 import 对象列表等。

段对象

section 对象具有以下属性

  • 基址
  • 长度
  • 虚拟地址
  • 虚拟大小
  • 重定位数量
  • 行号数量
  • characteristics
  • 数据

导入对象

import 对象具有以下属性

  • 符号
  • 名称
  • 地址

导出对象

export 对象具有以下属性

  • 模块
  • 函数
  • 地址

重定位对象

relocation 对象具有以下属性

  • 类型
  • 地址

资源对象

resource 对象具有以下属性

  • 类型字符串
  • 名称字符串
  • 语言字符串
  • 类型
  • 名称
  • 语言
  • 代码页
  • RVA
  • 大小
  • 数据

resource 对象具有以下方法

  • 类型字符串化

资源存储在目录结构中。前三个级别称为 typenamelang。每个级别都可以是预定义值或自定义字符串。预定义值存储在 typenamelang 属性中。如果找到自定义字符串,它将存储在 type_strname_strlang_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)。

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于 安装软件包 的信息。

源分布

pepy-2.1.1.tar.gz (15.4 kB 查看哈希值)

上传于

由以下机构支持