panda-re/panda
GitHub: panda-re/panda
基于 QEMU 的开源全系统动态分析平台,提供执行记录与重放能力,支持跨架构的深度程序分析。
Stars: 2754 | Forks: 501
# PANDA


PANDA 是一个开源的平台,用于架构中立的动态分析。它
构建在 QEMU 整体系统模拟器之上,因此分析可以访问
客户机中执行的所有代码和所有数据。PANDA 增加了记录和
重放执行的能力,从而实现了迭代、深度的整体系统分析。此外,
重放日志文件体积小巧且易于共享,从而允许进行可重复的实验。
例如,一个包含 90 亿条指令的 FreeBSD 启动过程,仅需
几百 MB 即可表示。PANDA 利用 QEMU 对十三种不同 CPU
架构的支持,使得在 LLVM IR 中对这些
不同的指令集进行分析成为可能。通过这种方式,PANDA 可以仅用
一个动态污点分析,就能精确地支持许多种 CPU。PANDA 分析是
使用一个简单的插件架构编写的,该架构包含了一种在插件之间
共享功能的机制,提高了分析代码的复用率并简化了复杂
分析的开发。
目前,它由 MIT 林肯实验室、NYU 和东北大学
合作开发。PANDA 是在
[GPLv2 许可证](LICENSE) 下发布的。
## 重要分支
我们有两个主要的 PANDA 分支:用于开发的 `dev` 分支和用于稳定+版本化发布的 `stable` 分支。要了解有关这些分支和版本号之间差异的更多信息,请访问[我们的 wiki](https://github.com/panda-re/panda/wiki/PANDA-Branches-&-Versioning)。通常,PANDA 资源(即 docker 容器和文档)基于 `dev` 分支。如果您打算 fork 该项目并在以后拉取更新,我们建议您使用 `stable` 分支。
## 构建
### 快速开始:Docker
PANDA `dev` 分支的最新版本会自动构建为基于 Ubuntu 22.04 的 docker 镜像,并发布到 Docker Hub。
大多数用户会希望使用 `panda` 容器,该容器安装了 PANDA 和 PyPANDA 及其运行时依赖项,但没有构建产物或源代码,从而减小了容器的体积。
对使用 Docker 感兴趣的开发者应使用 `pandadev` 容器,该容器安装了 PANDA 和 PyPANDA、二者的构建和运行时依赖项、所有构建产物和源代码,以及位于 `/panda` 目录下的此代码库中的所有内容。
要使用 `panda` 容器,您可以从 Docker Hub 拉取它:
```
$ docker pull pandare/panda
$ docker run --rm pandare/panda panda-system-i386 --help
```
或者从此代码库构建:
```
$ DOCKER_BUILDKIT=1 docker build --target=panda -t panda .
$ docker run --rm panda panda-system-i386 --help
```
要使用 `pandadev` 容器,您可以从 Docker Hub 拉取它:
```
$ docker pull pandare/pandadev
$ docker run --rm pandare/pandadev /panda/build/panda-system-i386 --help
```
或者从此代码库构建:
```
$ DOCKER_BUILDKIT=1 docker build --target=developer -t pandadev .
$ docker run --rm pandadev panda-system-i386 --help
```
### 快速开始:Python pip
通过运行 `pip3 install pandare`,可以从 [PIP](https://pypi.org/project/pandare/) 安装 PANDA 的 Python 接口(也称为 *pypanda*)。这将安装进行基于 Python 的 PANDA 分析所需的所有内容,但不包括独立的 PANDA 二进制文件。分发的二进制文件仅在 64 位 Ubuntu 22.04 上进行了测试,其他架构/版本可能也能正常工作。您也可以通过构建 PANDA,然后从 `panda/panda/python/core` 目录中运行 `pip install .` 来安装 pypanda。
### Debian, Ubuntu
安装 PANDA 最快的方法是通过安装 [debian 软件包](https://github.com/panda-re/panda/releases)。
有一个适用于 Ubuntu 22.04 的 debian 软件包,及其对应的 PyPanda 软件包。
因为 PANDA 有一些依赖项,我们已经将构建说明编码到了
[install\_ubuntu.sh](panda/scripts/install\_ubuntu.sh) 中。该脚本应该
可以在最新的 Debian stable/Ubuntu LTS 版本上运行。
如果您希望手动构建 PANDA,您也可以在
文档目录中查看
[分步说明](panda/docs/build\_ubuntu.md)。
我们目前仅保证在最新的 Debian stable/Ubuntu LTS 上可构建,但我们欢迎提交 pull request 来修复在其他发行版上的问题。
对于其他发行版,将 `apt-get`
命令转换为您所用发行版的包管理器命令应该很简单。
请注意,如果您想使用我们的 LLVM 功能(主要是动态污点
系统),您将需要从 OS 软件包安装 LLVM 14 或从
源代码编译。在 Ubuntu 上,这应该会通过 `install_ubuntu.sh` 自动完成。
此外,**强烈**建议您仅将 PANDA 构建为 64 位二进制文件。
创建 32 位构建应该是可能的,但最好避免。
有关详细信息,请参阅限制部分。
### Arch Linux
已经有人贡献了 [install\_arch.sh](panda/scripts/install\_arch.sh)
用于在 Arch Linux 上构建 PANDA。
目前,该脚本仅在 Arch Linux 4.17.5-1-MANJARO 上进行了测试。
您还可以在文档目录中找到
[在 Arch 上构建的分步说明](panda/docs/build\_arch.md)。
### MacOS
在 Mac 上构建的测试较少,但已知可以运行。有一个脚本
[install\_osx.sh](panda/scripts/install\_osx.sh) 用于在 OS X 下构建。
该脚本使用 [homebrew](https://brew.sh) 来安装 PANDA 依赖项。
由于众所周知 homebrew 在废弃对旧版本
OS X 和受支持软件包的支持方面非常快,因此预计这可能会失效。
### 安装
成功构建 PANDA 后,您可以通过运行 `make install` 将构建内容复制到系统范围的位置。默认安装路径为 `/usr/local`。
您可以通过 `prefix` 配置选项指定备用安装路径。例如 `--prefix=/opt/panda`。请注意,您的系统必须安装了 `chrpath`,`make install` 才能成功。
如果包含 PANDA 二进制文件的 `bin` 目录位于您的 `PATH` 环境变量中,那么您可以像运行 QEMU 一样运行 PANDA:
```
panda-system-i386 -m 2G -hda guest.img -monitor stdio
```
## 限制
### LLVM 支持
PANDA 使用了来自 [S2E 项目](https://github.com/dslab-epfl/s2e)的 LLVM 架构。
这允许将 QEMU 使用的 TCG 中间代码表示转换
为 LLVM IR。后者的优点是更易于使用,且
与平台无关。这使得实现复杂的分析成为可能,
例如 `taint2` 插件。
PANDA 用于支持污点分析的 S2E 文件已更新为支持 LLVM 14。
### 跨架构记录/重放
我们付出了巨大的努力来保持 PANDA trace 格式的稳定,以便现有的 trace 在未来仍然可以重放。我们尽量避免
会破坏现有 trace 的更改。
然而,目前,仅能保证在同一地址长度的 PANDA 构建之间
进行记录/重放。例如,您无法在 64 位的 PANDA 上重放在 32 位 PANDA 构建上捕获的 trace。其原因是
一些原始指针混入了 trace 格式中(参见 `panda/rr` 中的头文件)。
鉴于 32 位构建的内存限制,几乎所有的 PANDA 用户都使用 64 位。
因此,这个问题应该只会影响到极少部分用户。
这个问题很长一段时间(>3 年)未被报告的事实也证明了这一点。
因此,当要实施修复时,可能会评估认为迁移由 32 位构建捕获的现有录制
是不值得付出努力的。
为此,**强烈**建议您仅创建和使用 64 位的
PANDA 构建。如果您碰巧已经拥有由 32 位
PANDA 构建捕获的 trace 数据集,您应该尽快联系社区以讨论
可能的选项。
## 文档与支持
### PANDA 手册
PANDA 目前支持 x86、x86\_64 和 ARM 客户机的整体系统记录/重放执行,以及时间旅行调试。其他架构(mips、mipsel、ppc)可以在不支持记录/重放的情况下在 PANDA 下运行。
有关 PANDA 的实现和使用的详细信息可以在
[PANDA 手册](panda/docs/manual.md)中找到。涵盖的部分主题包括:
* [关于记录/重放的详细信息](panda/docs/manual.md#recordreplay-details)
* [架构中立的插件接口](panda/docs/manual.md#plugin-architecture)
* [PANDA 提供的回调](panda/docs/manual.md#appendix-a-callback-list)
* [插件库](panda/docs/manual.md#plugin-zoo)
* [Python 接口](panda/python/README.md)
单个插件的文档由插件目录中的 `README.md` 文件提供。请参阅 [panda/plugins](panda/plugins) 目录。
### 支持
如果您需要有关 PANDA 的帮助,或者想讨论该项目,您可以申请加入
我们的 Slack 频道[点击这里](https://panda-re.mit.edu/invite.php)或加入 [PANDA 邮件
列表](http://mailman.mit.edu/mailman/listinfo/panda-users)。
## 出版物
* [1] B. Dolan-Gavitt, T. Leek, J. Hodosh, W. Lee. Tappan Zee (North) Bridge:
Mining Memory Accesses for Introspection. 20th ACM Conference on Computer and
Communications Security (CCS), Berlin, Germany, November 2013.
* [2] R. Whelan, T. Leek, D. Kaeli. Architecture-Independent Dynamic
Information Flow Tracking. 22nd International Conference on Compiler
Construction (CC), Rome, Italy, March 2013.
* [3] B. Dolan-Gavitt, J. Hodosh, P. Hulin, T. Leek, R. Whelan.
Repeatable Reverse Engineering with PANDA. 5th Program Protection and Reverse
Engineering Workshop, Los Angeles, California, December 2015.
* [4] M. Stamatogiannakis, P. Groth, H. Bos. Decoupling Provenance
Capture and Analysis from Execution. 7th USENIX Workshop on the Theory
and Practice of Provenance, Edinburgh, Scotland, July 2015.
* [5] B. Dolan-Gavitt, P. Hulin, T. Leek, E. Kirda, A. Mambretti,
W. Robertson, F. Ulrich, R. Whelan. LAVA: Large-scale Automated Vulnerability
Addition. 37th IEEE Symposium on Security and Privacy, San Jose,
California, May 2016.
## 致谢
本材料基于 Air Force Contract No.
FA8721-05-C-0002 和/或 FA8702-15-D-0001 下支持的工作。本材料中表达的任何观点、发现、
结论或建议均为作者(s)的观点,不一定反映
U.S. Air Force 的观点。
标签:LLVM, QEMU, 内联执行, 客户端加密, 恶意代码分析, 系统模拟器, 请求拦截, 身份验证强制, 逆向分析, 逆向工具, 配置文件