逆向解析Shopee的ds cookie生成:从MD5魔改到设备签名

张开发
2026/4/15 22:18:03 15 分钟阅读

分享文章

逆向解析Shopee的ds cookie生成:从MD5魔改到设备签名
1. 从32位字符串开始的逆向之旅第一次看到Shopee的ds cookie时那个32位的字符串立刻让我联想到常见的MD5哈希值。作为一个经常和加密算法打交道的老手这种直觉往往很准。但现实情况总是比想象复杂得多——这可不是标准的MD5实现。在实际抓包分析中你会发现ds参数出现在几乎所有关键请求里特别是下单、支付这些敏感操作时。这就好比进小区要刷门禁卡没有正确的ds值服务器根本不会理你的请求。我花了整整三天时间用Charles抓了上百个请求才确认这个参数的重要性。2. 定位魔改MD5的关键线索2.1 标准MD5的特征值追踪逆向工程就像侦探破案需要抓住关键线索。标准MD5有四个特征常量A 0x67452301 B 0xefcdab89 C 0x98badcfe D 0x10325476在Chrome开发者工具的Memory面板里我通过搜索这些特征值最终定位到一个可疑的wasm模块。有意思的是Shopee并没有直接使用标准MD5而是做了几处关键修改初始化向量被调整了最后一位轮函数中的位移量有细微变化填充规则增加了特殊字符处理2.2 动态调试的突破点在Fiddler设置断点时发现每次生成ds前都会调用一个名为getWebUniqueCCD()的函数。这个函数返回的字符串看起来像是设备指纹后面拼接的UUID也不是随机生成的而是来自localStorage中的__WIR_SZ_UNIQ_DC字段。这里有个坑我踩过——直接复制这个UUID会导致生成错误的ds值。原来Shopee在存储时会对UUID做base64编码使用时需要先解码还原。3. 参数拼接的隐藏逻辑3.1 设备指纹的生成机制shopee_webUnique_ccd这个参数特别有意思它由三部分组成屏幕分辨率哈希浏览器插件列表的CRC32WebGL渲染器特征码在Node.js环境下模拟时必须确保这三项参数与真实浏览器环境一致。我写了个自动化测试脚本可以批量生成不同设备配置下的ccd值function generateCCD() { const screenHash md5(${screen.width}x${screen.height}); const pluginsCRC crc32(navigator.plugins); const webglFingerprint getWebGLInfo(); return ${screenHash}_${pluginsCRC}_${webglFingerprint}; }3.2 UUID的特殊处理逆向分析发现__WIR_SZ_UNIQ_DC这个UUID的生成算法也很特别前8位是浏览器启动时间戳中间16位是硬件信息哈希最后8位是随机盐值在本地复现时如果直接使用随机UUID会导致生成的ds值被服务器拒绝。必须严格按照这个规则构造这也是很多逆向者容易忽略的细节。4. 完整生成流程的实现4.1 算法还原步骤经过多次调试最终确定的ds生成流程如下获取设备指纹shopee_webUnique_ccd从localStorage读取__WIR_SZ_UNIQ_DC拼接字符串${ccd}${uuid}使用魔改MD5计算哈希对结果做二次base64编码Python实现的核心代码如下def generate_ds(): ccd get_web_unique_ccd() # 模拟浏览器环境获取 uuid get_wir_uuid() # 从localStorage读取 raw_str f{ccd}{uuid} # 使用魔改版MD5 modified_md5 ModifiedMD5() modified_md5.update(raw_str.encode()) digest modified_md5.hexdigest() # 二次编码 return base64.b64encode(digest.encode()).decode()4.2 验证与调试技巧在实际测试中建议先用浏览器正常访问Shopee记录下正确的ds值。然后用自己的算法生成对比这里有几个调试建议确保时间戳误差在3秒内检查HTTP头部的User-Agent是否完全一致验证所有环境参数是否采集完整使用Wireshark对比原始请求的TCP包我在实际项目中遇到过时区导致的验证失败后来发现Shopee的服务器会校验时间戳的时区偏移量。这个细节在官方文档中完全没有提及只能靠反复试验发现。5. 安全机制的深层思考Shopee的这种设计其实体现了现代Web安全的一种趋势——设备绑定行为验证。单纯的参数加密已经不够必须结合环境特征才能生成有效凭证。这种机制虽然提高了逆向难度但也带来一些用户体验问题频繁更换设备会导致需要重新验证浏览器插件更新可能触发安全拦截自动化工具难以维持长期会话在逆向过程中最耗时的部分其实是找出那些隐式依赖的环境参数。有时候少采集一个屏幕DPI值就会导致整个验证失败。建议想要研究的朋友先从简单的静态页面开始逐步增加复杂度。

更多文章