ddisasm
1.8.0
DDISASM是一个快速的拆卸器,足够准确,可以重新组装结果的装配代码。使用DATALOG(SOUFFLE)声明逻辑编程语言来汇编拆卸规则和启发式方法来实施DDISASM。拆卸器首先解析Elf/PE文件信息,并解码一个可能的指令,以创建一组初始的Datalog事实。分析这些事实以识别代码位置,符号和功能边界。然后将此分析的结果(一组精致的数据记录事实)转换为GTIRB中间表示,进行二进制分析和反向工程。然后,GTIRB漂亮的打印机可用于将GTIRB精美打印到可重新组装的装配代码。
二进制格式:
指令集体系结构(ISA):
您可以使用Docker运行预构建版本的DDISASM:
docker pull grammatech/ddisasm:latestddisasm可用于将二进制组装到GTIRB表示中。我们可以使用存储库中包含的示例之一尝试。
首先,启动ddisasm docker容器:
docker run -v $PWD /examples:/examples -it grammatech/ddisasm:latest在Docker容器中,让我们构建其中一个示例:
apt update && apt install gcc -y
cd /examples/ex1
gcc ex.c -o ex现在,我们可以继续拆卸二进制:
ddisasm ex --ir ex.gtirb具有GTIRB表示后,您可以使用GTIRB或GTIRB锻炼对二进制进行编程更改。
然后,您可以使用GTIRB-PPRINTER(包含在Docker Image中)来生成二进制的新版本:
gtirb-pprinter ex.gtirb -b ex_rewritten
在内部, gtirb-pprinter将生成一个汇编文件,并调用编译器/汇编程序(例如GCC)生成新的二进制文件。 gtirb-pprinter将注意或生成所有必要的命令行选项,以生成新的二进制文件,包括汇编选项,库依赖项或版本的链接器脚本。
您还可以使用gtirb-pprinter生成用于手动修改的程序集列表:
gtirb-pprinter ex.gtirb --asm ex.s然后可以手动重新编译此组件列表:
gcc -nostartfiles ex.s -o ex_rewritten请查看我们的文档以获取更多信息。
参见贡献
@inproceedings {flores-montoya2020,
author = {Antonio Flores-Montoya and Eric Schulte},
title = {Datalog Disassembly},
booktitle = {29th USENIX Security Symposium (USENIX Security 20)},
year = {2020},
isbn = {978-1-939133-17-5},
pages = {1075--1092},
url = {https://www.usenix.org/conference/usenixsecurity20/presentation/flores-montoya},
publisher = {USENIX Association},
month = aug,
}
@misc{schulte2020gtirb,
title={GTIRB: Intermediate Representation for Binaries},
author={Eric Schulte and Jonathan Dorn and Antonio Flores-Montoya and Aaron Ballman and Tom Johnson},
year={2020},
eprint={1907.02859},
archivePrefix={arXiv},
primaryClass={cs.PL}
}