二进制文件(GTIRB)的Grammatech中间表示是机器代码分析和重写数据结构。它旨在促进执行二进制拆卸,分析,转换和漂亮印刷的程序之间二进制IR的通信。 GTIRB是在LLVM-IR上建模的,并试图发挥类似的功能,以鼓励工具之间的沟通和互操作性。
该文件的其余部分描述了GTIRB的各个方面:
GTIRB具有以下结构。实线表示继承。虚线用uuid表示参考。
GTIRB的实例可能包括多个模块( Module ),这些模块(模块)表示可加载的对象,例如可执行文件或库,术间控制流程图( IPCFG )和辅助数据表(AUXDATA),这些数据表( AuxData )可以保存任意分析,这些分析可容纳用户定义的格式,这些格式可以轻松参考IR的其他元素。每个模块都包含信息,例如符号( Symbol )和部分,这些信息本身保存了模块的实际字节,数据和代码块。 CFG由这些块之间的基本块( Block )和控制流动边缘组成。每个数据或代码块引用一个字节间隔中的一系列字节范围( ByteInterval )。一个部分可以容纳一个大字节间隔,如果定义了该部分中的块的相对位置 - 或可以在程序重写期间的.text部分中的代码块中的块相对位置,则可以在每个块中保持一个字节间隔。每个符号都有指向其引用的块或基准的指针。
GTIRB明确表示指令或指令语义,但确实提供了符号操作数信息和对字节的访问。有许多用于代表语义的中间语言(IL)S(例如Bap's Bil,Angr's Vex或Ghidra的P-Code)。 GTIRB通过将指令通常作为原始机器代码字节存储并分别存储符号和控制流信息,与这些IL一起使用。流行的Capstone/Keystone解码器/编码器提供了一个绝佳的选择,可以在不承诺任何特定的语义IL的情况下读取和编写GTIRB的机器代码字节表示。通过支持多个IL和单独的分析存储会导致辅助数据表GTIRB可实现独立的二进制分析与重写团队和工具之间的协作。
GTIRB以AuxData对象的形式提供了其他信息,例如分析结果。这些可以以便携式方式存储基本GTIRB类型的地图和向量。 GTIRB手册描述了常见类型的辅助数据的结构,例如功能边界信息,类型信息或标准Auxdata schemata中常见分析的结果。
gtirb的每个元素---例如,模块( Module ),符号( Symbol )和块( Block )---具有普遍唯一的标识符(UUID)。 UUID允许一流的IR组件和AUXDATA表参考IR的元素。
指令和符号操作数可以通过封装UUID(指指令块)和偏移量的类Offset来解决。
当前存在的软件包可轻松在Windows上轻松安装GTIRB(包括Ddisasm拆卸器和GTIRB-PPRINTER PROTICTER)和UBUNTU 20。有关说明,请参见下文。此外,在Grammatech/ddisasm上存在一个公共码头图像,并安装了所有这些工具。 GTIRB版本由Major.Minor.Patch版本使用,其中主要版本增量需要重大的源更改,但应该非常罕见,次要版本增量可能需要较小的源更改,并且补丁版本增量不应破坏任何下游构建。我们尚未在任何版本更改中提供ABI兼容性。
最新稳定的GTIRB Python API可以使用PIP从PIPPA安装:
pip install gtirb最新的不稳定版本的Python API可以从预制的车轮中安装:
pip install https://download.grammatech.com/gtirb/files/python/gtirb-0.dev-py3-none-any.whl至关重要的是, stable或unstable软件包的选择与已安装的DISASM和GTIRB-PPRINTER软件包匹配。
Windows版本的包装为.zip文件,可在https://download.grammatech.com/gtirb/files/windows-release/上找到。
Ubuntu 20的软件包可在GTIRB APT存储库中找到,并且可以按照以下说明安装。
首先,添加Grammatech的APT键。
wget -O - https://download.grammatech.com/gtirb/files/apt-repo/conf/apt.gpg.key | apt-key add -下一个更新您的源文件。
echo " deb [arch=amd64] https://download.grammatech.com/gtirb/files/apt-repo [distribution] [component] " | sudo tee -a /etc/apt/sources.list在哪里:
[distribution]是focal (目前,只有20个包裹可用)[component]是stable ,它具有最后版本的版本或unstable ,该版本保存着存储库的头部。最后更新您的软件包数据库并安装Core GTIRB工具:
sudo apt-get update
sudo apt-get install gtirb-pprinter ddisasm警告:稳定版本GTIRB-2.0.0,GTIRB-PPRINTER-2.1.0,DISASM-1.8.0及以上及以上的依赖Metapackages,如果您尝试尝试apt-get upgrade ,则会引起冲突(请参阅#63)。在这种情况下,卸载并重新安装了您从GTIRB存储库中获得的软件包。您可能需要使用dpkg --remove来删除Metapackages(例如ddisasm ),然后再删除混凝土版本的软件包(例如ddisasm-1.5.1 )。较新的稳定版本不再依赖Metapackages,并且可以在没有问题的情况下升级。
GTIRB的C ++ API应该在64位中成功构建,GCC,Clang和Visual Studio编译器至少支持C ++ 17。 GTIRB使用CMAKE,必须至少使用3.10版安装。
共同的构建过程看起来像这样:
mkdir build
cd build
# Note: You may wish to add some -D arguments to the next command. See below.
cmake < path/to/gtirb >
cmake --build .
# Run the test suite.
ctest对于自定义GTIRB构建,您可以通过导航到构建目录和运行来获取自定义选项的列表:
cmake -LH要构建和安装GTIRB,应安装以下要求:
cmake提供此版本。libprotobuf-dev和protobuf-compiler提供了此版本。GTIRB旨在使用Google协议缓冲区(IE,ProtoBuf)序列化,从而可以轻松有效地使用任何编程语言。
GTIRB也可以通过多种语言实现的专用API使用。 API提供有效的数据结构,适合通过二进制分析和重写应用程序使用;有关详细信息,请参见下文。
GTIRB使用串行格式,该格式由8字节签名组成,然后是序列化Protobuf数据。 Protobuf数据允许使用您选择的语言进行探索和操纵。 Google协议缓冲器主页列出了可以直接使用协议缓冲区的语言;其他语言的用户可以将Protobuf-Formatted数据转换为JSON格式,然后在其应用程序中使用JSON数据。
此存储库中的proto目录包含GTIRB的协议缓冲消息类型定义。您可以检查这些.proto文件以确定各种GTIRB消息类型的结构。顶级消息类型是IR 。
有关更多详细信息,请参阅使用序列化GTIRB数据。
GTIRB API目前可在C ++,Python和Common LISP中使用。有一个部分Java API,该API尚未准备好外部使用。有关与语言无关的API信息,请参见GTIRB组件。有关不同API实现的信息,请参见: