grap 接受模式和二进制文件,使用基于 Capstone 的反汇编器从二进制文件中获取控制流图,然后对这些图进行模式匹配。
模式是用户定义的图,包含指令条件(“opcode 是 xor 且 arg1 是 eax”)和重复条件(3条相同的指令、基本块等)。
grap 既可以作为独立工具使用(包含反汇编器和 Python 绑定),也可以作为 IDA 插件使用,利用 IDA 的反汇编结果和逆向分析能力。
支持:




本文档描述了如何在 Linux 发行版上构建和安装 grap。
您也可以阅读:
除了编译器(build-essential)之外,还必须安装以下依赖项:
因此在 Ubuntu / Debian 上,以下命令应可工作:
sudo apt-get install build-essential cmake bison flex libboost-regex-dev libboost-system-dev libboost-filesystem-dev libseccomp-dev python3-dev python3-pefile python3-pyelftools python3-capstone swig
请注意,这些依赖项是针对最新的 Ubuntu LTS(18.04.3)测试的。根据您的发行版,软件包可能有所不同。
以下命令将构建并安装该项目:
mkdir build; cd build/ 建议在专用目录中构建项目cmake ../src/; make 使用 cmake 和 make 进行构建sudo make install 将 grap 安装到 /usr/local/bin/如果默认 Python 版本为 Python 2,SWIG 可能无法找到 Python 3,可以通过将默认版本切换为 Python 3 来解决。例如在 Ubuntu 上:
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10
可以通过以下命令启动该工具:
$ grap [options] pattern test_paths
以下是几个支持的选项示例:
grap -h:描述支持的选项可以让 grap 从字符串推断模式。仅支持少数选项,但对原型设计很有用:
grap "opcode is xor and arg1 contains '['" (test.exe):查找带有内存写入的 xorgrap -v "sub->xor->sub" (test.exe):-v 会输出推断模式的路径选择二进制文件的反汇编方式:
grap -od (pattern.grapp) samples/*:对文件夹 samples/ 中的文件进行反汇编,但尝试不进行匹配grap -f (pattern.grapp) (test.exe):强制重新反汇编二进制文件,然后将其与 pattern.grapp 进行匹配grap --raw (pattern.grapp) (test.bin):反汇编原始文件(对于 64 位二进制文件使用 --raw-64)控制输出的详细程度:
grap -q -sa (pattern.grapp) (samples/*.grapcfg):匹配已反汇编的文件,显示匹配和不匹配的文件,每行一个grap -m (pattern.grapp) (test.grapcfg):显示所有匹配的节点选择反汇编文件(.grapcfg)的写入位置;将多个文件与多个模式进行匹配:
grap patterns/basic_block_loop.grapp -o ls.grapcfg /bin/ls:将 ls 反汇编为 ls.grapp 并查找基本块循环grap (pattern1.grapp) -p (pattern2.grapp) (test.exe):与多个模式文件进行匹配grap -r -q patterns/ /bin/ -o /tmp/:将 /bin/ 中的所有文件反汇编到 /tmp/ 中,并将它们与 patterns/ 中的所有 .grapp 模式进行匹配(-r 递归选项应用于 /bin/,而不是 patterns/)以下模式检测在 Backspace 样本中找到的由 xor 后接 sub 组成的解密循环:
digraph decryption_md5_4ee00c46da143ba70f7e6270960823be {
A [cond=true, repeat=3]
B [cond="opcode is xor and arg2 is 0x11"]
C [cond="opcode is sub and arg2 is 0x25"]
D [cond=true, repeat=3]
E [cond="opcode beginswith j and nchildren == 2"]
A -> B
B -> C
C -> D
D -> E
E -> A [childnumber=2]
}
注意,模式文件可以包含多个模式图。
您可以在两个目录中找到其他模式示例:
关于恶意软件样本:
Python 绑定使用:
您可以在 doc/ 文件夹中找到更多文档:
模式和测试图的语法详细记录在发布版本中的文件 grap_graphs.pdf 中。
grap 采用 MIT 许可证。完整许可证文本可在 LICENSE 中找到。