某红书 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 还原试试。

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

相关推荐
Mintopia2 小时前
🧠 可解释性AIGC:Web场景下模型决策透明化的技术路径
前端·javascript·aigc
Mintopia2 小时前
⚙️ Next.js 事务与批量操作:让异步的世界井然有序
前端·javascript·全栈
huangyiyi666663 小时前
轮询那些事儿
javascript·前端框架·vue·js
CC码码3 小时前
解决前端多标签页通信:BroadcastChannel
前端·javascript·web
墨鸦_Cormorant3 小时前
Vue 概述以及基本使用
前端·javascript·vue.js
鹏多多3 小时前
使用imaskjs实现js表单输入卡号/日期/货币等掩码的教程
前端·javascript·vue.js
艾小码5 小时前
告别页面呆板!这5个DOM操作技巧让你的网站活起来
前端·javascript
正在学习前端的---小方同学6 小时前
vue-easy-tree树状结构
前端·javascript·vue.js