
Определяйте и сопоставляйте пользовательские графовые шаблоны с бинарными графами потока управления, используя дизассемблер на основе Capstone, с поддержкой CLI, привязок Python и плагина IDA.
grap принимает шаблоны и бинарные файлы, использует дизассемблер на основе Casptone для получения графов потока управления из бинарных файлов, а затем сопоставляет шаблоны с ними.
Шаблоны — это определённые пользователем графы с условиями на инструкции («opcode is xor and arg1 is eax») и условиями повторения (3 одинаковые инструкции, базовые блоки...).
grap доступен как автономный инструмент с дизассемблером и привязками к Python, а также как плагин для IDA, использующий преимущества дизассемблирования, выполненного IDA и реверс-инженером.
Поддержка:




Этот документ описывает, как собрать и установить grap на дистрибутиве Linux.
Также вы можете прочитать:
Помимо компиляторов (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 и makesudo make install — установит grap в /usr/local/bin/SWIG может не найти python3, если ваша версия по умолчанию — python2; это можно исправить, переключившись на python3 по умолчанию. Например, на 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): поиск xor с записью в памятьgrap -v "sub->xor->sub" (test.exe): -v выведет путь выведенного шаблонаВыбор способа дизассемблирования бинарных файлов:
grap -od (pattern.grapp) samples/*: дизассемблировать файлы в папке samples/ без попытки сопоставленияgrap -f (pattern.grapp) (test.exe): принудительное повторное дизассемблирование бинарного файла, затем сопоставление с pattern.grappgrap --raw (pattern.grapp) (test.bin): дизассемблирование сырого файла (используйте --raw-64 для 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/ и сопоставить их со всеми шаблонами .grapp из patterns/ (рекурсивная опция -r применяется к /bin/, а не к patterns/)Следующий шаблон обнаруживает цикл дешифрования, состоящий из xor, за которым следует sub, найденный в образце Backspace:
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.