安卓逆向-从刷机到frida的入门与实践
字数 1700 2025-09-23 19:27:38

安卓逆向:从刷机到Frida的入门与实践

一、刷机准备

1.1 设备与工具要求

  • 测试设备:Nexus 6P(代号angler)
  • 原系统版本:Android 8.1.0(需升级至Android 10)
  • 刷机工具
  • 环境配置
    • Ubuntu 24.04(虚拟机推荐,避免驱动问题)
    • Android Platform-Tools(ADB和Fastboot工具)
    • 虚拟机工具:sudo apt-get install open-vm-tools-desktop(实现文件共享和复制粘贴)

1.2 文件准备

  1. boot.img:从LineageOS刷机包中提取(后续Root需要)
  2. Magisk安装包:APK文件用于安装和管理Root
  3. 共享文件夹配置:在虚拟机中设置共享目录(/mnt/hgfs/共享文件夹名

二、刷机流程

2.1 刷入TWRP Recovery

  1. 手机进入Fastboot模式:
    • 关机后长按 电源键 + 音量下键
  2. 连接电脑,在终端执行:
    fastboot flash recovery twrp.img  # 刷入TWRP
    fastboot reboot recovery          # 重启至Recovery模式
    

2.2 安装Magisk获取Root

  1. 在TWRP界面点击“Install”,选择Magisk安装包(ZIP格式),滑动确认刷入。
  2. 重启系统后安装Magisk APK,修补Boot镜像:
    • 打开Magisk → 安装 → 选择“修补文件” → 选择boot.img
    • 生成修补后的镜像(如magisk_patched-24300_pmcKO.img
  3. 刷入修补后的Boot镜像:
    adb reboot bootloader            # 进入Fastboot模式
    fastboot flash boot magisk_patched.img
    fastboot reboot
    

2.3 刷入LineageOS

  1. 进入TWRP Recovery,执行双清(Wipe → Format Data / Cache)
  2. 点击“Install”选择LineageOS ZIP包,滑动刷入。
  3. 重启系统完成安装。

三、Frida环境配置

3.1 安装Frida工具链

# 使用清华源加速安装
pip install frida -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install frida-tools -i https://pypi.tuna.tsinghua.edu.cn/simple

3.2 部署Frida-Server

  1. 官方GitHub下载与客户端版本匹配的frida-server(选择Android ARM64版本)。
  2. 推送到设备并运行:
    adb push frida-server /data/local/tmp/
    adb shell chmod +x /data/local/tmp/frida-server
    adb shell /data/local/tmp/frida-server &
    

3.3 连接测试

frida-ps -U  # 查看USB设备进程列表

四、Frida Hook基础框架

4.1 核心函数与结构

Java.perform(function () {
  // 所有Hook逻辑写在此函数内
  var TargetClass = Java.use("包名.类名");
  
  // Hook方法示例
  TargetClass.方法名.implementation = function (参数) {
    // 修改逻辑或打印参数
    console.log("参数值: " + 参数);
    return this.方法名(参数); // 调用原方法
  };
});

4.2 关键概念解析

  • Java.perform():用于在Native层与Java环境之间建立桥梁,所有Java层操作必须包裹在此函数中。
  • setImmediate(main):延迟执行函数,确保Frida完全注入后再执行Hook逻辑。
  • 重载方法处理:使用.overload('参数类型')指定具体重载方法(例如.overload('int', 'int'))。

五、Frida实战场景

5.1 Hook普通方法(修改参数/返回值)

Java.perform(function () {
  var Utils = Java.use("com.example.Utils");
  Utils.check.overload('int', 'int').implementation = function (a, b) {
    if (a * 2 + 4 == b) {  // 修改条件逻辑
      return true;
    }
    return this.check(a, b);
  };
});

5.2 主动调用静态方法

Java.perform(function () {
  var DemoClass = Java.use("com.example.Demo");
  var result = DemoClass.get_flag(4919);  // 直接调用静态方法
  console.log("Flag: " + result);
});

5.3 修改静态字段值

Java.perform(function () {
  var Checker = Java.use("com.example.Checker");
  Checker.code.value = 512;  // 修改静态字段值
});

5.4 主动调用非静态方法(实例不存在)

Java.perform(function () {
  var FlagClass = Java.use("com.example.FlagClass");
  var instance = FlagClass.$new();  // 创建新实例
  instance.get_flag();             // 调用非静态方法
});

5.5 调用已存在实例的方法

Java.perform(function () {
  Java.choose("com.example.MainActivity", {
    onMatch: function (instance) {
      instance.flag();  // 直接调用实例方法
    },
    onComplete: function () {}
  });
});

5.6 复杂参数处理(参数为类对象)

Java.perform(function () {
  var Checker = Java.use("com.example.Checker");
  var instance = Checker.$new();
  instance.num1.value = 1234;  // 修改实例字段
  instance.num2.value = 4321;

  var MainActivity = Java.use("com.example.MainActivity");
  MainActivity.get_flag(instance);  // 传入类实例作为参数
});

六、常见问题与解决

  1. ADB设备未授权

    • 检查USB调试授权提示,或重启ADB服务:adb kill-server && adb start-server
  2. Frida版本不匹配

    • 确保Client与Server版本完全一致(frida --version查看)。
  3. Hook失败

    • 确认类名/方法名正确,注意重载方法使用.overload()指定参数类型。
  4. 虚拟机无法识别设备

    • 在虚拟机设置中启用USB 3.0支持,并将设备连接到虚拟机。

七、总结

本文覆盖了从安卓刷机、Root获取到Frida动态注入的完整流程,重点包括:

  1. 使用TWRP和LineageOS升级系统版本;
  2. 通过Magisk修补Boot镜像实现Root;
  3. Frida环境配置与基础Hook原理;
  4. 6类典型Frida使用场景(方法Hook、主动调用、字段修改等)。

通过实际案例演示如何解决逆向工程中常见的逻辑绕过、数据修改问题,为后续APP漏洞挖掘和动态分析奠定基础。

安卓逆向:从刷机到Frida的入门与实践 一、刷机准备 1.1 设备与工具要求 测试设备 :Nexus 6P(代号angler) 原系统版本 :Android 8.1.0(需升级至Android 10) 刷机工具 : TWRP Recovery( 下载地址 ) 自定义ROM:LineageOS 17.1(Android 10) XDA论坛获取 Magisk(用于Root权限管理) 环境配置 : Ubuntu 24.04(虚拟机推荐,避免驱动问题) Android Platform-Tools(ADB和Fastboot工具) 虚拟机工具: sudo apt-get install open-vm-tools-desktop (实现文件共享和复制粘贴) 1.2 文件准备 boot.img :从LineageOS刷机包中提取(后续Root需要) Magisk安装包 :APK文件用于安装和管理Root 共享文件夹配置 :在虚拟机中设置共享目录( /mnt/hgfs/共享文件夹名 ) 二、刷机流程 2.1 刷入TWRP Recovery 手机进入Fastboot模式: 关机后长按 电源键 + 音量下键 连接电脑,在终端执行: 2.2 安装Magisk获取Root 在TWRP界面点击“Install”,选择Magisk安装包(ZIP格式),滑动确认刷入。 重启系统后安装Magisk APK,修补Boot镜像: 打开Magisk → 安装 → 选择“修补文件” → 选择 boot.img 生成修补后的镜像(如 magisk_patched-24300_pmcKO.img ) 刷入修补后的Boot镜像: 2.3 刷入LineageOS 进入TWRP Recovery,执行 双清 (Wipe → Format Data / Cache) 点击“Install”选择LineageOS ZIP包,滑动刷入。 重启系统完成安装。 三、Frida环境配置 3.1 安装Frida工具链 3.2 部署Frida-Server 从 官方GitHub 下载与客户端版本匹配的 frida-server (选择Android ARM64版本)。 推送到设备并运行: 3.3 连接测试 四、Frida Hook基础框架 4.1 核心函数与结构 4.2 关键概念解析 Java.perform() :用于在Native层与Java环境之间建立桥梁,所有Java层操作必须包裹在此函数中。 setImmediate(main) :延迟执行函数,确保Frida完全注入后再执行Hook逻辑。 重载方法处理 :使用 .overload('参数类型') 指定具体重载方法(例如 .overload('int', 'int') )。 五、Frida实战场景 5.1 Hook普通方法(修改参数/返回值) 5.2 主动调用静态方法 5.3 修改静态字段值 5.4 主动调用非静态方法(实例不存在) 5.5 调用已存在实例的方法 5.6 复杂参数处理(参数为类对象) 六、常见问题与解决 ADB设备未授权 : 检查USB调试授权提示,或重启ADB服务: adb kill-server && adb start-server Frida版本不匹配 : 确保Client与Server版本完全一致( frida --version 查看)。 Hook失败 : 确认类名/方法名正确,注意重载方法使用 .overload() 指定参数类型。 虚拟机无法识别设备 : 在虚拟机设置中启用USB 3.0支持,并将设备连接到虚拟机。 七、总结 本文覆盖了从安卓刷机、Root获取到Frida动态注入的完整流程,重点包括: 使用TWRP和LineageOS升级系统版本; 通过Magisk修补Boot镜像实现Root; Frida环境配置与基础Hook原理; 6类典型Frida使用场景(方法Hook、主动调用、字段修改等)。 通过实际案例演示如何解决逆向工程中常见的逻辑绕过、数据修改问题,为后续APP漏洞挖掘和动态分析奠定基础。