frida 入门及几种 hook 思路
字数 961 2025-08-22 12:22:36

Frida 入门及 Hook 技术实战指南

一、Frida 简介与对比

Frida 与 Xposed 对比

  • Xposed:

    • 开发模式:需要编写组件并重新打包应用
    • 特点:一劳永逸,适合长期使用
    • 工作方式:修改应用运行时环境
  • Frida:

    • 开发模式:通过注入 JavaScript 代码到目标进程
    • 特点:灵活便捷,适合动态分析和临时调试
    • 工作方式:进程注入技术

Frida 优势

  • 无需修改 APK 文件
  • 支持多种平台(Android、iOS、Windows、macOS 等)
  • 动态修改应用行为
  • 强大的 JavaScript API

二、环境搭建

1. 基础环境准备

  • Python 3.7+
  • 夜神模拟器(Android 5.1.1)
  • Windows 10 系统

2. Frida 安装

pip install frida
pip install frida-tools

3. Frida-server 部署

  1. 确定模拟器架构:
adb shell getprop ro.product.cpu.abi
  1. frida-releases 下载对应版本的 frida-server
  2. 推送并运行:
adb push frida-server /data/local/tmp
adb forward tcp:27042 tcp:27042
adb shell /data/local/tmp/frida-server

4. 验证安装

frida-ps -U

三、Hook 技术实战

案例一:解锁码绕过

目标分析

  • 应用需要输入解锁码
  • 解锁码通过加密函数生成
  • 使用 equals() 方法比较用户输入与正确解锁码

Hook 方法一:拦截 equals() 方法

Java.perform(function() {
    var String = Java.use('java.lang.String');
    String.equals.implementation = function(arg1) {
        console.log("Your input: " + this.toString());
        console.log("Real key: " + arg1);
        return this.equals(arg1);
    }
});

Hook 方法二:拦截打印函数

Java.perform(function() {
    var Show_key = Java.use("com.hfdcxy.android.by.a.a");
    Show_key.a.overload("java.lang.String").implementation = function(args1) {
        console.log("Your_key_is: " + args1);
    }
});

Hook 方法三:修改加密函数返回值

Java.perform(function() {
    var my_class = Java.use("com.hfdcxy.android.by.test.a");
    my_class.a.implementation = function() {
        return "123456789"; // 返回我们控制的固定值
    }
});

案例二:游戏金币修改

目标分析

  • 点击金币按钮:coin += i (i 默认为1)
  • 开宝箱条件:coin >= 9999

Hook 方法:修改函数参数

Java.perform(function() {
    var coin = Java.use("com.hfdcxy.android.by.test.b");
    coin.a.overload("android.content.SharedPreferences", 
                   "android.widget.TextView", 
                   "int").implementation = function(args1, args2, args3) {
        return this.a(args1, args2, 9999); // 修改第三个参数为9999
    }
});

四、Python 加载器

import time
import frida

# 获取设备并启动目标应用
device = frida.get_remote_device()
pid = device.spawn(["com.ss.android.ugc.aweme"])  # 目标包名
device.resume(pid)
time.sleep(1)  # 等待应用启动

# 附加到进程并注入脚本
session = device.attach(pid)
with open("hook_script.js") as f:
    script = session.create_script(f.read())
script.load()

# 保持脚本运行
input()

五、高级技巧与最佳实践

1. 方法重载处理

  • 使用 overload() 指定具体方法签名
  • 示例:
var cls = Java.use("com.example.Class");
cls.method.overload("int", "java.lang.String").implementation = function(a, b) {
    // 实现代码
}

2. 动态类加载

Java.perform(function() {
    var Activity = Java.use("android.app.Activity");
    Activity.onResume.implementation = function() {
        console.log("Activity resumed");
        this.onResume();
    }
});

3. 创建新对象

var String = Java.use("java.lang.String");
var newString = String.$new("Hello Frida");

4. 修改字段值

Java.perform(function() {
    var cls = Java.use("com.example.Class");
    cls.field.value = "new value";
});

六、调试技巧

  1. 日志输出
console.log("Debug info: ", someValue);
  1. 异常捕获
try {
    // 可能出错的代码
} catch(e) {
    console.log("Error: " + e);
}
  1. 方法调用堆栈
console.log(Java.use("android.util.Log").getStackTraceString(
    Java.use("java.lang.Exception").$new()
));

七、安全注意事项

  1. 仅用于合法授权的测试
  2. 测试完成后移除注入代码
  3. 避免在生产环境中使用
  4. 注意目标应用的反调试机制

八、扩展学习资源

  1. Frida 官方文档
  2. Frida JavaScript API 参考
  3. 社区提供的各种 Frida 脚本模板
  4. 实际应用案例研究

通过本指南,您应该已经掌握了 Frida 的基本使用方法及多种 Hook 技术。实际应用中,建议从简单案例开始,逐步深入理解 Frida 的强大功能。

Frida 入门及 Hook 技术实战指南 一、Frida 简介与对比 Frida 与 Xposed 对比 Xposed : 开发模式:需要编写组件并重新打包应用 特点:一劳永逸,适合长期使用 工作方式:修改应用运行时环境 Frida : 开发模式:通过注入 JavaScript 代码到目标进程 特点:灵活便捷,适合动态分析和临时调试 工作方式:进程注入技术 Frida 优势 无需修改 APK 文件 支持多种平台(Android、iOS、Windows、macOS 等) 动态修改应用行为 强大的 JavaScript API 二、环境搭建 1. 基础环境准备 Python 3.7+ 夜神模拟器(Android 5.1.1) Windows 10 系统 2. Frida 安装 3. Frida-server 部署 确定模拟器架构: 从 frida-releases 下载对应版本的 frida-server 推送并运行: 4. 验证安装 三、Hook 技术实战 案例一:解锁码绕过 目标分析 应用需要输入解锁码 解锁码通过加密函数生成 使用 equals() 方法比较用户输入与正确解锁码 Hook 方法一:拦截 equals() 方法 Hook 方法二:拦截打印函数 Hook 方法三:修改加密函数返回值 案例二:游戏金币修改 目标分析 点击金币按钮:coin += i (i 默认为1) 开宝箱条件:coin >= 9999 Hook 方法:修改函数参数 四、Python 加载器 五、高级技巧与最佳实践 1. 方法重载处理 使用 overload() 指定具体方法签名 示例: 2. 动态类加载 3. 创建新对象 4. 修改字段值 六、调试技巧 日志输出 : 异常捕获 : 方法调用堆栈 : 七、安全注意事项 仅用于合法授权的测试 测试完成后移除注入代码 避免在生产环境中使用 注意目标应用的反调试机制 八、扩展学习资源 Frida 官方文档 Frida JavaScript API 参考 社区提供的各种 Frida 脚本模板 实际应用案例研究 通过本指南,您应该已经掌握了 Frida 的基本使用方法及多种 Hook 技术。实际应用中,建议从简单案例开始,逐步深入理解 Frida 的强大功能。