MASTG-TOOL-0036: r2frida

r2frida é um projeto que permite ao radare2 conectar-se ao Frida, combinando efetivamente as poderosas capacidades de engenharia reversa do radare2 com o kit de ferramentas de instrumentação dinâmica do Frida. O r2frida pode ser usado tanto em Android quanto em iOS, permitindo que você:

  • Conecte o radare2 a qualquer processo local ou frida-server remoto via USB ou TCP.
  • Leia/Escreva memória do processo alvo.
  • Carregue informações do Frida, como mapas, símbolos, imports, classes e métodos no radare2.
  • Execute comandos do r2 a partir do Frida, já que expõe a interface r2pipe na API JavaScript do Frida.

Consulte as instruções oficiais de instalação do r2frida.

Com o frida-server em execução, você agora deve conseguir conectar-se a ele usando o pid, caminho de spawn, host e porta, ou device-id. Por exemplo, para conectar ao PID 1234:

r2 frida://1234

Para mais exemplos de como conectar ao frida-server, consulte a seção de uso na página README do r2frida.

Os exemplos a seguir foram executados usando um aplicativo Android, mas também se aplicam a aplicativos iOS.

Uma vez na sessão do r2frida, todos os comandos começam com : ou =!. Por exemplo, no radare2 você executaria i para exibir as informações do binário, mas no r2frida você usaria :i.

Veja todas as opções com r2 frida://?.

[0x00000000]> :i
arch                x86
bits                64
os                  linux
pid                 2218
uid                 1000
objc                false
runtime             V8
java                false
cylang              false
pageSize            4096
pointerSize         8
codeSigningPolicy   optional
isDebuggerAttached  false

Para pesquisar na memória por uma palavra-chave específica, você pode usar o comando de pesquisa :/:

[0x00000000]> :/ unacceptable
Searching 12 bytes: 75 6e 61 63 63 65 70 74 61 62 6c 65
Searching 12 bytes in [0x0000561f05ebf000-0x0000561f05eca000]
...
Searching 12 bytes in [0xffffffffff600000-0xffffffffff601000]
hits: 23
0x561f072d89ee hit12_0 unacceptable policyunsupported md algorithmvar bad valuec
0x561f0732a91a hit12_1 unacceptableSearching 12 bytes: 75 6e 61 63 63 65 70 74 61

Para exibir os resultados da pesquisa em formato JSON, simplesmente adicionamos j ao nosso comando de pesquisa anterior (assim como fazemos no shell do r2). Isso pode ser usado na maioria dos comandos:

[0x00000000]> :/j unacceptable
Searching 12 bytes: 75 6e 61 63 63 65 70 74 61 62 6c 65
Searching 12 bytes in [0x0000561f05ebf000-0x0000561f05eca000]
...
Searching 12 bytes in [0xffffffffff600000-0xffffffffff601000]
hits: 23
{"address":"0x561f072c4223","size":12,"flag":"hit14_1","content":"unacceptable \
policyunsupported md algorithmvar bad valuec0"},{"address":"0x561f072c4275", \
"size":12,"flag":"hit14_2","content":"unacceptableSearching 12 bytes: 75 6e 61 \
63 63 65 70 74 61"},{"address":"0x561f072c42c8","size":12,"flag":"hit14_3", \
"content":"unacceptableSearching 12 bytes: 75 6e 61 63 63 65 70 74 61 "},
...

Para listar as bibliotecas carregadas, use o comando :il e filtre os resultados usando o grep interno do radare2 com o comando ~. Por exemplo, o seguinte comando listará as bibliotecas carregadas que correspondem às palavras-chave keystore, ssl e crypto:

[0x00000000]> :il~keystore,ssl,crypto
0x00007f3357b8e000 libssl.so.1.1
0x00007f3357716000 libcrypto.so.1.1

Da mesma forma, para listar as exportações e filtrar os resultados por uma palavra-chave específica:

[0x00000000]> :iE libssl.so.1.1~CIPHER
0x7f3357bb7ef0 f SSL_CIPHER_get_bits
0x7f3357bb8260 f SSL_CIPHER_find
0x7f3357bb82c0 f SSL_CIPHER_get_digest_nid
0x7f3357bb8380 f SSL_CIPHER_is_aead
0x7f3357bb8270 f SSL_CIPHER_get_cipher_nid
0x7f3357bb7ed0 f SSL_CIPHER_get_name
0x7f3357bb8340 f SSL_CIPHER_get_auth_nid
0x7f3357bb7930 f SSL_CIPHER_description
0x7f3357bb8300 f SSL_CIPHER_get_kx_nid
0x7f3357bb7ea0 f SSL_CIPHER_get_version
0x7f3357bb7f10 f SSL_CIPHER_get_id

Para listar ou definir um ponto de interrupção, use o comando db. Isso é útil ao analisar/modificar memória:

[0x00000000]> :db

Finalmente, lembre-se de que você também pode executar código JavaScript do Frida com :. mais o nome do script:

[0x00000000]> :. agent.js

Você pode encontrar mais exemplos sobre como usar o r2frida em seu projeto Wiki.