应用安全 --- frida安装
Frida 动态 Hook 框架核心入门指南
一、核心概念:理解 Hook
-
定义:Hook(钩子)是一种强大的运行时技术,允许你拦截和修改应用程序的执行流程。你可以监视函数调用、查看和修改参数、篡改返回值,从而改变应用的行为。
-
目的:在 APP 逆向工程中,Hook 是我们动态分析应用逻辑的“瑞士军刀”。它主要用于:
-
定位加密算法:找到 App 对请求参数进行加密签名的具体方法。
-
pj验证逻辑:绕过登录、注册等环节的验证。
-
分析网络协议:理解 App 与服务器通信的细节。
-
-
为什么选择 Frida?
-
动态注入:无需修改 APK 或重启手机(相比 Xposed),灵活性极高。
-
跨平台:支持 Android、iOS、Windows、macOS 等。
-
脚本化:使用 JavaScript 编写 Hook 脚本,简单易上手。
-
活跃社区:拥有丰富的工具和脚本资源。
-
二、环境搭建:电脑与手机配对
Frida 采用 C/S(客户端-服务器)架构。电脑是控制端 (Client),手机是被控端 (Server)。
步骤 | 操作 | 说明与常见坑点 |
---|---|---|
1. 电脑端 (Client) | pip install frida frida-tools |
安装 Python 库和命令行工具。核心:记下安装的 Frida 版本号 (e.g., 16.2.1)。 |
2. 手机架构查询 | adb shell getprop ro.product.cpu.abi |
查询手机 CPU 架构 (e.g., arm64 )。这是下载正确 frida-server 的依据。 |
3. 下载 Server | 访问 Frida Releases | 下载与电脑端版本号完全相同且架构对应的 frida-server-xx-android-xx.xz 。 |
4. 推送与授权 | adb push frida-server /data/local/tmp/ adb shell -> su -> chmod 777 /data/local/tmp/frida-server |
推送文件到手机并赋予可执行权限。777 表示所有用户可读、写、执行。 |
5. 启动 Server | adb shell -> su -> /data/local/tmp/frida-server & |
在手机后台启动 Frida 服务。参数 & 表示在后台运行,关闭终端也不会停止它。 |
6. 端口转发 | adb forward tcp:27042 tcp:27042 adb forward tcp:27043 tcp:27043 |
将手机上的 Frida 服务端口映射到电脑,这是二者通信的桥梁。 |
成功关键:版本一致、架构匹配、权限正确。任何一步出错都会导致连接失败。
三、连接测试与进程管理
在电脑上运行测试脚本,验证环境是否畅通。
import frida
# 获取连接到电脑的手机设备对象
device = frida.get_remote_device()
# 打印所有正在运行的进程
processes = device.enumerate_processes()
for proc in processes:
print(proc) # 包含 pid(进程ID), name(进程名), parameters(包名等信息)
# 获取当前前台应用(最常用的信息)
front_app = device.get_frontmost_application()
print(f"\n前台应用: {front_app}")
# 输出示例:Application(identifier="com.zhihu.android", name="知乎", pid=12345)
如果能成功打印出进程列表和前台应用信息,恭喜你,Frida 环境已完全配置成功。
四、两种 Hook 模式:Spawn vs. Attach
这是 Frida 使用的核心概念,理解其区别至关重要。
特性 | Spawn | Attach |
---|---|---|
启动方式 | 重启目标应用并立即注入 | 附加到已经运行的目标应用进程 |
CLI 命令 | frida -U -f <包名> -l script.js |
frida -U -F -l script.js |
Python 代码 | pid = device.spawn(["包名"]) session = device.attach(pid) ...load script... device.resume(pid) (关键!) |
session = device.attach("应用名") |
优点 | 能 Hook 从应用启动伊始就执行的代码 | 无需重启应用,操作快速方便,不丢失状态 |
缺点 | 会重启应用,丢失当前状态 | 无法 Hook 在应用启动阶段就已执行完毕的函数 |
适用场景 | 加密参数在应用启动时或页面初始化前就已生成 | 加密参数由用户的某个操作(如点击按钮)触发 |
黄金法则:如果你要 Hook 的函数在 APP 一打开就执行了(例如初始化加密密钥),必须用 Spawn。如果是点击按钮等操作后才执行,用 Attach 更快捷。
五、Hook 脚本编写 (JavaScript)
Hook 的核心逻辑在 JavaScript 中编写。
通用模板:
Java.perform(function () { // 必须在 perform 中执行 Java 相关操作
// 1. 定位要Hook的类(使用完整的类名路径)
var TargetClass = Java.use("com.example.app.utils.CryptoHelper");
// 2. Hook 类中的特定方法
TargetClass.encryptData.implementation = function (inputData, key) {
// 打印传入的参数
console.log("[*] encryptData 被调用!");
console.log(" 参数 inputData: " + inputData);
console.log(" 参数 key: " + key);
// (可选)调用原方法获取真正的返回值
var realResult = this.encryptData(inputData, key);
// 打印原方法的返回值
console.log(" 返回值: " + realResult);
// 你可以选择返回原始结果,或者篡改它!
// return "hacked_result";
return realResult; // 返回原始结果,让应用正常运作
};
});
六、完整工作流总结
-
静态分析 (Jadx):反编译 APK,根据关键词(如
encrypt
,sign
,md5
)搜索,找到疑似加密方法的完整类名和方法名。 -
动态验证 (Frida):
-
环境就绪:确保
frida-server
在手机运行且端口已转发。 -
选择模式:根据目标方法执行时机,决定用
Spawn
还是Attach
。 -
编写脚本:将找到的类名和方法名填入 JS Hook 脚本模板。
-
执行 Hook:
-
命令行:
frida -U -F -l hook.js
(Attach) 或frida -U -f 包名 -l hook.js
(Spawn)。 -
Python 脚本:更灵活,适合复杂和自动化任务。
-
-
-
观察分析:触发 App 的相关操作,在 Frida 输出的日志中查看被 Hook 方法的输入和输出,从而验证其功能和解密逻辑。
您已经掌握了 Frida 的核心使用方法!接下来就是不断地实践:用 Jadx 静态分析找到可疑点,再用 Frida 动态验证,这才是逆向工程的完整闭环。