Android
本教程将展示如何在 Android 设备上进行函数跟踪。
设置 Android 设备
开始之前,如果你的设备尚未 root,需要先取得 root 权限。从技术上讲,不 root 设备也可以使用 Frida,例如重新打包应用并加入 frida-gadget,或使用调试器达到同样的目的。不过,这篇入门教程将重点介绍最简单的情况:已 root 的设备。
另请注意,我们近期的大部分测试都在运行 Android 9 的 Pixel 3 上进行。较旧的 ROM 也可能正常工作,但如果你遇到启动应用时 Frida 导致系统崩溃等基础问题,这是由 ROM 特有的兼容性问题导致的。我们无法在所有可能的设备上进行测试,因此需要依靠你的帮助来改进这方面的支持。不过,如果你刚开始使用 Frida,强烈建议选择运行最新官方软件的 Pixel 或 Nexus 设备,或者软件尽可能接近 AOSP 的设备。另一种选择是使用模拟器,最好采用 Google 提供的 Android 9 arm 或 arm64 模拟器镜像。(x86 也可能可用,但接受的测试明显更少。)
你还需要 Android SDK 中的 adb 工具。
首先,从我们的 releases 页面下载最新版 Android frida-server 并解压。
$ adb shell getprop ro.product.cpu.abilist # check your device cpu type
$ unxz frida-server.xz现在,让它在设备上运行:
$ adb root # might be required
$ adb push frida-server /data/local/tmp/
$ adb shell "chmod 755 /data/local/tmp/frida-server"
$ adb shell "/data/local/tmp/frida-server &"有些应用或许能够检测到 frida-server 的位置。将 frida-server 二进制文件重命名为随机名称,或移动到 /dev 等其他位置,可能有助于绕过检测。
最后一步,请确保以 root 身份启动 frida-server。也就是说,如果你在已 root 的设备上操作,可能需要先执行 su,再从该 shell 运行它。
在生产版本上使用 adb
如果运行 adb root 后看到 adbd cannot run as root in production builds,
需要在每条 shell 命令前加上 su -c。例如:
adb shell "su -c chmod 755 /data/local/tmp/frida-server"
接下来,确认 adb 能看到你的设备:
$ adb devices -l这样也能确保桌面端的 adb 守护进程正在运行,使 Frida 无论通过 USB 还是 WiFi 连接,都能发现设备并与之通信。
快速冒烟测试
现在回到桌面端,确认基本功能正常。运行:
$ frida-ps -U你应该会看到类似下面的进程列表:
PID NAME
1590 com.facebook.katana
13194 com.facebook.katana:providers
12326 com.facebook.orca
13282 com.twitter.android
…很好,一切就绪!
跟踪 Chrome 中的 open() 调用
好了,来做点有趣的事。在设备上启动 Chrome 应用,然后回到桌面端并运行:
$ frida-trace -U -i open -N com.android.chrome
Uploading data...
open: Auto-generated handler …/linker/open.js
open: Auto-generated handler …/libc.so/open.js
Started tracing 2 functions. Press Ctrl+C to stop.现在只需在 Chrome 应用中随意操作,很快就会看到大量 open() 调用出现:
1392 ms open()
1403 ms open()
1420 ms open()现在,你可以一边阅读 man open,一边实时编辑前述 JavaScript 文件,逐步深入探索 Android 应用。
构建自己的工具
虽然 frida、frida-trace 等 CLI 工具确实非常有用,但有时你可能想利用强大的 Frida API 构建自己的工具。为此,我们建议阅读函数和消息章节;凡是看到 frida.attach() 的地方,只需将它替换为 frida.get_usb_device().attach()。