某红书 Js 逆向思路

目标网站

某红书。

目标仍是主页作品, 可以通过下拉触发请求。edith.xiaohongshu.com/api/sns/web...

网站分析

参数分析

请求发送参数如下。

Json 复制代码
// params
params = {
    "num": "30",  // 文章数
    "cursor": "68b9507e000000001d01cf8e", // 起始位置
    "user_id": "66a19d15000000001e002249", // 用户 id
    "image_formats": "jpg,webp,avif",
    "xsec_token": "",
    "xsec_source": ""
}
// 特殊的 headers
headers = {
    "x-b3-traceid": "b77bf7412aa76aa5",
    "x-s": ="XYS_2UQhPsHCH0c1Pjh9HjIj2erjwjQhyoPTqBPT49pjHjIj2eHjwjQ+GnPW/MPjNsQhPUHCHfM1qAZlPebKL/Q9LrYFzbrl+BYjG0peyoG9nLkS4DTQG/zzaB+N8rko4eQO+/4xN786anzH47802dYFLrpIPAS1nnlP+rY0yMzkz9MDzBEj/nQePnErcf4/G0zt2DYwyeSg4dcEwLp6LAzb+g8Lqrlb80+/JeQ6PL8C8F+V8SD32D40PM4oaeQwc9zIybSbwr4HzFI7we+9y94awemyNFSCcA+8/DTx/LD32fIFPBIE2DcjNsQh+sHCHjQR",
    "x-s-common": "2UQAPsHCPUIjqArjwjHjNsQhPsHCH0rjNsQhPaHCH0c1Pjh9HjIj2eHjwjQ+GnPW/MPjNsQhPUHCHdYiqUMIGUM78nHjNsQh+sHCH0c1weP1PsHVHdWMH0ijP/DE8080+AQYG0zS2eLhqA87+9D9yBcAJ9clGdQ3y9qMJ9Y7qgQ6PeHAPeZIPeHh+eGFPsHVHdW9H0ijHjIj2eqjwjHjNsQhwsHCHDDAwoQH8B4AyfRI8FS98g+Dpd4daLP3JFSb/BMsn0pSPM87nrldzSzQ2bPAGdb7zgQB8nph8emSy9E0cgk+zSS1qgzianYt8p+1/LzN4gzaa/+NqMS6qS4HLozoqfQnPbZEp98QyaRSp9P98pSl4oSzcgmca/P78nTTL08z/sVManD9q9z1J9p/8db8aob7JeQl4epsPrz6agW3Lr4ryaRApdz3agYDq7YM47HFqgzkanYMGLSbP9LA/bGIa/+nprSe+9LI4gzVPDbrJg+P4fprLFTALMm7+LSb4d+kpdzt/7b7wrQM498cqBzSpr8g/FSh+bzQygL9nSm7qSmM4epQ4flY/BQdqA+l4oYQ2BpAPp87arS34nMQyFSE8nkdqMD6pMzd8/4SL7bF8aRr+7+rG7mkqBpD8pSUzozQcA8Szb87PDSb/d+/qgzVJfl/4LExpdzQ4fRSy7bFP9+y+7+nJAzdaLp/2LSiz/QH8dbMagYiJdbCwB4QyFSfJ7b7yFSenSqh8A+A8BlO8p8c4A+Q4DbSPB8d8ncIyLEQy/pAPFSj80QM4rbQyLTAynz98nTy/fpLLocFJDbO8p4c4FpQ4S+02fp68n8n4Fpd8DkALMm7nDDALdQQ2rLM/op749bl4UTU8nTinDbw8/b+/fLILoqEaL+wqM8PJ9p/GDSBanT6qM+U+7+nJD8kanTdqM8n4rMQygpDqgb7t7zl4b4QPAmSPMm7aLSiJ9LA4gclanSOq9kM4e+74gz1qMm7nrSeG9lQPFSUP04VyAQQ+nLl4gzeaLp/NFSbadPILoz1qbSQcLuIafp88DclaLpULrRc4rT6qgqAa/+O8gYl4b4z/epSyn+mqA+Iyo4QyBRAPASOqA+M4o+0Lo4YaL+tqM4c4ApQyn4Sy9pl/rSea9px8sRA8SmF+LSh+7+h4g4r+BMPnLDAt7pQy94SL9ktqAbQ/9LIp9RAzopFqDS3zepQ4f+YnSm7+rSe+rbQzaRS+DcFzjHVHdWEH0iTP/c7+Aq7PeWMwaIj2erIH0iINsQhP/rjwjQ1J7QTGnIjKc==",
    "x-t": "1760785300969",
    "x-xray-traceid": "ccfb7dbef2252b87edf9f80957b979c0"
}

可以用 Postman 等工具对请求进行几次重放测试, 去掉一些参数, 最终可以确定仅有 x-s 参数是影响请求结果的, 即为我们需要逆向的参数。

加密分析

某红书的加密位置很好找, 直接搜索就能找到加密位置。

加密位置示例

在加密位置我们需要下一个断点, 来继续的跟加密过程, 主要来跟 v 这个函数来看具体逻辑。

加密函数逻辑

由此我们可以得到一下信息。

JavaScript 复制代码
// 根据加密位置的 var _ = "X-s" 和 a.headers[_] = v(x, s) 可以确定 v 函数的返回值就我们找的 x-s, 即如下表达式。
"XYS_" + (0,p.xE)((0, p.lz)(JSON.stringify(f)))
// 上边计算中需要的 f 值如下, f 对象中除了 s 以外都是定值。
{
    "x0": "4.2.6",
    "x1": "xhs-pc-web",
    "x2": "Mac OS",
    "x3": "mns0201_yAZ9WLeLC1/mWtdCsxvGBBJ/DdxCC/9ZUnGD5STB7QWR9TPbFjk0hHkIOihgB+f1eJs01CQlhpDpjBIS5JxQfefPVePwswLSmbLoC0Lk0i6dZYK+mZwC/rUG0xgtVbc8K0o+y1Snxj8Kkfvx5PSXBLr2l+kLoane4kMIk84kX1n=",
    "x4": "object"
}
// f 变量中除了 s 以外都是定值, 而 s 由如下计算得到。
window.mnsv2(c, d)
// s 的计算过程中 c 值为传入的 url, d 值由如下计算得到。
var d = (0, p.Pu)([c].join(""))

所以我们现在的目标是弄清楚以下几个函数, 就能确定加密的方式。

  • x-s 计算中用到的 p.xE 函数
  • x-s 计算中用到的 p.lz 函数
  • d 变量计算中用到的 p.Pu 函数
  • s 变量计算中用到的 window.mnsv2 函数

可以通过控制台打印该函数然后点击, 跳转到函数定义的位置。

p.Pu 函数

其实本质上将传入的 url 进行 md5 加密后返回(可以使用在线 md5 加密工具测试验证), 可以选择把原函数扣下来使用, 也可以选择自己实现 md5 加密函数。

p.xE 及 p.lz 函数

可以看到, p.xE 是一个打乱了编码表的 b64 编码函数, p.lz 就是一个将字符串编码为 utf8 字节数组的函数, 往上翻一翻也能看到编码表及 tripletToBase64 函数中 c 变量的计算方式。同样的可以选择扣下来, 也可以自己实现, 都没问题。

window.mnsv2 函数

window.mnsv2 函数所在文件结构

可以看到这是个很典型的 ob 混淆文件, 我们基本没办法看出来具体的逻辑。

不过有个很好的地方, 就是通过 window 来调用的, 说明这个函数在初始化的时候会被加载到全局中, 所有我们接下来的思路就是在加载函数的地方打上断点, 看一看他是如何被放在 window 中的。

加载函数断点示例

断到之后可以跟着堆栈翻一翻, 看看加载过程是什么样的, 最终加载的入口可以确定到 signV2Init 堆栈这里。

加载入口函数

可以看到, 这里其实是用 eval 运行了两段代码, 然后就初始化了 window.mnsv2 函数, 我们可以把这两段代码复制下来, 放在一个干净的浏览器环境里边测试下是否是这样。

确定这样可以正确加载 window.mnsv2 函数之后, 我们就可以测试下刚才的分析是否正确, 把几个需要的函数都复制过来, 试试在浏览器中能否得到加密值。

浏览器环境加密过程测试

下边我们只需要把浏览器中测试的代码, 搬运到我们本地, 补全环境让他得到同样的值就算是完成了。

开整

本地化

本地化调整不大, b64Encode 函数没改, 就是把 md5 函数补了下, 把 encodeUtf8 函数用 nodejs 的简单方式处理了。

本地代码示例

补环境

这一块还是老样子, 两种方法。可以用对象代理自己吐环境一点一点补, 也可以考虑用 AST 做一下还原再开始补, 习惯怎么来就怎么来吧。卡住的话可以选择用 node --inspect 的方式在浏览器上调试, 打一些断点和浏览器环境对比看看, 就不细说了。

javascript 复制代码
// 针对某红书这里特别说明两个问题, 补的时候可以注意下。
- 一是, 这里的检测大多都是用的 globalThis 对象, 可以把原代码的 globalThis 替换成常规的 window 对象, 也可以直接在 globalThis 里边补。
- 二是, 不需要全补, 能在全局里拿到 window.mnsv2 函数就行了。后续有报错的话加个 try catch 过了就行。

请求

请求部分还是 Python , 和之前一样配合 execjs 库获取加密内容, 这里做个简单的流程演示, 没什么可说的。

Python 部分示例

请求结果示例

总结

某红书的环境检测还挺多的(起码比某音多), 多补多测。

另外, ob 混淆部分也推荐用 AST 还原试试。

请洒潘江,各倾陆海云尔。

相关推荐
妮妮喔妮14 小时前
supabase的webhook报错
开发语言·前端·javascript
qq_120840937114 小时前
Three.js 大场景分块加载实战:从全量渲染到可视集调度
开发语言·javascript·数码相机
漂流瓶jz16 小时前
运行时vs编译时:CSS in JS四种主流方案介绍和对比
前端·javascript·css
钮钴禄·爱因斯晨16 小时前
他到底喜欢我吗?赛博塔罗Java+前端实现,一键解答!
java·开发语言·前端·javascript·css·html
Watermelo61716 小时前
理解 JavaScript 中的“ / ”:路径、资源与目录、nginx配置、请求、转义的那些事
前端·javascript·vue.js·chrome·nginx·正则表达式·seo
Hello--_--World17 小时前
JS:this指向、bind、call、apply、知识点与相关面试题
开发语言·javascript·ecmascript
jserTang17 小时前
手撕 Claude Code-4: TodoWrite 与任务系统
前端·javascript·后端
腹黑天蝎座17 小时前
大屏开发必读:Scale/VW/Rem/流式/断点/混合方案全解析(附完整demo)
前端·javascript
jserTang17 小时前
手撕 Claude Code-5:Subagent 与 Agent Teams
前端·javascript·后端
于慨18 小时前
mac安装flutter
javascript·flutter·macos