抓包对抗与实战分析
字数 1978 2025-08-06 08:35:00
抓包对抗与实战分析
1. VPN验证绕过技术
1.1 VPN检测原理
当前主流App采用以下方式检测VPN使用:
- NetworkInterface检测:
- 通过
java.net.NetworkInterface.getName()检测网络设备名称 - 开启VPN时会显示
tun0或ppp0网卡
- 通过
Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
while (networkInterfaces.hasMoreElements()) {
NetworkInterface next = networkInterfaces.nextElement();
logOutPut("getName获得网络设备名称=" + next.getName());
// 其他检测项...
}
- 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抓包流程:
- 客户端连接抓包工具代理
- 抓包工具拦截并显示请求原文
- 抓包工具转发请求到服务器
- 服务器返回结果给抓包工具
- 抓包工具显示并转发结果给客户端
HTTPS抓包流程(中间人攻击):
- 客户端连接抓包工具代理
- 客户端安装抓包工具根证书
- 抓包工具模拟服务器与客户端TLS握手
- 抓包工具与真实服务器建立TLS连接
- 双向解密/加密传输数据
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);
};
});
}
证书使用:
- 使用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命令
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混淆的解决方案
-
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能力
-
进阶技巧:
- 动态分析网络请求流程
- 逆向分析自定义验证逻辑
- 多维度验证点综合绕过