APP测试保姆级教程
字数 2165 2025-08-23 18:31:18
APP渗透测试保姆级教程
0x1 APP相关基础
APK文件结构
APK是一个zip压缩包,主要包含以下结构:
- assets:存放静态资源文件(图片、证书等),H5套壳APP的前端代码通常也在这里
- kotlin:APP依赖包,无需分析
- lib:存放.so动态加载库文件(类似Windows的dll)
- META-INF:无需关注
- okhttp3:依赖包,无需分析
- res:前端图形组件库,有时证书会放在res/raw目录下
- AndroidManifest.xml:包含APP权限、包名和主函数信息
- classes[n].dex:Java二进制文件,可反编译为Java代码进行分析
- resources.arsc:通常无需关注
APP基础信息
- 包名:APP的唯一标识名称
- 加固状态:可使用MT管理器查看
- 数据目录1:APP主要数据存储位置(常用)
- 数据目录2:辅助信息存储位置(较少使用)
- APK路径:APP安装包及so文件的存放位置
0x2 APP分析阶段
0x2.1 H5套壳APP
识别特征:
- assets目录下有www目录
- 包含html、js、css等前端文件
分析方法:
- 使用WebViewPP插件动态调试js
- 或提取js文件到电脑,用VSCode静态分析
- 拼接API接口参数进行测试
0x2.2 脱壳
步骤:
- 使用MT管理器查壳
- 无壳情况:直接用Jadx反编译
- 有壳情况:
- 非最新企业壳(如360付费壳、梆梆梆梆企业壳、娜迦):使用Fundex脱壳
- 最新企业壳:可能需要其他方法
Fundex使用方法:
- LSPosed中安装Fundex
- 搜索目标APP并勾选
- 打开Fundex,点击目标APP
- 打开目标APP
- 在数据目录1中查找脱出的classes[n].dex文件
- 排除与原始classes.dex大小相同的文件
- 将剩余dex文件发送到电脑反编译
注意事项:
- 如遇闪退,更新Magisk和LSPosed到最新版
- 反编译失败时,使用MT管理器的dex修复功能(需会员)
0x2.3 抓包
0x2.3.1 正常抓包
准备工作:
- 安装证书(Burp/Charles/Yakit等)
- 面具刷入Move Certificates模块
- 在系统设置中安装CA证书并重启
代理方式:
- WIFI代理:直接在WIFI设置中配置
- VPN代理:使用ProxyDroid
- 如WIFI代理失败,尝试VPN代理
- 仍失败可尝试Yakit代理流量给Burp(可勾选国密劫持)
- 或使用Charles代理给Burp
- Socks5代理:通过ProxyDroid、Charles或Yakit设置
0x2.3.2 SSL单向校验
识别:抓包时无法获取数据
解决方法:
- 使用TrustMeAlready插件(LSPosed中安装)
- 或使用SSLUnpinning插件
- 上述无效时可尝试frida的sslunpinning脚本
0x2.3.3 双向校验
识别:
- 返回400状态码
- 请求包中包含"No required SSL certificate was sent"
解决方法:
- 分析APP获取服务器证书的方式
- 可能需要逆向证书处理逻辑
0x2.3.4 不走HTTP走Socket
解决方法:
- 使用Frida RPC进行Hook
- 参考文章:https://www.adminxe.com/4367.html
0x3 加解密分析
分析流程
- 识别密文(base64/hex编码的字符串)
- 分析加密过程:
- H5套壳APP:分析js加密流程
- 原生APP:使用Jadx分析反编译的Java代码
分析方法
- 全局搜索"encrypt"关键字
- 搜索抓包中的URL字段,分析周围代码
- 搜索特征字符串(如"encStr=xxxxxxx")
常见加密算法
- 对称加密:AES、SM4、DES、RC4、Rabbit
- 非对称加密:RSA、SM2
- Hash加密:MD5、SM3、SHA256等
防篡改处理
分析防篡改字段的生成方式并模拟
Jadx使用技巧
- 按X键查看函数调用关系
- 右键函数可生成Frida代码
- 查看形参和实参的关系
0x4 Frida讲解
环境配置
- 服务端:
- 放在手机/data/local/tmp/目录
- 需要root权限执行
- 推荐使用hluda(去特征版本)
- 客户端:
pip install frida pip install frida-tools
基本代码结构
Java.perform(function(){
console.log("frida注入成功");
let Response = Java.use("com.xxx.EncryptAESJsonHandler");
Response["encryptJSon"].implementation = function() {
console.log(`Response.body is called`);
let result = this["encryptJSon"]();
console.log(`Response.body result=${result}`);
return result;
};
})
代码说明
Java.perform()是必须的入口函数Java.use()获取目标类.implementation重载目标方法- 注意保留原始方法的调用和返回
使用方法
- USB连接手机和电脑
- 启动服务端:
adb shell su /data/local/tmp/hluda - 运行客户端:
参数说明:frida -U -f com.xxx.xxxx -l xxx.js-U:USB连接-f:指定包名-l:指定脚本文件
应用场景
- 获取函数执行时的形参和结果
- 快速获取加解密的key等信息
- 绕过各种安全检测
工具总结
- 查壳/脱壳:MT管理器、Fundex
- 抓包:Burp、Charles、Yakit、ProxyDroid
- 反编译:Jadx
- 动态分析:Frida、hluda
- 插件:TrustMeAlready、SSLUnpinning
注意事项
- 保持工具最新版本
- 遇到问题时尝试多种方法组合
- 复杂的APP可能需要综合运用静态和动态分析技术