做技术这行的人,收到“拼多多逆向协议”这种需求,基本都能猜到背后想干什么:要么是想拉商品数据做比价,要么是想在非官方端实现下单流程,要么是做自动化测试的壳子被业务方误用。这个标题拆开看,其实是一个典型的客户端-服务端通信逆向问题,涉及抓包、JS逆向、Android逆向、小程序解包、签名还原等一系列环节。我最初接触这个方向,是被一个自动化比价项目逼的,本以为写几个接口就行,结果发现请求参数、签名算法、风控逻辑三道坎,坎坎都要命。
先说清楚边界:本文只讲协议逆向的技术原理、通用的分析思路、以及我踩过的一些坑,不提供绕过拼多多风控做批量数据抓取的具体实现。逆向本身是安全研究、漏洞挖掘、接口兼容的常规手段,但未经授权读取用户数据、绕过商家规则,法律风险自己掂量。把这层讲明白之后,我们再来看一套完整的技术路线,你会发现它几乎覆盖了现代App通信分析的全部知识点。
1. 拼多多“逆向协议”到底在逆什么
1.1 客户端与服务器的加密通信链路
拼多多不像传统Web站点那样,请求参数明文放在URL里。它App端和H5端都采用了多层加密通信,最外层是HTTPS/TLS,中间层是一套自研的请求包装,最里层才是真正的业务字段。你在Charles里看到的一个POST请求,body往往是被混淆过的JSON,或者干脆是一段二进制,需要先还原加密函数才能读懂。
这个结构不是拼多多独有,几乎所有主流电商都是这么干的。核心原因有两个:一是防止接口被轻易调用,保护数据安全;二是做反爬和业务风控,通过签名参数识别非正常客户端。所以“逆向协议”这个说法,其实包含三层工作:链路层(TLS/SSL是否做证书校验)、协议层(请求怎么包装、参数怎么编码)、算法层(签名和加密函数怎么还原)。
注意:TLS证书校验是App端最常见的一道坎。直接在手机上装代理证书往往没用,因为App只信任自己预埋的证书,需要处理证书固定问题。我后面会讲原理,具体绕过脚本不贴。
1.2 逆向的三大核心对象
说白了一件事:搞清楚数据在哪儿、怎么加密、怎么签名。
第一是请求参数。拼多多的请求里,除了业务参数,还有一堆反爬字段,比如时间戳、随机数、设备信息、以及核心签名参数。签名的作用是让服务器确认请求来自“可信客户端”,它不是简单的MD5,而是把参数排序、拼接、混入固定字符串,再走一套自定义哈希逻辑得出的结果。
第二是加密算法。Web端通常是JavaScript,App端多半下沉到Native层的SO文件,小程序端可能是WASM或者纯JS。同一个业务在三个端实现,加密逻辑还不太一样,这就逼着你至少要掌握JS逆向和Native逆向里的部分技能。
第三是本地数据存储。聊天记录、缓存数据放在本地数据库或者JSON文件里,常见目录包括/data/data/com.xunmeng.pinduoduo/下的databases、shared_prefs、files。这些目录里能看到商品缓存、登录态、以及聊天记录的数据库文件。但这个方向先说明白:技术上可读不代表你有权去读别人的东西,聊天记录属于高度敏感数据,我后面会详细说明什么能碰什么不能碰。
1.3 逆向协议的应用场景与合规边界
先把正向场景列出来:对接拼多多开放平台做正规API开发、做安全测试和漏洞挖掘、做竞品功能的可用性调研、做自动化回归测试。这些场景下,逆向协议是帮你理解“对方系统怎么设计”的手段,最后还是要落到合规的接口对接上。
负面场景就一句话:绕过签名和风控,批量拉取商品库、用户信息、订单数据,或者做“无痕发货”、代发之类规避平台规则的灰产操作。这些行为轻则违反平台服务协议,重则触犯《数据安全法》《个人信息保护法》和《刑法》里侵犯公民个人信息罪的相关条款。我见过不少团队做这类需求,最后要么接口封杀、要么法律函件找上门,真正能长期靠这个吃饭的几乎没有。
所以接下来的技术拆解,都是围绕“懂原理、能分析、会防护”这个思路来的。你学完能看懂对方怎么防,也能给自己系统设计更可靠的签名方案,这才是正向价值。
2. 拆一条真实请求:从抓包到定位加密函数
2.1 抓包环境与基础配置
做协议逆向,第一步永远是抓包。工具上我自己的习惯是Charles配合手机代理,或者用mitmproxy来做脚本化处理。Web端更简单,直接浏览器DevTools的Network面板就能看到全部请求。
配置上要注意三个细节:一是手机和电脑需要在同一局域网,代理IP填电脑的局域网地址;二是必须安装并信任代理工具的根证书,否则HTTPS流量解密不了;三是部分机型上需要把代理设为手动,不能开系统全局代理——有些App会检测到系统代理然后拒绝发送请求。
这步的产出是一份完整的请求清单,包含URL、请求头、请求体、响应体。你要做的事不是盯着看,而是把关键请求记录下来,特别是那些和登录、商品详情、下单相关的请求。因为它们的参数通常是最完整的,包含的签名逻辑也最典型。
2.2 从调用栈定位核心加密函数
如果目标在Web端或H5端,打开DevTools的Sources面板,在发送请求的代码位置下XHR断点,触发一次请求后,调用栈会把你带到XMLHttpRequest的封装函数,再一层层往上回溯,很快就能看到签名相关的函数调用。
这里有个实用技巧:不要从调用栈顶层一层层翻,而是直接搜索关键词。以拼多多为例,如果我先搜anti-content、rc-res-data这类参数名,或者搜sign、_sign等通用命名,基本能秒定位到加密核心区域。因为开发者通常不会给这些变量起特别离奇的名字,即使代码经过混淆,字符串中的关键字也很难完全去掉。
定位到函数之后,别急着读代码,先在控制台手动调用一遍,看输出结果和抓到的真实请求参数是否一致。这个过程叫“函数验证”,确认这个函数就是签名入口后,再去读它的内部实现,会快很多。
2.3 签名算法的还原思路
多数电商的签名逻辑可以抽象成三步:参数收集、排序拼接、哈希计算。区别在于拼接格式、固定常量、以及是否引入动态token。
下面给一个通用的简化示例,不是拼多多真实实现,但思路和代码结构非常接近:
import hashlib import time def generate_sign(params: dict, secret: str) -> str: # 剔除空值和签名本身 filtered = {k: v for k, v in params.items() if v not in ("", None) and k != "sign"} # 按key排序后拼接 raw = "&".join(f"{k}={filtered[k]}" for k in sorted(filtered)) # 混入固定secret和时间戳 payload = f"{raw}&secret={secret}&ts={int(time.time())}" return hashlib.md5(payload.encode()).hexdigest()真实项目里,secret往往不是固定的,而是根据登录态动态下发;哈希也可能从MD5升级到HMAC-SHA256,或者自定义一个可逆加密算法包在外层。我见过最狠的一种做法是服务器端每次会话生成一个token,客户端签名时用它当盐,隔一段时间就换,你就算逆向出算法,没有token也玩不转。
这种“签名+动态token+有时间窗口”的三层设计,是所有大型平台都在用的趋势。理解这个趋势比单纯还原某个接口更有意义。
3. 客户端与小程序逆向的差异化路线
3.1 Android端逆向的基础工具链
拼多多App的加密逻辑,很多在Native层的SO库里,用Java代码直接Hook不一定能拿到明文。这时候工具链就很重要了。我的常用组合是:jadx看Java层反编译代码,Frida做运行时Hook,objection做内存漫游和类搜索,unidbg用来脱离真机调SO。
jadx的用法很简单,把APK拖进去会自动反编译,直接搜索类名、方法名、字符串。但它只能看到Java层和JNI声明,SO里的C/C++逻辑看不到,所以下一步用Frida Hook JNI函数,在参数进SO之前或者返回值出来之后打印日志,拿到关键数据。
这种方式的最大优势是“不还原算法也能跑通流程”——你可以直接在运行时调用加密函数,把它的返回值套用到自己的请求上,这在测试阶段非常实用。比纯静态分析还原全部逻辑,省下至少一半时间。
3.2 小程序端的wxapkg解包与还原
微信小程序、支付宝小程序是另一个战场。拼多多小程序端的大量业务逻辑跑在JS里,静态分析比原生App要容易不少,但因为代码会被编译成WASM或者经过多层混淆,也谈不上轻松。
第一步是拿到小程序包。安卓手机上,微信的小程序包一般在/data/data/com.tencent.mm/MicroMsg/.../appbrand/pkg/目录下,文件后缀是.wxapkg。拿到后用现成的解包工具处理,就能得到JS代码、WXML模板、以及各种资源文件。
解包之后,用关键词搜索同样有效。小程序端往往能把Web端的签名函数平移过来,或者更简化一些。而且小程序的调试环境很友好,通过开发者工具或者Hook,可以直接在运行时修改数据、观察签名生成过程。我个人的体感是,小程序端的协议分析难度约等于“Web端分析+一层包装”,比App端的SO分析友好太多。
3.3 本地数据与聊天记录的存储机制
再回到热词里那个“拼多多电脑客服端聊天记录在哪个文件夹”的问题。先说结论:电脑端聊天记录本质上是一个本地数据库文件,通常在安装目录的某个Local Storage、IndexedDB或SQLite文件里,具体目录会随版本变化。
这个问题的答案放在十年前,就是“找到数据库文件,用SQLite工具打开,直接读表”。现在不行,因为数据库文件会做加密或混淆处理,字段名可能也是动态生成的。要分析它,最稳妥的思路是在客户端运行时分两步走:第一步监控数据库操作日志或者在运行时打开数据库句柄导出内容;第二步再分析加密逻辑。
但我必须把丑话说在前面:聊天记录属于《个人信息保护法》明确保护的个人信息,而且不管是“客服端”还是“客户端”,里面的会话对象很多都是真实用户。未经授权去提取、导出、传播聊天记录,哪怕你是给自己公司的账号做分析,只要涉及到他人隐私,都是在法律边缘横跳。普通业务上需要的客户沟通数据,应该通过拼多多官方提供的商家后台导出能力来做,而不是自己写脚本去读本地库。
4. 验证码与风控机制的对抗与边界
4.1 滑块验证码的运行原理
拼多多的滑块验证,是协议逆向路上的一座大山。它一般出现在登录、领券、下单这几个敏感场景,本质是验证“操作者是人还是机器”。
滑块验证的技术原理分三块:一是背景图和缺口的识别,服务端会事先知道缺口位置,客户端要把用户滑过的位置上报,距离偏差在允许范围内才算过;二是轨迹采集,记录用户从按下到松手的坐标、时间、速度变化,机器模拟的轨迹因为加速度曲线不合理,很容易被识别;三是环境校验,浏览器或App的指纹信息、UA、IP风险分都会被一并上报。
所以你会看到很多资料在讲“还原滑块参数”或者“过hcaptcha”,核心就是在伪造这一段轨迹和最终坐标。这里我不贴代码,因为这类内容被滥用的概率极高。但原理值得了解:风控产品设计者用这三点识别机器,对抗者的任务就是让机器模拟出的行为曲线像人。
4.2 设备指纹与行为检测
验证码本身只是风控的一层,底层还有设备指纹。拼多多的风控体系会采集大量设备信息:IMEI、MAC、Android ID、传感器列表、屏幕分辨率、时区、语言、甚至root状态。这些信息拼成一个设备ID,同一设备换个账号、换个IP,依然可以被识别出来。
行为检测就更细了。比如打开App到发起请求的间隔是不是太稳定,滑动页面滚动速度是不是异常一致,点击坐标是不是每次都落在同一个像素点。这些看似无关紧要的数据,在风控模型里都是“非人类操作”的强证据。
我一直认为,做协议逆向如果只盯着参数还原,是走不远的。因为你每还原一个签名,对手可能只需在风控层加一个行为检测字段,你又要重新分析。双方不断迭代,而逆向方始终处于被动位。真正有价值的能力是理解这些检测逻辑,然后把你自己的系统做得足够“干净”。
4.3 合规红线与实际操作禁区
这里我把能做什么、不能做什么说得再直白一点。
不能做的事包括:批量注册账号绕过滑块验证、抓取用户个人信息或订单数据、自动下单抢购、规避平台风控做代发和无痕发货、逆向出来的算法用于商业竞争。这几类行为,一旦被发现,轻则封号封IP,重则被起诉。
能做并且值得做的事包括:给自己的系统接入官方开放平台API、做客户端安全测试并提交漏洞报告、分析竞品App的功能结构但只用于产品设计参考、研究协议用于教学和内部培训。如果一定要做数据采集,优先看拼多多开放平台有没有对应接口,官方接口虽然有限流和费用,但合法合规,长期稳定。
提示:判断一个逆向项目能不能做,有一个简单的标准——问自己“如果这个事情被公开报道,我会不会觉得难堪”。但凡有这个感觉,基本就是越界了。
5. 常见问题与排查技巧实录
5.1 抓不到包的两个原因和解决思路
抓不到包,绝大部分情况是两个原因。第一是证书没信任到位,很多新手装完代理证书忘了在系统设置里额外开启“用户证书”信任,Android 7.0以上的App默认不信任用户证书。解决办法是按机型查证书信任开关,并在需要时把App加入代理白名单。
第二个原因是SSL Pinning。App只信任自己预埋的证书,代理工具的证书就算被系统信任,App依然拒绝通信。解决思路是从“网络层抓包”转向“应用层Hook”,用Frida之类的手段在App运行时直接把明文请求打出来,或者把证书校验函数的返回值改为0。
实操的时候,我习惯先用无Pinning的环境验证工具链,再用Hook方案处理Pinning。不要一上来就上Hook,那会增加很多不确定变量,反而不好排查。
5.2 定位加密参数太慢怎么办
如果在一个大型混淆JS文件里找不到签名函数,我的做法是按优先级依次排查:先全局搜索字符串关键字(sign、token、anti、content),再搜索Base64/Hex特征(btoa、atob、toString(16)),最后用Hook手段在运行时盲搜。
运行时盲搜是最快的终极大招。拿Frida为例,可以HookJSON.stringify和Object.toString,看发送前的数据对象长什么样;也可以直接HookXMLHttpRequest.send,在请求发出前打印参数。这一步做完,加密算法的入口基本就暴露了。
还有一种情况是参数在SO库内部拼好,Java层根本看不到。这时候确实得上unidbg或者真机Hook的JNI层,没有捷径。经验是:凡是卡了很久查不出来的加密参数,八成是在SO里做的,早点切换分析思路反而省时间。
5.3 把逆向能力转化为正向价值
最后聊聊我自己的体会。接触拼多多逆向协议这段时间,我最大的收获不是“能过滑块”或“能还原签名”,而是彻底搞懂了现代客户端通信系统的设计套路:分层加密、签名防篡改、动态token、风控联动,这套组合本来就是安全工程师的作品。
你拿这套认知反过来看自己负责的系统,会发现很多可以改进的地方。比如自己的App请求参数是否容易被篡改、签名逻辑是否够强、敏感数据是否加密存储、是否需要引入设备指纹。把这些补强,就是在提升自己产品的安全水位。
如果你是真的想长期做接口数据分析,我的建议是:把精力放到拼多多开放平台、以及各类合规数据处理工具上。官方API虽然可能cover不了所有场景,但你的代码可以安全地跑在合规这条线上,不用每天担心接口被突然封禁,也不用担心某天收到律师函。这个选择,才是技术人员给自己省心的正道。
最后再分享一个我踩坑之后的习惯。我在做任何“逆向协议”分析之前,都会先把目标拆成两个文件夹:一个是“原理验证”,放抓包记录、算法还原笔记和测试脚本,这部分纯粹学习用;另一个是“业务落地”,只放通过官方渠道和合规接口实现的代码。保持这个习惯之后,我发现自己对技术的热情一点没减,但每天晚上睡觉踏实多了。如果你也在做类似的研究,建议也试试这个办法。