5、动态分析工具入门:Frida环境搭建、Objection使用、Xposed框架基础
动态分析,说白了就是让App真正跑起来,我们在旁边盯着它的一举一动。静态分析能看到代码结构,但很多逻辑——比如网络请求、加密解密、运行时校验——只有运行起来才能抓到。今天我要带你入门三个最常用的动态分析工具:Frida、Objection和Xposed。
我个人习惯把动态分析比作「手术」。Frida是那把最锋利的手术刀,Objection是带导航的手术机器人,而Xposed则是给系统打补丁的改造手术。各有各的用处,我们一个一个来看。
5.1 Frida环境搭建
Frida是目前最流行的动态插桩框架。它支持Windows、macOS、Linux,还能跨平台调试Android和iOS。我当年第一次用Frida时,被它的「注入即用」特性惊艳到了——不需要重启应用,不需要修改APK,直接就能Hook函数。
5.1.1 安装Frida工具链
Frida分为两部分:电脑端工具和手机端服务。电脑端用pip安装:
pip install frida-tools
安装完成后,验证一下:
frida --version
# 输出类似 16.0.1
嗯,这里要注意版本号。Frida的版本必须和手机端的frida-server版本一致,否则连不上。我曾经因为版本不匹配,折腾了整整一个下午才发现问题。
5.1.2 连接Android设备
手机端需要先root,然后推送frida-server。步骤如下:
- 从GitHub下载对应架构的frida-server(arm64或arm)
- 解压后推送到手机:
adb push frida-server-16.0.1-android-arm64 /data/local/tmp/
adb shell chmod 755 /data/local/tmp/frida-server-16.0.1-android-arm64
- 启动frida-server:
adb shell
su
/data/local/tmp/frida-server-16.0.1-android-arm64 &
启动后,电脑端用frida-ps -U命令检查连接:
frida-ps -U
# 如果看到进程列表,说明连接成功
5.2 Frida基础使用
连接成功后,就可以写Hook脚本了。Frida使用JavaScript编写Hook逻辑。来看一个最简单的例子——Hook一个Java方法:
// hook.js
Java.perform(function() {
var MainActivity = Java.use('com.example.app.MainActivity');
MainActivity.secretMethod.implementation = function() {
console.log('secretMethod被调用了!');
return this.secretMethod();
};
});
运行脚本:
frida -U -l hook.js com.example.app
你想想看,这有多方便?不需要反编译,不需要改代码,直接就能拦截方法调用。我在分析一个金融App时,就是用这种方式抓到了它的加密密钥——它把密钥放在一个native方法里,但Frida直接Hook了Java层的调用,密钥就原形毕露了。
5.2.1 常用Frida API
| API | 用途 | 示例 |
|---|---|---|
| Java.use() | 获取Java类 | Java.use('java.lang.String') |
| Java.perform() | 在Java线程中执行 | Java.perform(function(){...}) |
| Interceptor.attach() | Hook native函数 | Interceptor.attach(targetAddr, {...}) |
| setTimeout() | 延迟执行 | setTimeout(function(){...}, 1000) |
5.3 Objection使用
Objection是Frida的「豪华版」——它把常用的Hook操作封装成了命令行工具。说白了,你不需要写JavaScript脚本,直接敲命令就能完成很多操作。
安装Objection:
pip install objection
启动Objection并附加到App:
objection -g com.example.app explore
进入交互模式后,你可以:
android hooking list classes—— 列出所有类android hooking list class_methods com.example.app.MainActivity—— 列出类的方法android hooking watch class_method com.example.app.MainActivity.secretMethod—— 监控方法调用android sslpinning disable—— 关闭SSL证书校验
我最常用的是sslpinning disable。很多App会做证书校验,抓包工具抓不到HTTPS流量。Objection一行命令就能绕过,省去了手动Hook的麻烦。
5.4 Xposed框架基础
Xposed和Frida的思路不太一样。Frida是运行时注入,Xposed是修改系统框架——它替换了Android的Zygote进程,在App启动前就加载了你的模块。
Xposed的优势是持久化。你写一个模块,安装后重启手机,Hook就永久生效了。Frida每次都要重新注入,适合调试阶段。Xposed适合做长期使用的功能,比如去广告、改机型、自动抢红包。
5.4.1 Xposed模块开发
一个最简单的Xposed模块:
public class MainHook implements IXposedHookLoadPackage {
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) {
if (!lpparam.packageName.equals("com.example.app"))
return;
findAndHookMethod("com.example.app.MainActivity",
lpparam.classLoader,
"secretMethod",
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) {
XposedBridge.log("secretMethod被调用了!");
}
});
}
}
开发Xposed模块需要:
- 创建一个Android项目
- 引入Xposed Framework API
- 在AndroidManifest.xml中声明xposed模块
- 编译安装,在Xposed Installer中启用模块
5.5 知识体系总览
下面这张图帮你理清三个工具的关系和适用场景:
5.6 避坑指南
最后分享几个我踩过的坑:
- Frida版本不匹配:电脑端和手机端的frida-server版本必须完全一致。我曾经用16.0.1的电脑端连16.0.0的手机端,报错信息很隐晦,查了半天才发现。
- Objection卡死:如果Objection附加后没反应,试试用--gadget参数,或者先启动frida-server再运行Objection。
- Xposed模块不生效:检查Xposed Installer里是否启用了模块,以及模块的API版本是否匹配。Android 8.0以上建议用EdXposed。
- SSL绕过失败:有些App用了双向证书校验,Objection的sslpinning disable可能不够。这时候需要结合Frida手动Hook证书验证逻辑。
嗯,动态分析工具就讲到这里。这三个工具各有千秋,Frida灵活、Objection方便、Xposed持久。我建议你先从Frida入手,把基础打牢,再慢慢接触其他工具。动手试试吧,光看是学不会的。