GKLBB

当你经历了暴风雨,你也就成为了暴风雨

导航

应用安全 --- 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 服务端口映射到电脑,这是二者通信的桥梁。

成功关键:版本一致、架构匹配、权限正确。任何一步出错都会导致连接失败。

三、连接测试与进程管理

在电脑上运行测试脚本,验证环境是否畅通。

python
 
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 使用的核心概念,理解其区别至关重要。

特性SpawnAttach
启动方式 重启目标应用并立即注入 附加到已经运行的目标应用进程
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 中编写。

通用模板:

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; // 返回原始结果,让应用正常运作
    };
});

六、完整工作流总结

  1. 静态分析 (Jadx):反编译 APK,根据关键词(如 encryptsignmd5)搜索,找到疑似加密方法的完整类名和方法名。

  2. 动态验证 (Frida):

    • 环境就绪:确保 frida-server 在手机运行且端口已转发。

    • 选择模式:根据目标方法执行时机,决定用 Spawn 还是 Attach

    • 编写脚本:将找到的类名和方法名填入 JS Hook 脚本模板。

    • 执行 Hook:

      • 命令行:frida -U -F -l hook.js (Attach) 或 frida -U -f 包名 -l hook.js (Spawn)。

      • Python 脚本:更灵活,适合复杂和自动化任务。

  3. 观察分析:触发 App 的相关操作,在 Frida 输出的日志中查看被 Hook 方法的输入和输出,从而验证其功能和解密逻辑。

您已经掌握了 Frida 的核心使用方法!接下来就是不断地实践:用 Jadx 静态分析找到可疑点,再用 Frida 动态验证,这才是逆向工程的完整闭环。

posted on 2025-08-24 14:30  GKLBB  阅读(52)  评论(0)    收藏  举报