Android APP 逆向分析入门:抓包、反编译与 Frida 的基本流程(面向安全测试)
Android APP 逆向分析入门:抓包、反编译与 Frida 的基本流程(面向安全测试)
Android逆向的基本流程可以概括为三步:先抓包看 APP 和服务器怎么通信,再用 jadx 反编译看代码结构,接着用 Frida 在运行时观察关键函数的参数和返回值。 这套方法的正当用途是对自家 APP 或已获书面授权的 APP 做安全测试,找出密钥外泄、接口缺少校验、本地存储不安全等问题。本文按“合规边界、环境准备、抓包、反编译、Frida、加固建议”的顺序讲解,所有示例都以自己开发的应用为对象,不涉及任何具体商业 APP。
一、合法边界:先看这一节再动手
逆向分析 APP 涉及著作权、用户协议和数据安全,边界必须讲清楚。
- 只分析自己开发的 APP,或持有书面授权的 APP。 授权文件里建议写明测试范围、时间和允许的手段。
- 不要分析他人 APP 来绕过付费、登录校验或广告,更不要制作和传播修改版。 这类行为可能违法或违约,具体以法律法规和合同约定为准。
- 测试过程中接触到的用户数据要保密。 使用测试账号和测试数据,不留存真实用户信息。
- 发现漏洞要走正规渠道。 自家产品就内部修复,第三方产品通过厂商的漏洞反馈渠道提交,不公开利用细节。
- 不要拿线上正式环境做破坏性测试。 优先用测试服务器和测试账号。
判断一个简单标准:如果你无法拿出“这个 APP 是我的或我获得了授权”的证明,就不要对它做逆向分析。
二、环境准备
设备与工具
| 项目 | 说明 |
|---|---|
| 测试设备 | 专用测试机或模拟器,不要用日常手机 |
| adb | Android 调试桥,用于安装应用、查看日志、推送文件 |
| 抓包工具 | Charles、mitmproxy、Burp Suite 等,选一个即可 |
| 反编译工具 | jadx(看 Java 代码)、apktool(看资源和 smali) |
| 动态插桩 | Frida(客户端装在电脑,服务端运行在设备) |
基础命令
adb devices # 确认设备已连接
adb install app-debug.apk # 安装测试包
adb shell pm list packages | grep myapp # 查找包名
adb logcat | grep -i myapp # 查看日志
建议用 debug 构建的测试包开始练习,因为它保留的信息更多,也更容易调试。
三、抓包:看 APP 和服务器怎么通信
基本步骤
- 电脑和手机连同一个局域网,在抓包工具里开启代理,记下电脑 IP 和端口。
- 手机的 Wi-Fi 设置里配置手动代理,指向电脑的 IP 和端口。
- 在手机浏览器访问抓包工具提示的地址,下载并安装抓包工具的 CA 证书。
- 打开你的 APP,操作功能,在抓包工具里查看请求和响应。
为什么装了证书还是抓不到 HTTPS
Android 7 及以上,默认情况下应用只信任系统证书,不信任用户安装的证书。对于自己开发的 APP,可以在 debug 构建里 通过网络安全配置放开:
<!-- res/xml/network_security_config.xml -->
<network-security-config>
<debug-overrides>
<trust-anchors>
<certificates src="user" />
</trust-anchors>
</debug-overrides>
</network-security-config>
然后在 AndroidManifest.xml 的 application 标签里引用:
android:networkSecurityConfig="@xml/network_security_config"
debug-overrides 只在可调试构建里生效,发布版本不会信任用户证书,这样既方便测试,又不影响线上安全。
遇到证书锁定怎么办
如果你的 APP 做了证书锁定(Certificate Pinning),测试时可以让 debug 构建关闭锁定,或者提供测试专用的证书配置。对自家 APP 来说,这是更干净的做法,不需要用 hook 去绕过。
抓包时重点观察什么
- 接口是否全程使用 HTTPS。
- 请求里是否带有明文密码、手机号等敏感信息。
- 鉴权信息(token)放在哪里,有效期多长。
- 同一个接口换一个用户的 ID 是否能越权访问,这是常见的越权漏洞。
- 响应里是否返回了多余字段,比如内部 ID、调试信息。
四、反编译:用 jadx 看代码结构
获取并打开 APK
自己的 APP 直接用构建出的 APK 即可。也可以通过 adb 从测试设备导出已安装的应用:
adb shell pm path com.example.myapp
adb pull /data/app/.../base.apk ./myapp.apk
jadx-gui myapp.apk
先看哪些内容
- AndroidManifest.xml:检查是否开启了
debuggable、allowBackup,哪些组件设置了exported,权限是否申请过多。 - 字符串资源和常量类:查找是否有硬编码的密钥、测试地址、内部接口域名。
- 网络层代码:搜索
OkHttp、Retrofit、Interceptor,了解请求是怎么组装的,签名参数在哪生成。 - 登录和存储逻辑:看 token、密码是否明文保存到 SharedPreferences 或本地文件。
- 加密工具类:确认用的算法、模式和密钥来源是否合理。
jadx 的局限
- 混淆过的代码会变成
a.b.c之类的无意义名称,需要结合调用关系推断含义。 - 部分方法反编译失败时会提示,可以改看 smali(用 apktool 解出)。
- native 层(
.so文件)不在 jadx 能还原的范围内,需要 Ghidra 等工具分析。
五、Frida入门:运行时观察函数行为
静态阅读代码能看到“代码写了什么”,Frida 能看到“程序运行时实际发生了什么”。
基本组成
- frida-server:运行在测试设备上的服务端。
- frida 客户端:安装在电脑上,通过 USB 连接设备。
- JS 脚本:描述你要观察哪个函数、怎么处理参数。
电脑端客户端版本和设备端 frida-server 版本需要保持一致,设备架构(arm64、x86 等)也要对应,具体下载和启动方式以 Frida 官方文档为准。
常用命令
frida-ps -U # 列出设备上的进程
frida -U -f com.example.myapp -l hook.js # 启动应用并加载脚本
不同版本的启动参数略有差异,以你所用版本的文档为准。
一个示意脚本:观察自家应用的签名方法
假设你自己的 APP 里有一个 SignUtil.makeSign 方法,想确认它收到了什么参数、返回了什么结果:
Java.perform(function () {
var SignUtil = Java.use('com.example.myapp.util.SignUtil');
SignUtil.makeSign.overload('java.lang.String', 'java.lang.String')
.implementation = function (data, key) {
var ret = this.makeSign(data, key);
console.log('[makeSign] data=' + data + ' key=' + key + ' ret=' + ret);
return ret;
};
});
这个脚本做了三件事:找到目标类、替换方法的实现、在调用原方法的前后打印日志。包名和类名都是示意,需换成你自己应用里的真实名称。
在安全测试中的典型用途
- 确认加密函数的输入输出,检查密钥是不是写死在代码里。
- 验证敏感数据在内存中的处理方式。
- 检查关键校验(如登录、支付)是否只依赖客户端。
- 评估自家的 root 检测、反调试、签名校验是否真的生效。
六、把发现转化为整改
测试的价值在于修复。常见发现和对应措施如下:
| 发现 | 风险 | 整改建议 |
|---|---|---|
| 密钥硬编码在代码里 | 反编译后可直接获取 | 关键密钥放服务端,客户端只拿短期凭证 |
| 接口只靠客户端校验 | 抓包后可构造请求绕过 | 校验和鉴权放到服务端 |
| 缺少越权校验 | 修改参数即可访问他人数据 | 服务端按登录身份校验资源归属 |
| 发布包可调试、可备份 | 数据容易被导出 | 关闭 debuggable 和 allowBackup |
| 组件被导出 | 被其他应用调用 | 不需要对外的组件设置 exported=false |
| 日志输出敏感信息 | 被读取日志的应用获取 | 发布版本关闭详细日志 |
| 代码未混淆 | 逻辑容易被阅读 | 启用 R8/ProGuard 混淆,必要时考虑加固方案 |
需要强调:混淆和加固只能提高分析门槛,不能替代服务端安全。真正敏感的逻辑,一定要放在服务端。
七、Android逆向测试流程小结
- 明确授权范围和测试目标,准备测试账号。
- 搭建隔离的测试环境,使用 debug 构建包。
- 抓包梳理接口,检查传输安全和鉴权。
- 反编译查看结构,排查硬编码和不安全存储。
- 用 Frida 验证关键逻辑的运行时行为。
- 整理报告,给出可复现的步骤和整改建议。
- 修复后复测,确认问题关闭。
如果你的团队没有专门的安全人员,也可以把 APP 的安全加固和测试需求交给有经验的开发团队,参考我们的 软件开发服务,把应用类型、使用场景和合规要求说明清楚,再评估方案。
常见问题
学 Android逆向需要 root 手机吗? 抓包和 jadx 反编译不需要。运行 frida-server 通常需要 root 或使用模拟器,建议用专门的测试机,不要用日常手机。
抓不到 HTTPS 流量是什么原因? 常见原因有三类:没有安装抓包工具的证书、应用不信任用户证书、应用做了证书锁定。自家 APP 可以在 debug 构建里调整配置,不需要绕过。
Frida 能分析别人的 APP 吗? 技术上能,但未经授权对他人 APP 做逆向分析,可能违法或违约。请仅用于自己的应用或已获授权的测试。
混淆之后就安全了吗? 不是。混淆只增加阅读难度,关键的鉴权、校验和敏感数据处理必须放在服务端。
发现漏洞后应该怎么处理? 自家产品先评估影响范围,尽快修复并发布新版本;第三方产品通过官方渠道私下提交,不公开利用方法。
如果你想系统开展 Android逆向 与 APP逆向分析,或做安全加固,欢迎联系广州万户网络,电话 13535321113。我们会先确认应用类型和授权情况,再给出合规的测试与加固方案,实际费用以需求评估后的报价为准。
需要网站建设、软件开发或爬虫定制?
模板建站1280元起,价格公开不加价。电话/微信 13535321113
