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.