
Define e compara padrões de grafo definidos pelo usuário com grafos de fluxo de controle binários usando um desmontador baseado em Capstone, com suporte a CLI, bindings Python e plugin IDA.
O grap recebe padrões e arquivos binários, usa um desassemblador baseado em Casptone para obter os grafos de fluxo de controle dos binários e então corresponde os padrões contra eles.
Os padrões são grafos definidos pelo usuário com condições de instrução ("opcode é xor e arg1 é eax") e condições de repetição (3 instruções idênticas, blocos básicos...).
O grap está disponível como uma ferramenta independente com um desassemblador e bindings Python, e como um plugin para IDA que aproveita a desmontagem feita pelo IDA e pelo reverser.
Suporte:




Este documento descreve como compilar e instalar o grap em uma distribuição Linux.
Você também pode ler:
Além dos compiladores (build-essential), as seguintes dependências devem ser instaladas:
Assim, no Ubuntu / Debian, isso deve 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
Por favor, note que estes foram testados para a última versão LTS do Ubuntu (18.04.3). Os pacotes podem diferir dependendo da sua distribuição.
Os seguintes comandos irão compilar e instalar o projeto:
mkdir build; cd build/ conforme aconselhamos compilar o projeto em um diretório dedicadocmake ../src/; make irá compilar com cmake e makesudo make install instalará o grap em /usr/local/bin/O SWIG pode falhar ao encontrar o python3 se sua versão padrão for python2; isso pode ser superado alterando para python3 como padrão. Por exemplo, no Ubuntu:
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 10
A ferramenta pode ser iniciada usando o seguinte comando:
$ grap [options] pattern test_paths
Abaixo estão alguns exemplos de opções suportadas:
grap -h: descreve as opções suportadasPode-se deixar o grap inferir um padrão a partir de uma string. Apenas algumas opções são suportadas, mas isso é útil para prototipagem:
grap "opcode is xor and arg1 contains '['" (test.exe): procura por um xor com uma escrita em memóriagrap -v "sub->xor->sub" (test.exe): -v exibirá o caminho do padrão inferidoEscolha como os binários são desmontados:
grap -od (pattern.grapp) samples/*: desmonta arquivos na pasta samples/ sem tentar correspondergrap -f (pattern.grapp) (test.exe): força a redesmontagem do binário e então corresponde-o contra pattern.grappgrap --raw (pattern.grapp) (test.bin): desmonta arquivo bruto (use --raw-64 para binários de 64 bits)Controle a verbosidade da saída:
grap -q -sa (pattern.grapp) (samples/*.grapcfg): corresponde arquivos desmontados, mostra arquivos correspondentes e não correspondentes, um por linhagrap -m (pattern.grapp) (test.grapcfg): mostra todos os nós correspondidosEscolha onde o(s) arquivo(s) desmontado(s) (.grapcfg) são escritos; corresponda múltiplos arquivos contra múltiplos padrões:
grap patterns/basic_block_loop.grapp -o ls.grapcfg /bin/ls: desmonta ls em ls.grapp e procura por loops de blocos básicosgrap (pattern1.grapp) -p (pattern2.grapp) (test.exe): corresponde contra múltiplos arquivos de padrãograp -r -q patterns/ /bin/ -o /tmp/ : desmonta todos os arquivos de /bin/ em /tmp/ e corresponde-os contra todos os padrões .grapp de patterns/ (a opção recursiva -r se aplica a /bin/, não a patterns/)O padrão a seguir detecta um loop de descriptografia consistindo em um xor seguido por sub encontrado em uma amostra 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]
}
Note que arquivos de padrão podem conter múltiplos grafos de padrão.
Você pode encontrar exemplos de padrão adicionais em dois diretórios:
Sobre amostras de malware:
Uso dos bindings Python:
Você encontrará mais documentação na pasta doc/:
A sintaxe dos grafos de padrão e teste é detalhada no arquivo grap_graphs.pdf na seção de releases.
O grap é licenciado sob a licença MIT. O texto completo da licença pode ser encontrado em LICENSE.