在《小红薯X-S签名逆向解析(上篇):突破自定义Base64与算法轮廓》中,我们完成了X-S参数的外层加密解析。但上篇文章存在一个关键问题——使用的x3参数为固定值,导致生成的X-S签名无法动态变化。本文将深入分析x3参数的生成逻辑,重点进行x3参数逆向分析,解决动态签名的核心问题。
本文目录
一、定位分析起点
首先需要确定分析的切入点。打开小红薯页面,进入开发者工具,刷新页面后全局搜索XYS_",可以定位到X-S参数的生成位置:
, s = window.mnsv2(c, d)
, f = {
x0: u.i8,
x1: "xhs-pc-web",
x2: window[u.mj] || "PC",
x3: s,
x4: a ? void 0 === a ? "undefined" : (0, h._)(a) : ""
};
return "XYS_" + (0,
分析代码结构可以看出,x3参数的值来自变量s,而s由window.mnsv2(c, d)函数生成。在s = window.mnsv2(c, d)处设置断点,准备深入分析该函数。
二、遭遇混淆与虚拟机保护
在页面进行点赞操作触发断点后,单步进入mnsv2函数,立即遇到代码保护机制:

观察代码环境发现以下特征:
- 变量名被混淆为
_0xf70f4c、_0x4e19c9等无意义字符串 - 逻辑结构被循环和条件语句分割
- 文件名显示为
VM108696,表明在虚拟机环境中执行
在虚拟机内部进行单步调试时发现,代码逻辑过于复杂,难以直接分析算法结构。需要寻找其他分析途径。
三、转换思路:寻找虚拟机加载入口
考虑到虚拟机代码需要从特定源头加载,在浏览器环境中通常通过eval或new Function实现动态执行。回到window.mnsv2所在的源文件,搜索eval关键字:

搜索结果发现signV2Init函数通过eval执行解密后的代码。在该函数的eval调用处设置断点,验证是否为虚拟机加载入口。
四、验证执行链路
刷新页面后,eval断点触发。单步执行进入eval,分别进入VM110043和VM110056两个虚拟机文件。

放行断点后,重新启用window.mnsv2断点。在页面进行点赞操作,断点触发后单步进入,确认进入的是VM110043文件。至此建立完整的执行链路:signV2Init在页面加载时初始化虚拟机,mnsv2调用时执行已加载的虚拟机逻辑。
五、搭建本地执行环境
基于分析结果创建本地执行环境,包括四个核心文件:
VM110043.js– 主虚拟机代码VM110056.js– 依赖的虚拟机代码test.js– 主执行文件env.js– 环境配置文件
将虚拟机代码中的globalThis替换为window以便环境监测。env.js中设置基础环境和代理监测:
function monitorObject(obj, name) {
return new Proxy(obj, {
get(target, property, receiver) {
console.log(`方法: get 对象: ${name} 属性: ${String(property)} 属性类型: ${typeof property} 属性值类型: ${typeof target[property]}`);
return target[property];
},
set(target, property, value, receiver) {
console.log(`方法: set 对象: ${name} 属性: ${String(property)} 属性类型: ${typeof property} 属性值类型: ${typeof value}`);
return Reflect.set(...arguments);
}
});
}
window = monitorObject(globalThis, "window");
window.Buffer = Buffer;
window.addEventListener = function(){};
test.js中设置基础调用逻辑:
require("./env.js")
require("./VM110043.js")
require("./VM110056.js")
console.log('生成x3的值:',window.mnsv2('/api/redcaptcha/v2/getconfig{}','701d7db129f79737abc1c57cc97e69da'));
六、系统化环境补全流程
在VS Code中启用异常捕获功能后运行test.js,开始系统化的环境补全流程。首次运行报错显示缺失window.addEventListener:

方法: get 对象: window 属性: addEventListener 属性类型: string 属性值类型: undefined
在env.js中补全该函数:
window.addEventListener = function() {};
继续运行后报错缺失window.document,继续补全:
window.document = {};
按照报错顺序依次补全缺失的环境,包括:
document及相关DOM方法navigator对象及其属性location、screen等浏览器对象- 其他浏览器特定API
整个过程需要根据代理输出的监测信息,逐个补全所有缺失的浏览器环境,确保虚拟机代码能够在Node.js环境中正常执行。这种浏览器环境补全是逆向工程中的关键技术环节。(文末获取补全环境课件)
七、生成x3参数验证
完成所有环境补全后,运行node test.js成功生成x3参数:

生成的x3参数与浏览器环境中长度完全一致。将该参数代入上篇的X-S生成流程,成功得到可用的动态X-S签名,验证了逆向方案的正确性。
八、技术总结
回顾整个逆向过程,成功攻克了小红薯X-S签名的核心加密层。关键技术要点包括:
- 迂回分析策略:当直接分析虚拟机内部逻辑受阻时,通过寻找加载源头实现突破
- 完整执行链路验证:建立
signV2Init → VM文件加载 → mnsv2调用的完整调用关系 - 系统性环境补全:基于代理监测信息,逐个补全浏览器环境缺失项
至此,结合上篇的X-S外层签名算法,通过完整的x3参数逆向过程,完整掌握了小红薯签名生成技术体系。
九、x3补环境完整课件获取
为方便读者复现整个x3参数逆向过程,本文涉及的完整代码和环境配置已整理为课件包,关注微信公众号孤狼网络科技,回复x3即可获取完整课件包。
本文由林石工作室提供技术支持,转载请注明出处。

