安卓逆向-从刷机到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 文件准备
- boot.img:从LineageOS刷机包中提取(后续Root需要)
- Magisk安装包:APK文件用于安装和管理Root
- 共享文件夹配置:在虚拟机中设置共享目录(
/mnt/hgfs/共享文件夹名)
二、刷机流程
2.1 刷入TWRP Recovery
- 手机进入Fastboot模式:
- 关机后长按 电源键 + 音量下键
- 连接电脑,在终端执行:
fastboot flash recovery twrp.img # 刷入TWRP fastboot reboot recovery # 重启至Recovery模式
2.2 安装Magisk获取Root
- 在TWRP界面点击“Install”,选择Magisk安装包(ZIP格式),滑动确认刷入。
- 重启系统后安装Magisk APK,修补Boot镜像:
- 打开Magisk → 安装 → 选择“修补文件” → 选择
boot.img - 生成修补后的镜像(如
magisk_patched-24300_pmcKO.img)
- 打开Magisk → 安装 → 选择“修补文件” → 选择
- 刷入修补后的Boot镜像:
adb reboot bootloader # 进入Fastboot模式 fastboot flash boot magisk_patched.img fastboot reboot
2.3 刷入LineageOS
- 进入TWRP Recovery,执行双清(Wipe → Format Data / Cache)
- 点击“Install”选择LineageOS ZIP包,滑动刷入。
- 重启系统完成安装。
三、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
- 从官方GitHub下载与客户端版本匹配的
frida-server(选择Android ARM64版本)。 - 推送到设备并运行:
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); // 传入类实例作为参数
});
六、常见问题与解决
-
ADB设备未授权:
- 检查USB调试授权提示,或重启ADB服务:
adb kill-server && adb start-server
- 检查USB调试授权提示,或重启ADB服务:
-
Frida版本不匹配:
- 确保Client与Server版本完全一致(
frida --version查看)。
- 确保Client与Server版本完全一致(
-
Hook失败:
- 确认类名/方法名正确,注意重载方法使用
.overload()指定参数类型。
- 确认类名/方法名正确,注意重载方法使用
-
虚拟机无法识别设备:
- 在虚拟机设置中启用USB 3.0支持,并将设备连接到虚拟机。
七、总结
本文覆盖了从安卓刷机、Root获取到Frida动态注入的完整流程,重点包括:
- 使用TWRP和LineageOS升级系统版本;
- 通过Magisk修补Boot镜像实现Root;
- Frida环境配置与基础Hook原理;
- 6类典型Frida使用场景(方法Hook、主动调用、字段修改等)。
通过实际案例演示如何解决逆向工程中常见的逻辑绕过、数据修改问题,为后续APP漏洞挖掘和动态分析奠定基础。