抓包对抗与实战分析
字数 1978 2025-08-06 08:35:00

抓包对抗与实战分析

1. VPN验证绕过技术

1.1 VPN检测原理

当前主流App采用以下方式检测VPN使用:

  1. NetworkInterface检测
    • 通过java.net.NetworkInterface.getName()检测网络设备名称
    • 开启VPN时会显示tun0ppp0网卡
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
while (networkInterfaces.hasMoreElements()) {
    NetworkInterface next = networkInterfaces.nextElement();
    logOutPut("getName获得网络设备名称=" + next.getName());
    // 其他检测项...
}
  1. NetworkCapabilities检测
    • NetworkCapabilities.hasTransport()方法会返回VPN状态
    • NetworkCapabilities.appendStringRepresentationOfBitMaskToStringBuilder会包含VPN信息

1.2 VPN检测绕过方案

方案1:Hook NetworkInterface.getName()

function hook_vpn(){
   Java.perform(function() {
       var NetworkInterface = Java.use("java.net.NetworkInterface");
       NetworkInterface.getName.implementation = function() {
           var name = this.getName();
           console.log("name: " + name);
           if(name == "tun0" || name == "ppp0"){
               return "rmnet_data0"; // 伪装成普通网络接口
           }else {
               return name;
           }
       }
   })
}

方案2:Hook NetworkCapabilities.hasTransport()

var NetworkCapabilities = Java.use("android.net.NetworkCapabilities");
NetworkCapabilities.hasTransport.implementation = function () {
    return false; // 强制返回false
}

方案3:Hook NetworkCapabilities.appendStringRepresentationOfBitMaskToStringBuilder

NetworkCapabilities.appendStringRepresentationOfBitMaskToStringBuilder.implementation = function (sb, bitMask, nameFetcher, separator) {
    if (bitMask == 18) {
        console.log("bitMask", bitMask);
        sb.append("WIFI"); // 伪装成WIFI连接
    }else {
        console.log(sb, bitMask);
        this.appendStringRepresentationOfBitMaskToStringBuilder(sb, bitMask, nameFetcher, separator);
    }
}

2. HTTPS抓包原理

2.1 HTTP与HTTPS对比

特性 HTTP HTTPS
加密 明文传输 加密传输
安全性 不安全 安全
协议组成 单独协议 HTTP + SSL/TLS
认证方式 无认证 单向/双向认证

2.2 抓包工具工作原理

HTTP抓包流程:

  1. 客户端连接抓包工具代理
  2. 抓包工具拦截并显示请求原文
  3. 抓包工具转发请求到服务器
  4. 服务器返回结果给抓包工具
  5. 抓包工具显示并转发结果给客户端

HTTPS抓包流程(中间人攻击):

  1. 客户端连接抓包工具代理
  2. 客户端安装抓包工具根证书
  3. 抓包工具模拟服务器与客户端TLS握手
  4. 抓包工具与真实服务器建立TLS连接
  5. 双向解密/加密传输数据

3. 服务端校验客户端绕过

3.1 检测场景

当服务器返回"400 No required SSL certificate was sent"错误时,表明服务器在验证客户端证书。

3.2 客户端证书提取技术

Hook KeyStore.load()方法:

function hook_KeyStore_load() {
    Java.perform(function () {
        var ByteString = Java.use("com.android.okhttp.okio.ByteString");
        var buffer = Java.array('byte', new Array(1024).fill(0x0));

        var KeyStore = Java.use("java.security.KeyStore");
        KeyStore.load.overload('java.io.InputStream', '[C').implementation = function (arg0, arg1) {
            if (arg0) {
                var file = Java.use("java.io.File").$new("/sdcard/Download/" + String(arg0) + ".p12");
                var out = Java.use("java.io.FileOutputStream").$new(file);
                var r;
                while ((r = arg0.read(buffer)) > 0) {
                    out.write(buffer, 0, r) // 导出证书文件
                }
                out.close()
            }
            return this.load(arg0, arg1);
        };
    });
}

证书使用:

  1. 使用KeyStore Explorer工具打开导出的证书
  2. 在Charles中添加客户端证书:Proxy → SSL Proxying Settings

4. 客户端校验服务端绕过(SSL Pinning)

4.1 常见绕过方案

方案 工具/方法 适用场景
1 Xposed + JustTrustMe 未混淆代码
2 Frida + ObjectionUnpinningPlus 未混淆代码
3 objection命令 基础防护
4 Hook File类构造方法 混淆代码

4.2 具体实施方法

方案3:使用objection命令

objection -g 包名 explore -s "android sslpinning disable"

方案4:Hook File类构造方法

objection -g 包名 explore -s "android hooking watch class_method java.io.File.$init --dump-args --dump-backtrace --dump-return"

4.3 针对OKHttp3混淆的解决方案

  1. Hook MessageDigest.digest

    • OKHttp3计算证书pin时会使用hash算法
  2. Hook SSL错误

    • javax.net.ssl.SSLHandshakeException.$init
  3. Hook ArrayList.add

    • OKHttp3会将pin加入到ArrayList中

5. 总结与综合方案

  1. VPN检测绕过

    • 优先尝试Hook NetworkInterface相关方法
    • 结合NetworkCapabilities相关Hook
  2. 证书处理

    • 服务端验证时导出客户端证书
    • 客户端验证时禁用SSL Pinning
  3. 混淆代码处理

    • 从Java基础类入手(File、ArrayList等)
    • 结合调用栈分析定位关键方法
  4. 工具组合

    • Frida + Objection组合使用
    • 结合Xposed框架增强Hook能力
  5. 进阶技巧

    • 动态分析网络请求流程
    • 逆向分析自定义验证逻辑
    • 多维度验证点综合绕过
抓包对抗与实战分析 1. VPN验证绕过技术 1.1 VPN检测原理 当前主流App采用以下方式检测VPN使用: NetworkInterface检测 : 通过 java.net.NetworkInterface.getName() 检测网络设备名称 开启VPN时会显示 tun0 或 ppp0 网卡 NetworkCapabilities检测 : NetworkCapabilities.hasTransport() 方法会返回VPN状态 NetworkCapabilities.appendStringRepresentationOfBitMaskToStringBuilder 会包含VPN信息 1.2 VPN检测绕过方案 方案1:Hook NetworkInterface.getName() 方案2:Hook NetworkCapabilities.hasTransport() 方案3:Hook NetworkCapabilities.appendStringRepresentationOfBitMaskToStringBuilder 2. HTTPS抓包原理 2.1 HTTP与HTTPS对比 | 特性 | HTTP | HTTPS | |------------|-----------------------|---------------------------| | 加密 | 明文传输 | 加密传输 | | 安全性 | 不安全 | 安全 | | 协议组成 | 单独协议 | HTTP + SSL/TLS | | 认证方式 | 无认证 | 单向/双向认证 | 2.2 抓包工具工作原理 HTTP抓包流程: 客户端连接抓包工具代理 抓包工具拦截并显示请求原文 抓包工具转发请求到服务器 服务器返回结果给抓包工具 抓包工具显示并转发结果给客户端 HTTPS抓包流程(中间人攻击): 客户端连接抓包工具代理 客户端安装抓包工具根证书 抓包工具模拟服务器与客户端TLS握手 抓包工具与真实服务器建立TLS连接 双向解密/加密传输数据 3. 服务端校验客户端绕过 3.1 检测场景 当服务器返回"400 No required SSL certificate was sent"错误时,表明服务器在验证客户端证书。 3.2 客户端证书提取技术 Hook KeyStore.load()方法: 证书使用: 使用KeyStore Explorer工具打开导出的证书 在Charles中添加客户端证书:Proxy → SSL Proxying Settings 4. 客户端校验服务端绕过(SSL Pinning) 4.1 常见绕过方案 | 方案 | 工具/方法 | 适用场景 | |------|-----------|----------| | 1 | Xposed + JustTrustMe | 未混淆代码 | | 2 | Frida + ObjectionUnpinningPlus | 未混淆代码 | | 3 | objection命令 | 基础防护 | | 4 | Hook File类构造方法 | 混淆代码 | 4.2 具体实施方法 方案3:使用objection命令 方案4:Hook File类构造方法 4.3 针对OKHttp3混淆的解决方案 Hook MessageDigest.digest : OKHttp3计算证书pin时会使用hash算法 Hook SSL错误 : 如 javax.net.ssl.SSLHandshakeException.$init Hook ArrayList.add : OKHttp3会将pin加入到ArrayList中 5. 总结与综合方案 VPN检测绕过 : 优先尝试Hook NetworkInterface相关方法 结合NetworkCapabilities相关Hook 证书处理 : 服务端验证时导出客户端证书 客户端验证时禁用SSL Pinning 混淆代码处理 : 从Java基础类入手(File、ArrayList等) 结合调用栈分析定位关键方法 工具组合 : Frida + Objection组合使用 结合Xposed框架增强Hook能力 进阶技巧 : 动态分析网络请求流程 逆向分析自定义验证逻辑 多维度验证点综合绕过