Frida 学习指南 TikTok SSL Pinning 绕过实践

📅 2026/7/8 14:25:02
Frida 学习指南  TikTok SSL Pinning 绕过实践
目录Frida 是什么Frida 学习教程资源SSL Pinning 原理环境搭建TikTok SSL 绕过的三种方案开源项目汇总配合 Charles 抓包常见问题与排错法律与伦理须知1. Frida 是什么Frida 是一个开源的动态代码插桩Dynamic Instrumentation工具包能将 JavaScript 代码注入到 Windows、macOS、Linux、Android、iOS 等平台的本地进程中在运行时拦截、修改、监控函数调用。核心架构Frida 客户端PC 端Python 工具 JavaScript 脚本负责编写和发送 hook 逻辑Frida Server / Gadget目标设备端注入到目标进程执行 JS 脚本通信桥梁通过 USB / TCP 连接客户端与 server 实时交互适用场景逆向分析与漏洞挖掘绕过 SSL Pinning 抓包运行时行为监控与调试自动化安全测试2. Frida 学习教程资源官方资源资源地址说明Frida 官网https://frida.re项目主页Frida 官方文档https://frida.re/docs/home/安装、快速入门、API 文档Frida CodeSharehttps://codeshare.frida.re社区共享脚本库Frida GitHubhttps://github.com/frida/frida源码与 releases中文教程资源地址说明Frida 官方手册中文版https://blog.csdn.net/freeking101/article/details/136944696机翻人翻覆盖全面Frida 官方文档翻译https://ivory.cafe/2024/01/09/trans-frida-re/翻译质量较好Frida 入门全教程知乎https://zhuanlan.zhihu.com/p/370638682系统性强适合入门Frida 入门与实战教程https://www.kucoding.com/article/351.html含 Java/Native hook 案例Frida 17.4 最新实战看雪https://bbs.kanxue.com/thread-290555.htm含 SSL Pinning 绕过案例Frida Android 实战系列https://www.cnblogs.com/jzssuanfa/p/19333298系列 4/5 章专讲 SSL Pinning关键 API 速查Java.perform(function(){// Hook Java 方法varclsJava.use(com.example.TargetClass);cls.targetMethod.implementationfunction(arg){console.log(参数: arg);varretthis.targetMethod(arg);console.log(返回值: ret);returnret;};});// Hook Native 函数Interceptor.attach(Module.findExportByName(libssl.so,SSL_CTX_set_verify),{onEnter:function(args){console.log(调用 SSL_CTX_set_verify);},onLeave:function(retval){retval.replace(0);}// 强制返回成功});3. SSL Pinning 原理什么是 SSL PinningSSL Pinning证书绑定是客户端校验服务器身份的进阶安全机制。普通 HTTPS 只校验证书是否由可信 CA 签发而 SSL Pinning 额外要求证书的公钥指纹SPKI Hash或证书本身必须匹配 App 预置的白名单。为什么 Charles 装了证书还抓不到包普通 HTTPS: App → 校验系统信任的 CA → Charles 证书由自定义 CA 签发 → 安装 CA 后 ✅ 通过 SSL Pinning: App → 校验预置证书指纹 → Charles 证书指纹不匹配 → ❌ 拒绝连接SSL Pinning 的常见实现层级实现方式说明Java 层重写X509TrustManager.checkServerTrusted自定义证书白名单校验Java 层OkHttpCertificatePinnerOkHttp 框架内置的证书绑定系统级network_security_config.xmlAndroid 7.0 官方配置Native 层BoringSSLSSL_CTX_set_custom_verifyTikTok/抖音等大厂使用最难绕过TikTok 的难点TikTok 使用自研的 Cronet 网络库libsscronet.so 自编译 BoringSSLlibttboringssl.soSSL 验证在 Native 层完成常规 Java 层 hook 无效。4. 环境搭建4.1 基础环境PC: Python 3.8 / ADB / Charles 设备: 已 root 的 Android 手机 或 模拟器推荐 Genymotion / LDPlayer4.2 安装 Frida# PC 端安装 Frida 工具pipinstallfrida-tools pipinstallfrida# 验证版本frida--version4.3 部署 Frida Server# 1. 查看设备 CPU 架构adb shell getprop ro.product.cpu.abi# 输出如: arm64-v8a / armeabi-v7a / x86 / x86_64# 2. 下载对应架构的 frida-server版本必须与 PC 端一致# https://github.com/frida/frida/releases# 例如: frida-server-17.4.0-android-arm64.xz# 3. 解压并 push 到设备adb push frida-server-17.4.0-android-arm64 /data/local/tmp/frida-server adb shellchmod 755 /data/local/tmp/frida-server# 4. 以 root 权限启动 frida-serveradb shellsu -c /data/local/tmp/frida-server # 5. 验证连接frida-ps-U# 能列出设备进程列表即成功关键frida-server 版本必须与 PC 端fridaPython 包版本完全一致否则会连接失败。5. TikTok SSL 绕过的三种方案方案一Frida 动态注入需 Root推荐原理运行时 hook Native 层的SSL_CTX_set_custom_verify函数强制返回0验证成功。核心脚本来自 CYRUS-STUDIO/frida-ssl-pinning-bypasssetImmediate(function(){// Java 层绕过 // 1. 绕过 OkHttp CertificatePinnertry{varCertificatePinnerJava.use(okhttp3.CertificatePinner);CertificatePinner.check.implementationfunction(hostname,peerCertificates){console.log([Bypass] OkHttp3 CertificatePinner.check() - hostname);return;};}catch(e){}// 2. 绕过系统 TrustManagervarTrustManagerImplJava.use(com.android.org.conscrypt.TrustManagerImpl);TrustManagerImpl.checkTrustedRecursive.implementationfunction(a,b,c,d,e,f){console.log([Bypass] TrustManagerImpl.checkTrustedRecursive());returnJava.use(java.util.ArrayList).$new();};// 3. 替换 SSLContext 的 TrustManagervarSSLContextJava.use(javax.net.ssl.SSLContext);varTrustManagerJava.registerClass({name:com.bypass.TrustAllManager,implements:[Java.use(javax.net.ssl.X509TrustManager)],methods:{checkClientTrusted:function(){},checkServerTrusted:function(){},getAcceptedIssuers:function(){return[];}}});SSLContext.init.overload([Ljavax.net.ssl.KeyManager;,[Ljavax.net.ssl.TrustManager;,java.security.SecureRandom).implementationfunction(km,tm,sr){this.init(km,[TrustManager.$new()],sr);};// Native 层绕过TikTok 关键 // 4. Hook BoringSSL SSL_CTX_set_custom_verifyfunctionbypassBoringSslCustomVerify(moduleName){varfuncModule.findExportByName(moduleName,SSL_CTX_set_custom_verify);if(func){Interceptor.attach(func,{onEnter:function(args){// 保存 callback 地址this.cbargs[2];}});// 替换 callback强制返回 ssl_verify_ok (0)Interceptor.attach(func,{onLeave:function(retval){retval.replace(0);}});console.log([] Hooked SSL_CTX_set_custom_verify in moduleName);}}bypassBoringSslCustomVerify(libttboringssl.so);// TikTokbypassBoringSslCustomVerify(libsscronet.so);// Cronet});// 等待 native 库加载后再 hookJava.deoptimizeEverything();运行命令# TikTok 国际版包名: com.zhiliaoapp.musically# 抖音国内版包名: com.ss.android.ugc.aweme# 启动并注入frida-U-lssl-bypass.js-fcom.zhiliaoapp.musically# 或附加到已运行的进程frida-U-lssl-bypass.js-F方案二APK 静态补丁 Frida-gadget无需 Root原理反编译 APK注入frida-gadget.so打包重签名后安装。gadget 在应用启动时自动加载 hook 脚本。工具链Apktool / LIEF / apksigner / zipalign / Radare2# 使用 Eltion 项目的 patch_apk.pypipinstall-rrequirements.txt# 自动补丁 APK注入 gadget 修改 sopython patch_apk.py-itiktok.apk-otiktok-patched.apk# 安装到设备无需 rootadbinstalltiktok-patched.apk原理详解用 LIEF 向 APK 的lib/arm64/注入frida-gadget.so修改libsscronet.so中证书验证函数的字节码将return 1改为return 0使用 Radare2 定位偏移地址find_offset.py搜索VerifyCert字符串重打包 重签名方案三直接修改 so 库需 Root原理直接修改设备上已安装应用的.so文件将证书验证函数的返回值从1改为0。# 1. 定位应用安装路径adb shellsuapk$(pm path com.zhiliaoapp.musically|cut-d:-f2)app_dir$(dirname$apk)# 2. 提取目标 so 文件cp$app_dir/lib/arm64/libsscronet.so/sdcard/libsscronet.so# 3. 用 Radare2 / Ghidra 定位 SSL_CTX_set_custom_verify 函数# 找到 return 1 的指令 (ARM64: 01 20 00 39 / mov w0, #1)# 修改为 return 0 (ARM64: 00 20 00 39 / mov w0, #0)# 4. 替换回设备cp/sdcard/libsscronet-patched.so$app_dir/lib/arm64/libsscronet.sochmod644$app_dir/lib/arm64/libsscronet.so十六进制修改示例来自 ahmeth4n 的分析原始: 01 20 00 39 (mov w0, #1 → 返回验证失败) 修改: 00 20 00 39 (mov w0, #0 → 返回验证成功)6. 开源项目汇总TikTok 专用项目项目地址方案状态Eltion/Tiktok-SSL-Pinning-Bypasshttps://gitcode.com/gh_mirrors/ti/Tiktok-SSL-Pinning-BypassFrida注入 APK补丁 so修改原仓库已封禁镜像可用0xSHAK1B/TIKTOK-SSL-Pinning-Bypasshttps://github.com/0xSHAK1B/TIKTOK-SSL-Pinning-Bypass预编译 APK无需 root活跃维护2026年更新D4tph4m/Tiktok-SSL-Pinninghttps://github.com/D4tph4m/Tiktok-SSL-PinningFrida 脚本可用Ahmeth4n/android-frida-script-archivehttps://github.com/Ahmeth4n/android-frida-script-archiveFrida 脚本 Ghidra 分析可用通用 SSL Pinning 绕过项目项目地址说明CYRUS-STUDIO/frida-ssl-pinning-bypasshttps://github.com/CYRUS-STUDIO/frida-ssl-pinning-bypassJava Native 全自动脚本含 TikTok 专用版Frida CodeShare 通用脚本https://codeshare.frida.re/pcipolloni/universal-android-ssl-pinning-bypass-with-frida/一行命令使用anirudh3171/SSL-pinning-bypasshttps://github.com/anirudh3171/SSL-pinning-bypass自动化 frida-server 部署通用一键绕过工具工具安装命令Objectionpip install objectionobjection -g 包名 explore→android sslpinning disableFrida CodeShare无需安装frida --codeshare pcipolloni/universal-android-ssl-pinning-bypass-with-frida -f 包名注意通用脚本Objection / CodeShare 通用版通常只能绕过 Java 层 SSL Pinning对 TikTok 的 Native 层 BoringSSL 绑定无效需要使用专门的 Native hook 脚本。7. 配合 Charles 抓包7.1 Charles 代理配置Charles → Proxy → Proxy SettingsHTTP Proxy Port:8888勾选 Enable transparent HTTP proxyingCharles → Help → SSL Proxying → Install Charles Root Certificate安装到设备系统证书Android 7.0 需 root 安装到系统目录Charles → Proxy → SSL Proxying Settings勾选 Enable SSL ProxyingInclude:*:4437.2 设备代理配置WiFi → 修改网络 → 高级选项 → 代理: 手动 主机名: PC的IP地址 端口: 88887.3 安装系统证书Android 7.0 必须# 计算 Charles 证书的 hash 文件名openssl x509-informPEM-subject_hash_old-incharles-ssl-proxying-certificate.pem|head-1# 输出如: c8750f0d# 重命名并 push 到系统证书目录需 rootadb push c8750f0d.0 /data/local/tmp/ adb shellsumount-orw,remount /systemcp/data/local/tmp/c8750f0d.0 /system/etc/security/cacerts/chmod644/system/etc/security/cacerts/c8750f0d.0reboot7.4 完整操作流程1. 启动 Charles配置代理与 SSL 2. 设备连接 Charles 代理 3. 安装 Charles 证书到系统目录 4. 启动 frida-serveradb shell su -c /data/local/tmp/frida-server ) 5. 用 Frida 注入 SSL 绕过脚本同时启动 TikTok frida -U -l ssl-bypass.js -f com.zhiliaoapp.musically 6. 在 Charles 中即可看到 TikTok 的 HTTPS 请求8. 常见问题与排错问题原因解决方案frida-ps -U无输出frida-server 未启动或版本不匹配确认 server 版本与客户端一致以 root 启动Failed to spawn包名错误或应用未安装确认包名国际版com.zhiliaoapp.musically国内版com.ss.android.ugc.awemeJava 层 hook 成功但抓不到包TikTok 用 Native 层 BoringSSL必须额外 hooklibttboringssl.so/libsscronet.so应用闪退反调试/反 Frida 检测使用frida-server改名、frida-gadget隐藏、或magisk hide连接后立即断开TikTok 检测到 Frida 进程尝试 spawn 模式-f而非 attach 模式抓到包但无法解密Charles 证书未装到系统目录Android 7.0 必须装到/system/etc/security/cacerts/代理被忽略No Proxy应用禁用了系统代理使用 VPN 模式代理工具如 Drony / ProxyDroidTikTok 反 Frida 检测TikTok 有较强的反调试机制可能检测frida-server进程名frida-agent内存特征/data/local/tmp/下的 frida 文件TracerPid调试器标志应对方法重命名 frida-servermv frida-server myserver使用frida-gadget注入方式无独立进程使用 Magisk 的 Zygisk frida 模块隐藏9. 法律与伦理须知本指南内容仅供安全研究、渗透测试和教学使用对任何应用进行测试前必须获得应用所有者的明确授权未经授权抓取、分析他人应用数据可能违反相关法律法规TikTok 的服务条款禁止逆向工程和自动化访问违反可能导致账号封禁请遵守《网络安全法》《数据安全法》《个人信息保护法》等相关法律参考资源链接Frida 官方文档: https://frida.re/docs/home/Frida Releases: https://github.com/frida/frida/releasesFrida CodeShare: https://codeshare.frida.re/browseCYRUS-STUDIO SSL Bypass: https://github.com/CYRUS-STUDIO/frida-ssl-pinning-bypass0xSHAK1B TikTok Bypass: https://github.com/0xSHAK1B/TIKTOK-SSL-Pinning-BypassAhmeth4n Native Hooking 分析: https://ahmeth4n.github.io/blog/android_native-library_hooking-tiktok-ssl-bypass.htmlFrida Android 实战系列: https://www.cnblogs.com/jzssuanfa/p/19333298看雪 Frida 17.4 实战: https://bbs.kanxue.com/thread-290555.htm