2个稳定版本

使用旧Rust 2015

2.0.1 2019年2月6日
1.0.0 2019年1月3日

#1622 in 数据结构

LGPL-2.1-or-later

360KB
7K SLoC

包含 (DOS可执行文件, 67KB) tests/data/test.exe, (Mach-o可执行文件, 9KB) tests/data/deadbeef.mach, (ELF可执行文件/库, 7KB) tests/data/dynamic-32, (Mach-o库, 9KB) tests/data/libbeef.dylib

p8n-types

表示二进制程序的基本类型。是Panopticon的一部分。文档托管在 docs.rs

用法

# Cargo.toml
[dependencies]
p8n-types = "2.0.1"

许可

本项目受以下许可协议保护


lib.rs:

用于反汇编和分析二进制代码的库。

panopticon crate 实现了结构来模拟程序的内存表示,包括其控制流、调用图和内存映射。以下是最重要的类型及其交互方式:

Project
├── Region
│   └── Layer
└── Program
    └── Function
        └── BasicBlock
            └── Mnemonic
                └── Statement

ProgramFunctionBasicBlockStatement 类型模拟了代码的行为。而 RegionLayer 类型表示了程序在内存中的布局。

代码

潘多拉模型将代码视为程序集合。每个Program由函数组成。一个Function是一个图,节点代表指令序列,边代表跳转。这些指令序列是BasicBlock,包含一个Mnemonic列表。每个Mnemonic的意义在[RREIL][1]语言中有描述。每个助记符包括实现它的Statement序列。

潘多拉允许每个项目包含多个程序。例如,想象一个调用用C编写的本地DLL的C#应用程序。这样的应用程序将有两个程序实例。一个用于应用程序C#部分的CIL代码,另一个用于DLL内的AMD64对象代码。

使用DisassemblerCodeGenMnemonic填充到Function结构中。

数据

使用RegionLayerCell类型对可执行文件的内存布局进行建模。所有数据都组织到Region中。每个Region是一个从0到n编号的Cell数组。每个Cell要么未定义,要么具有介于0到255(包括两者)之间的值。Region是只读的。更改其内容是通过应用Layer实例来完成的。一个Layer读取Region的一部分或另一个Layer,并返回一个新的Cell数组。例如,Layer可以解密Region的一部分或用新的替换单个Cell

在正常操作中,每个内存地址空间有一个Region,冯·诺依曼机器有两个,哈佛架构有两个。其他用途包括在Cell数组上应用函数,其中结果大小不等于输入(例如解压缩可执行映像的一部分)。

依赖项

~9MB
~155K SLoC