在Android应用中绕过SSL证书检测(如SSL Pinning)通常涉及Hook关键证书验证方法。
以下是针对Android15使用Frida的详细步骤:
一、准备工作
1. 环境要求
- Root设备或模拟器(推荐Android Studio的 Pixel系列模拟器或真机)
- 安装frida-server(需选择与Android 15架构匹配的版本)
- 本地环境安装frida-tools:
pip install frida-tools
2. 启动frida-server
adb push frida-server /data/local/tmp/
adb shell "chmod 755 /data/local/tmp/frida-server"
adb shell "/data/local/tmp/frida-server &"
二、Hook SSL 验证逻辑
方法1:Hook X509TrustManager
大多数HTTPS库最终会调用X509TrustManager的方法进行证书校验。
Java.perform(function () {
var X509TrustManager = Java.use('javax.net.ssl.X509TrustManager');
var TrustManagerImpl = Java.use('com.android.org.conscrypt.TrustManagerImpl');
// Hook 系统 TrustManager 的 checkServerTrusted 方法
X509TrustManager.checkServerTrusted.implementation = function (chain, authType, hostname) {
console.log("[+] Bypassing checkServerTrusted for host: " + hostname);
return; // 直接跳过证书检查
};
// 针对 Conscrypt 实现(如某些原生 Android 应用)
TrustManagerImpl.verifyChain.implementation = function (untrustedChain, trustAnchorChain, host, clientAuth, ocspData, tlsSctData) {
console.log("[+] Bypassing verifyChain for host: " + host);
return untrustedChain; // 直接返回未验证的证书链
};
});
方法2:Hook OkHttp的CertificatePinner
如果目标应用使用OkHttp
Java.perform(function () {
var CertificatePinner = Java.use('okhttp3.CertificatePinner');
CertificatePinner.check.overload('java.lang.String', 'java.util.List').implementation = function (hostname, pins) {
console.log("[+] Bypassing OkHttp CertificatePinner for: " + hostname);
return; // 不执行任何检查
};
});
方法3:Hook TrustManagerFactory
覆盖TrustManager的创建过程
Java.perform(function () {
var TrustManagerFactory = Java.use('javax.net.ssl.TrustManagerFactory');
TrustManagerFactory.getTrustManagers.implementation = function () {
var originalTrustManagers = this.getTrustManagers();
console.log("[+] Replacing TrustManagers with custom implementation");
// 创建一个空的 TrustManager 数组
return [Java.registerClass({
name: 'com.example.FakeX509TrustManager',
implements: [X509TrustManager],
methods: {
checkClientTrusted: function (chain, authType) {},
checkServerTrusted: function (chain, authType) {},
getAcceptedIssuers: function () { return []; }
}
}).$new()];
};
});
三、执行Hook脚本
保存脚本为bypass_ssl.js,然后运行:
frida -U -f com.target.app --no-pause -l bypass_ssl.js
四、处理Android 15的潜在问题
1. SELinux限制
- 如果遇到权限问题,临时禁用SELinux:
adb shell setenforce 0
2. Frida版本兼容性
- 使用最新的Frida版本(建议>=16.1.11),支持 Android 15的API变更。
3. 系统证书存储
- 如果应用验证系统证书,需将 Burp/Fiddler 证书安装到系统存储:
adb push burp.cer /system/etc/security/cacerts/
adb shell chmod 644 /system/etc/security/cacerts/burp.cer
五、验证绕过是否成功
1. 使用工具(如Charles或Wireshark)捕获应用的HTTPS流量。
2. 检查是否存在SSLHandshakeException或类似错误。
六、替代方案(如果Frida失效)
1. 使用objection
objection -g com.target.app explore --startup-command "android sslpinning disable"
2. 修改APK的Smali代码
- 定位checkServerTrusted方法并修改为 return-void。
注意事项
- 仅限合法授权测试,禁止非法使用。
- 部分应用可能使用原生代码(如OpenSSL的
SSL_CTX_set_cert_verify_callback),需结合Frida的Native Hook。
网络安全研究资料(领取地址)
https://pan.quark.cn/s/94e874aa45c2#/list/share
关注"哆啦安全"官方视频号
为什么你的逆向分析总失败?90%的人忽略的IDA Pro脚本技巧
原文始发于微信公众号(哆啦安全):Android15通过Frida Hook绕过SSL证书检测方法
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论