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等前端文件

分析方法

  1. 使用WebViewPP插件动态调试js
  2. 或提取js文件到电脑,用VSCode静态分析
  3. 拼接API接口参数进行测试

0x2.2 脱壳

步骤

  1. 使用MT管理器查壳
  2. 无壳情况:直接用Jadx反编译
  3. 有壳情况:
    • 非最新企业壳(如360付费壳、梆梆梆梆企业壳、娜迦):使用Fundex脱壳
    • 最新企业壳:可能需要其他方法

Fundex使用方法

  1. LSPosed中安装Fundex
  2. 搜索目标APP并勾选
  3. 打开Fundex,点击目标APP
  4. 打开目标APP
  5. 在数据目录1中查找脱出的classes[n].dex文件
    • 排除与原始classes.dex大小相同的文件
    • 将剩余dex文件发送到电脑反编译

注意事项

  • 如遇闪退,更新Magisk和LSPosed到最新版
  • 反编译失败时,使用MT管理器的dex修复功能(需会员)

0x2.3 抓包

0x2.3.1 正常抓包

准备工作

  1. 安装证书(Burp/Charles/Yakit等)
  2. 面具刷入Move Certificates模块
  3. 在系统设置中安装CA证书并重启

代理方式

  1. WIFI代理:直接在WIFI设置中配置
  2. VPN代理:使用ProxyDroid
    • 如WIFI代理失败,尝试VPN代理
    • 仍失败可尝试Yakit代理流量给Burp(可勾选国密劫持)
    • 或使用Charles代理给Burp
  3. Socks5代理:通过ProxyDroid、Charles或Yakit设置

0x2.3.2 SSL单向校验

识别:抓包时无法获取数据

解决方法

  1. 使用TrustMeAlready插件(LSPosed中安装)
  2. 或使用SSLUnpinning插件
  3. 上述无效时可尝试frida的sslunpinning脚本

0x2.3.3 双向校验

识别

  • 返回400状态码
  • 请求包中包含"No required SSL certificate was sent"

解决方法

  1. 分析APP获取服务器证书的方式
  2. 可能需要逆向证书处理逻辑

0x2.3.4 不走HTTP走Socket

解决方法

  1. 使用Frida RPC进行Hook
  2. 参考文章:https://www.adminxe.com/4367.html

0x3 加解密分析

分析流程

  1. 识别密文(base64/hex编码的字符串)
  2. 分析加密过程:
    • H5套壳APP:分析js加密流程
    • 原生APP:使用Jadx分析反编译的Java代码

分析方法

  1. 全局搜索"encrypt"关键字
  2. 搜索抓包中的URL字段,分析周围代码
  3. 搜索特征字符串(如"encStr=xxxxxxx")

常见加密算法

  • 对称加密:AES、SM4、DES、RC4、Rabbit
  • 非对称加密:RSA、SM2
  • Hash加密:MD5、SM3、SHA256等

防篡改处理

分析防篡改字段的生成方式并模拟

Jadx使用技巧

  1. 按X键查看函数调用关系
  2. 右键函数可生成Frida代码
  3. 查看形参和实参的关系

0x4 Frida讲解

环境配置

  1. 服务端
    • 放在手机/data/local/tmp/目录
    • 需要root权限执行
    • 推荐使用hluda(去特征版本)
  2. 客户端
    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;
    };
})

代码说明

  1. Java.perform()是必须的入口函数
  2. Java.use()获取目标类
  3. .implementation重载目标方法
  4. 注意保留原始方法的调用和返回

使用方法

  1. USB连接手机和电脑
  2. 启动服务端:
    adb shell
    su
    /data/local/tmp/hluda
    
  3. 运行客户端:
    frida -U -f com.xxx.xxxx -l xxx.js
    
    参数说明:
    • -U:USB连接
    • -f:指定包名
    • -l:指定脚本文件

应用场景

  1. 获取函数执行时的形参和结果
  2. 快速获取加解密的key等信息
  3. 绕过各种安全检测

工具总结

  1. 查壳/脱壳:MT管理器、Fundex
  2. 抓包:Burp、Charles、Yakit、ProxyDroid
  3. 反编译:Jadx
  4. 动态分析:Frida、hluda
  5. 插件:TrustMeAlready、SSLUnpinning

注意事项

  1. 保持工具最新版本
  2. 遇到问题时尝试多种方法组合
  3. 复杂的APP可能需要综合运用静态和动态分析技术
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(去特征版本) 客户端 : 基本代码结构 代码说明 Java.perform() 是必须的入口函数 Java.use() 获取目标类 .implementation 重载目标方法 注意保留原始方法的调用和返回 使用方法 USB连接手机和电脑 启动服务端: 运行客户端: 参数说明: -U :USB连接 -f :指定包名 -l :指定脚本文件 应用场景 获取函数执行时的形参和结果 快速获取加解密的key等信息 绕过各种安全检测 工具总结 查壳/脱壳 :MT管理器、Fundex 抓包 :Burp、Charles、Yakit、ProxyDroid 反编译 :Jadx 动态分析 :Frida、hluda 插件 :TrustMeAlready、SSLUnpinning 注意事项 保持工具最新版本 遇到问题时尝试多种方法组合 复杂的APP可能需要综合运用静态和动态分析技术