
Definir y comparar patrones de grafos definidos por el usuario contra grafos de flujo de control binarios utilizando un desensamblador basado en Capstone, con soporte de CLI, enlaces Python y plugin para IDA.
grap toma patrones y archivos binarios, utiliza un desensamblador basado en Casptone para obtener los grafos de flujo de control de los binarios, y luego compara los patrones contra ellos.
Los patrones son grafos definidos por el usuario con condiciones de instrucciones ("opcode is xor and arg1 is eax") y condiciones de repetición (3 instrucciones idénticas, bloques básicos...).
grap está disponible como una herramienta independiente con un desensamblador y enlaces de Python, y como un complemento de IDA que aprovecha el desensamblado realizado por IDA y el reverser.
Soporte:




Este documento describe cómo compilar e instalar grap en una distribución de Linux.
También puede leer:
Además de los compiladores (build-essential), se deben instalar las siguientes dependencias:
Por lo tanto, en Ubuntu / Debian, esto debería funcionar:
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
Tenga en cuenta que estos fueron probados para la última versión LTS de Ubuntu (18.04.3). Los paquetes pueden diferir dependiendo de su distribución.
Los siguientes comandos compilarán e instalarán el proyecto:
mkdir build; cd build/ como recomendamos compilar el proyecto en un directorio dedicadocmake ../src/; make compilará con cmake y makesudo make install instalará grap en /usr/local/bin/SWIG podría fallar al encontrar python3 si su versión predeterminada es python2, esto se puede solucionar cambiando a python3 como predeterminado. Por ejemplo en Ubuntu:
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10
La herramienta se puede lanzar usando el siguiente comando:
$ grap [options] pattern test_paths
A continuación se muestran algunos ejemplos de opciones soportadas:
grap -h: describe las opciones soportadasSe puede dejar que grap infiera un patrón a partir de una cadena. Solo se soportan algunas opciones, pero esto es útil para prototipado:
grap "opcode is xor and arg1 contains '['" (test.exe): busca un xor con una escritura en memoriagrap -v "sub->xor->sub" (test.exe): -v mostrará la ruta del patrón inferidoElija cómo se desensamblan los binarios:
grap -od (pattern.grapp) samples/*: desensambla archivos en la carpeta samples/ sin intentar coincidenciasgrap -f (pattern.grapp) (test.exe): fuerza el re-desensamblado del binario, luego lo compara contra pattern.grappgrap --raw (pattern.grapp) (test.bin): desensambla archivo crudo (use --raw-64 para binarios de 64 bits)Controle la verbosidad de la salida:
grap -q -sa (pattern.grapp) (samples/*.grapcfg): compara archivos desensamblados, muestra archivos coincidentes y no coincidentes, uno por líneagrap -m (pattern.grapp) (test.grapcfg): muestra todos los nodos coincidentesElija dónde se escriben los archivos desensamblados (.grapcfg); compare múltiples archivos contra múltiples patrones:
grap patterns/basic_block_loop.grapp -o ls.grapcfg /bin/ls: desensambla ls en ls.grapp y busca bucles de bloques básicosgrap (pattern1.grapp) -p (pattern2.grapp) (test.exe): compara contra múltiples archivos de patronesgrap -r -q patterns/ /bin/ -o /tmp/ : desensambla todos los archivos de /bin/ en /tmp/ y los compara contra todos los patrones .grapp de patterns/ (la opción recursiva -r se aplica a /bin/, no a patterns/)El siguiente patrón detecta un bucle de descifrado que consiste en un xor seguido de sub encontrado en una muestra de 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]
}
Tenga en cuenta que los archivos de patrón pueden contener múltiples grafos de patrón.
Puede encontrar ejemplos adicionales de patrones en dos directorios:
Sobre muestras de malware:
Uso de enlaces de Python:
Encontrará más documentación en la carpeta doc/:
La sintaxis de los grafos de patrón y prueba se detalla en el archivo grap_graphs.pdf en la sección de lanzamientos.
grap está licenciado bajo la licencia MIT. El texto completo de la licencia se puede encontrar en LICENSE.