告别抓包失败:用Frida搞定PDD安卓App的长连接屏蔽(附完整Hook脚本)

张开发
2026/4/13 2:01:12 15 分钟阅读

分享文章

告别抓包失败:用Frida搞定PDD安卓App的长连接屏蔽(附完整Hook脚本)
逆向工程实战突破PDD长连接限制的Frida动态注入方案最近在分析某电商App时发现传统抓包工具完全失效——只能捕获到零散的.jif文件片段关键API请求全都消失了。这其实是App采用了长连接技术规避抓包的典型表现。经过逆向分析我们找到了突破这种限制的技术方案。1. 长连接技术的反抓包机制解析当你在Android设备上打开抓包工具却发现目标App的网络请求寥寥无几时大概率遇到了长连接技术。这种机制通过建立持久化TCP连接将多个HTTP请求复用同一条通道使得传统基于单次请求拦截的抓包工具难以捕获完整数据流。以某电商App为例其核心通信模块位于com.xunmeng.basiccomponent.titan.api包内。逆向分析发现初始化时会调用updateLongLinkHostWhiteList方法将API域名加入白名单-[AMTitan updateLongLinkHostWhiteList:] ( apiv2.yangkeduo.com, apiv3.yangkeduo.com, // 其他十余个域名... )这些域名下的所有请求都会通过长连接通道传输导致Charles等工具只能看到初始握手数据。要解决这个问题必须从底层干预App的网络连接策略。2. 动态调试环境搭建2.1 基础工具准备工欲善其事必先利其器。我们需要以下工具链Frida动态注入框架版本建议15.1.28以上adbAndroid调试桥目标App建议使用较旧版本新版本可能增加防护抓包工具Charles或Fiddler提示测试设备建议使用Android 7-9版本这些系统对Frida支持较好且证书处理相对简单。2.2 绕过SSL Pinning现代App普遍采用SSL Pinning防止中间人攻击我们需要先解决这个问题# 安装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 然后使用以下Python脚本检测SSL Pinningimport frida def on_message(message, data): print(message) device frida.get_usb_device() pid device.spawn([com.xunmeng.pinduoduo]) session device.attach(pid) with open(ssl_bypass.js) as f: script session.create_script(f.read()) script.on(message, on_message) script.load() device.resume(pid)3. 关键方法定位与Hook实现3.1 逆向分析突破口通过静态分析发现网络模块的核心控制类AMTitan负责长连接的启用与维护。其中关键方法包括方法名功能描述参数说明updateLongLinkHostWhiteList设置长连接域名白名单字符串数组setLongLinkEnabled全局长连接开关布尔值3.2 Frida Hook脚本开发以下是完整的Hook脚本实现强制关闭长连接Java.perform(function() { const AMTitan Java.use(com.xunmeng.basiccomponent.titan.api.AMTitan); // Hook白名单更新方法 AMTitan.updateLongLinkHostWhiteList.overload([Ljava.lang.String;).implementation function(hosts) { console.log([] 原始长连接白名单: hosts); // 替换为空数组 this.updateLongLinkHostWhiteList([]); console.log([] 已清空白名单); }; // Hook长连接启用方法 AMTitan.setLongLinkEnabled.implementation function(enabled) { console.log([] 尝试设置长连接状态: enabled); // 强制关闭 return this.setLongLinkEnabled(false); }; // 初始化时强制关闭 const ApiNetChannelSelector Java.use(com.xunmeng.basiccomponent.titan.api.ApiNetChannelSelector); ApiNetChannelSelector.getInstance().setLongLinkEnableHosts([]); });4. 实战验证与数据分析4.1 注入脚本执行将上述脚本保存为disable_longlink.js通过以下命令注入frida -U -f com.xunmeng.pinduoduo -l disable_longlink.js --no-pause成功注入后控制台会输出类似日志[] 原始长连接白名单: apiv2.yangkeduo.com,apiv3.yangkeduo.com... [] 已清空白名单 [] 尝试设置长连接状态: true4.2 抓包结果对比效果验证数据场景捕获请求数数据完整性可用性原始状态2-3个不完整不可用Hook后200完整可用此时在Charles中可以看到完整的API请求流包括商品详情接口/api/goods/detail搜索建议接口/api/search/suggest用户信息接口/api/user/profile4.3 常见问题排查若遇到注入失败可检查以下方面Frida版本兼容性确保server与client版本一致App防护机制部分版本会检测Frida需使用定制版frida-server方法签名变更不同App版本可能修改方法名需重新逆向确认5. 进阶技巧自动化抓包系统搭建对于需要长期监控的场景可以构建自动化系统import frida import sys def on_message(message, data): if message[type] send: print([LOG], message[payload]) else: print(message) device frida.get_device_manager().add_remote_device(192.168.1.100:5555) pid device.spawn([com.xunmeng.pinduoduo]) session device.attach(pid) script session.create_script( Java.perform(function() { const AMTitan Java.use(com.xunmeng.basiccomponent.titan.api.AMTitan); AMTitan.updateLongLinkHostWhiteList.implementation function() { send(拦截长连接设置); this.updateLongLinkHostWhiteList([]); }; }); ) script.on(message, on_message) script.load() device.resume(pid) sys.stdin.read()配合mitmproxy可以实现自动化的请求捕获与分析流水线。这种方案特别适合竞品数据分析价格监控系统接口行为研究6. 技术原理深度剖析为什么这个方法有效我们需要理解Android网络栈的运作机制长连接实现层基于TCP长连接池HTTP请求被封装为二进制协议帧多路复用降低连接建立开销Hook生效点App网络模块 → 长连接管理器 → [Hook点] → 实际网络栈 ↑ 我们的Frida脚本技术优势对比方案成功率隐蔽性复杂度Xposed模块高低中Frida注入高中低系统代理低高低7. 安全研究与合规边界在实施这类技术时需要注意法律合规仅用于授权测试或个人学习数据安全避免处理敏感用户信息防护升级目标App可能随时更新防护机制建议的研究边界仅分析公开接口不涉及用户数据不干扰正常服务实际项目中我们更推荐使用官方开放的API接口。这种方法仅适用于技术研究和安全评估场景。

更多文章