🔓 前言:什么是 Hook?
想象你在寄快递。
- 正常流程:你把东西装箱 -> 快递员打包封箱 -> 发货。
- Hook (钩子):你买通了快递员。当你把东西给他时,他先打开箱子拍张照(获取明文),甚至偷偷换掉里面的东西(篡改数据),然后再打包发货。
在 Android 逆向中,Frida 就是那个“被买通的快递员”。它能动态拦截 Java/Native 层的方法调用。
🏗️ 一、 核心原理:动态插桩
Frida 是一款基于 Python 和 JavaScript 的 Hook 框架。
- PC 端:运行 Python 脚本,发送指令。
- 手机端:运行
frida-server,它像一个寄生虫一样注入到目标 App 的进程中。 - JS 脚本:我们在脚本里写好要拦截哪个类、哪个方法,Frida 会在内存中把该方法的实现“偷梁换柱”。
Frida 工作流程图 (Mermaid):
🛠️ 二、 环境准备
- 已 Root 的安卓手机(或模拟器,如 Genymotion)。
- PC 环境:
pipinstallfrida-tools- 手机环境:
- 去 GitHub 下载对应架构的
frida-server。 - 推送到手机并启动:
adb push frida-server /data/local/tmp/ adb shell"chmod +x /data/local/tmp/frida-server"adb shell"/data/local/tmp/frida-server &"🔎 三、 第一步:定位嫌疑人 (Jadx 反编译)
在 Hook 之前,我们得知道 Hook 谁。
假设我们抓包看到一个参数sign,我们使用Jadx打开 APK 文件,搜索关键词"sign"或"encrypt"。
经过一番查找,我们发现了一个可疑类com.example.demo.utils.SecurityUtil,里面有一个静态方法md5Encode:
// 反编译出的 Java 代码片段packagecom.example.demo.utils;publicclassSecurityUtil{// 这就是我们要找的加密函数!publicstaticStringmd5Encode(Stringstr,Stringsalt){// ... 复杂的混淆代码 ...returnresult;}}代码被混淆了看不懂?没关系!
有了 Frida,我们根本不需要读懂它内部在算什么,我们只需要守在它的门口,看它进去了什么参数。
💉 四、 第二步:编写 Frida 脚本 (JavaScript)
新建一个文件hook_script.js。这是 Frida 的灵魂。
// 当 Java 虚拟机加载完成后执行Java.perform(function(){console.log("[*] 正在注入脚本,等待目标函数触发...");// 1. 定位目标类// 注意:如果是混淆代码,可能是 'a.b.c.d' 这种名字varSecurityUtil=Java.use("com.example.demo.utils.SecurityUtil");// 2. Hook 目标方法 (md5Encode)// overload 用于解决重载问题,这里假设参数是两个 StringSecurityUtil.md5Encode.overload('java.lang.String','java.lang.String').implementation=function(inputStr,saltKey){// --- 核心操作:截获数据 ---console.log("\n========================================");console.log("[+] 发现加密调用!");console.log("[+] 明文参数 (str): "+inputStr);console.log("[+] 隐藏密钥 (salt): "+saltKey);// 3. 必须执行原始方法,否则 App 会崩或逻辑中断varresult=this.md5Encode(inputStr,saltKey);console.log("[+] 计算结果 (sign): "+result);console.log("========================================\n");returnresult;};});🚀 五、 第三步:运行与收网
- 确保手机上 App 正在运行。
- 在 PC 终端执行命令:
(假设 App 包名是 com.example.demo)
frida -U -f com.example.demo -l hook_script.js --no-pause- 触发逻辑:
在手机 App 上点击登录或刷新列表。 - 见证奇迹:
你的 PC 终端会瞬间疯狂吐出日志:
[*] 正在注入脚本,等待目标函数触发... ======================================== [+] 发现加密调用! [+] 明文参数 (str): user_id=10086×tamp=1678888888 [+] 隐藏密钥 (salt): Ai_Is_The_Future_2025 [+] 计算结果 (sign): e10adc3949ba59abbe56e057f20f883e ========================================Bingo!
我们不需要分析几千行混淆代码,直接拿到了核心:
- 明文数据:它是怎么拼接入参的。
- 隐藏密钥:
Ai_Is_The_Future_2025。有了这个盐值(Salt),你自己用 Python 写个 MD5 脚本就能模拟出合法的签名的请求了!
🛡️ 总结与思考
Frida 的强大在于它无视混淆,直接从内存层面进行拦截。
对于开发者来说,这也敲响了警钟:不要把密钥硬编码在 App 里,在 Frida 面前,App 就像是在“裸奔”。
常见的 Hook 场景:
- 抓包解密:拦截 SSL Pinning 或加密函数的入参。
- 自动化测试:Hook UI 点击事件。
- 会员破解:Hook
isVip()方法,强行返回true。
Next Step:
尝试找一个简单的 Demo App(比如 CTF 练习题),自己动手写一个 Hook 脚本,你会发现逆向世界的大门才刚刚打开。