【Frida Android】基础篇13:Frida-Trace 基础简介——从命令到脚本的动态追踪入门
文章目录
- Frida-Trace 简介
- 1. 环境确认
- 2. 核心使用场景
- 3. 基础命令行选项
- 3.1 设备连接(核心必选)
- 3.2 函数过滤(核心逻辑)
- 3.3 输出控制(辅助优化)
- 4. 自动生成脚本
- 5. 核心总结
- 6. 后续预告
⚠️本博文所涉安全渗透测试技术、方法及案例,仅用于网络安全技术研究与合规性交流,旨在提升读者的安全防护意识与技术能力。任何个人或组织在使用相关内容前,必须获得目标网络 / 系统所有者的明确且书面授权,严禁用于未经授权的网络探测、漏洞利用、数据获取等非法行为。
Frida-Trace 简介
在逆向分析与动态调试中,快速定位关键函数的调用逻辑往往是破解问题的第一步。无论是 Android 应用的 Java 方法、原生库的 JNI 函数,还是本地进程的系统调用,手动编写钩子脚本不仅耗时,还需要熟悉 Frida 底层 API。而 Frida-Trace 作为 Frida 官方推出的动态追踪工具,恰好解决了这一痛点——它能通过简单的命令行操作,自动生成可定制的追踪脚本,让跨平台函数追踪变得高效且低门槛。
本文将从环境准备到核心用法,带你快速掌握 Frida-Trace 的基础逻辑,为下一篇的实战案例打好基础。
1. 环境确认
Frida-Trace 是 frida-tools 工具集的核心组件,使用前需确认本地环境已正确安装 Frida 及配套工具,且版本兼容(建议保持 frida 与 frida-trace 版本一致)。
检查命令:
frida --version # 查看 Frida 版本
frida-trace --version # 查看 Frida-Trace 版本

若未安装,可通过 pip 快速部署:
pip install frida-tools
2. 核心使用场景
Frida-Trace 的核心能力是「动态追踪进程中已加载/动态加载的函数」,覆盖多平台、多语言场景。以下为 4 类典型场景及简化命令示例:
| 目标场景 | 命令示例 | 说明 |
|---|---|---|
| Android(APK Java 方法) | frida-trace -U -f com.google.android.youtube -j '*!*certificate*' | 连接 USB 设备,启动 YouTube 应用,追踪所有类中方法名含 certificate 的 Java 方法 |
| Android(JNI 函数) | frida-trace -U -i "Java_*" com.samsung.faceservice | 追踪三星 FaceService 应用中所有符合 JNI 命名规范(Java_包名_类名_方法名)的函数 |
| 未导出函数(静态/偏移函数) | frida-trace -p 1372 -a "libjpeg.so!0x4793c" | 附加到 PID 1372 的进程,追踪 libjpeg.so 中偏移为 0x4793c 的未导出函数(如静态 C 函数) |
| 本地进程函数(系统/库函数) | frida-trace -p 1234 -i "memcpy" | 附加到 PID 1234 的本地进程,追踪所有模块中名为 memcpy 的函数 |
3. 基础命令行选项
Frida-Trace 的命令行选项可分为「设备连接」「函数过滤」「输出控制」三大类,掌握这些选项能精准定位追踪目标。
3.1 设备连接(核心必选)
| 选项 | 说明 |
|---|---|
-U, --usb | 连接 USB 设备(Android/iOS 常用,需提前在设备端运行 frida-server) |
-p PID, --attach-pid PID | 附加到已运行进程的 PID(如 -p 1372,需知道目标进程 ID) |
-f TARGET, --file TARGET | 启动指定程序(如 Android 应用包名 -f com.example.app,或本地程序路径) |
3.2 函数过滤(核心逻辑)
| 选项 | 说明 |
|---|---|
-i FUNC, --include FUNC | 包含匹配 FUNC 的函数(支持通配符,如 -i "mem*" 匹配所有 mem 开头的函数) |
-x FUNC, --exclude FUNC | 排除匹配 FUNC 的函数(格式同 -i,如 -x "free" 可过滤掉 free 函数的追踪) |
-a MODULE!OFFSET, --add | 追踪指定模块中某偏移的函数(用于未导出函数,格式如 -a "libxxx.so!0x12345") |
-j JAVA, --include-java-method JAVA | 追踪 Java 方法(格式为 类名!方法名,支持通配符,如 -j '*!encrypt*' 匹配所有含 encrypt 的方法) |
3.3 输出控制(辅助优化)
| 选项 | 说明 |
|---|---|
-o OUTPUT, --output OUTPUT | 将追踪日志输出到指定文件(如 -o trace.log,避免控制台信息溢出) |
-d, --decorate | 日志中添加模块名(区分多模块同名函数,如 memcpy() [msvcrt.dll]) |
4. 自动生成脚本
执行追踪命令后,当前目录会自动生成 __handlers__ 文件夹,其中按「模块/函数」分类存储 JavaScript 脚本(如 __handlers__/msvcrt.dll/memcpy.js)。这些脚本是定制追踪逻辑的核心,默认包含两个钩子函数:
{/*** 函数被调用时触发(进入函数)* @param log: 日志打印函数(直接调用即可输出信息)* @param args: 函数参数数组(需按类型解析,如 args[0].readUtf8String() 读取字符串参数)* @param state: 状态对象,可在 onEnter/onLeave 间传递数据(如记录开始时间)*/onEnter(log, args, state) {log('memcpy() 被调用');state.startTime = Date.now(); // 记录函数执行开始时间},/*** 函数返回时触发(离开函数)* @param retval: 函数返回值(需按类型解析,如 retval.toInt32() 读取整数返回值)*/onLeave(log, retval, state) {const cost = Date.now() - state.startTime; // 计算执行耗时log(`memcpy() 执行耗时: ${cost}ms,返回值: ${retval}`);}
}
通过修改脚本,可实现参数解析(如读取字符串、内存地址)、耗时统计、返回值校验等定制化需求,无需从零编写 Frida 钩子代码。
5. 核心总结
Frida-Trace 之所以成为动态分析的利器,核心在于三点:
- 低门槛:命令行一键启动追踪,自动生成脚本框架,无需手动编写钩子逻辑;
- 灵活性:通过设备选择、函数过滤、参数定制,精准定位目标函数;
- 跨平台:覆盖 Android/iOS/桌面系统,支持 Java 方法、原生函数、系统调用等多类型追踪。
基础使用流程可概括为:「连接设备/选择进程 → 过滤目标函数 → 修改 handler 脚本定制逻辑 → 分析输出结果」。
6. 后续预告
下一篇文章将针对本文提到的 4 个核心场景,逐个提供完整的实操流程案例解析,带你从“知道命令”到“实操应用”。
