MASTG-TOOL-0036: r2frida
r2frida 是一个项目,它允许 radare2 连接到 Frida,从而有效地将 radare2 强大的逆向工程能力与 Frida 的动态工具包相结合。r2frida 可以在 Android 和 iOS 上使用,允许你:
- 通过 USB 或 TCP 将 radare2 附加到任何本地进程或远程 frida-server。
- 从目标进程读取/写入内存。
- 将 Frida 信息(如映射、符号、导入、类和方法)加载到 radare2 中。
- 从 Frida 调用 r2 命令,因为它将 r2pipe 接口暴露到 Frida JavaScript API 中。
请参考 r2frida 的官方安装说明。
在 frida-server 运行的情况下,您现在应该能够使用 PID、spawn 路径、主机和端口或设备 ID 附加到它。例如,要附加到 PID 1234
r2 frida://1234
有关如何连接到 frida-server 的更多示例,请参阅 r2frida 的 README 页面中的使用部分。
以下示例是使用 Android 应用程序执行的,但也适用于 iOS 应用程序。
一旦进入 r2frida 会话,所有命令都以 :
或 =!
开头。 例如,在 radare2 中,您将运行 i
来显示二进制信息,但在 r2frida 中,您将使用 :i
。
使用
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
要在内存中搜索特定关键字,您可以使用搜索命令 :/
[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
要以 JSON 格式输出搜索结果,我们只需将 j
添加到我们之前的搜索命令(就像我们在 r2 shell 中所做的那样)。 这可以用于大多数命令
[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 "},
...
要列出加载的库,请使用命令 :il
并使用 radare2 中的内部 grep 命令 ~
过滤结果。 例如,以下命令将列出与关键字 keystore
、ssl
和 crypto
匹配的已加载库
[0x00000000]> :il~keystore,ssl,crypto
0x00007f3357b8e000 libssl.so.1.1
0x00007f3357716000 libcrypto.so.1.1
类似地,列出导出并按特定关键字过滤结果
[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
要列出或设置断点,请使用命令 db。 这在分析/修改内存时很有用
[0x00000000]> :db
最后,请记住您还可以使用 :.
加上脚本名称来运行 Frida JavaScript 代码
[0x00000000]> :. agent.js
您可以在其 Wiki 项目中找到更多关于 如何使用 r2frida 的示例。