小红薯X-S签名逆向解析(下篇):x3参数逆向与浏览器环境补全

小红薯X-S签名逆向解析(下篇):x3参数逆向与浏览器环境补全

在《小红薯X-S签名逆向解析(上篇):突破自定义Base64与算法轮廓》中,我们完成了X-S参数的外层加密解析。但上篇文章存在一个关键问题——使用的x3参数为固定值,导致生成的X-S签名无法动态变化。本文将深入分析x3参数的生成逻辑,重点进行x3参数逆向分析,解决动态签名的核心问题。

本文目录

  1. 定位分析起点
  2. 遭遇混淆与虚拟机保护
  3. 转换思路:寻找虚拟机加载入口
  4. 验证执行链路
  5. 搭建本地执行环境
  6. 系统化环境补全流程
  7. 生成x3参数验证
  8. 技术总结
  9. 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,而swindow.mnsv2(c, d)函数生成。在s = window.mnsv2(c, d)处设置断点,准备深入分析该函数。

二、遭遇混淆与虚拟机保护

在页面进行点赞操作触发断点后,单步进入mnsv2函数,立即遇到代码保护机制:

进入mnsv2后看到的混淆代码
图1:mnsv2函数内的混淆代码

观察代码环境发现以下特征:

  • 变量名被混淆为_0xf70f4c_0x4e19c9等无意义字符串
  • 逻辑结构被循环和条件语句分割
  • 文件名显示为VM108696,表明在虚拟机环境中执行

在虚拟机内部进行单步调试时发现,代码逻辑过于复杂,难以直接分析算法结构。需要寻找其他分析途径。

三、转换思路:寻找虚拟机加载入口

考虑到虚拟机代码需要从特定源头加载,在浏览器环境中通常通过evalnew Function实现动态执行。回到window.mnsv2所在的源文件,搜索eval关键字:

搜索eval找到加载函数
图2:通过搜索eval找到signV2Init函数

搜索结果发现signV2Init函数通过eval执行解密后的代码。在该函数的eval调用处设置断点,验证是否为虚拟机加载入口。

四、验证执行链路

刷新页面后,eval断点触发。单步执行进入eval,分别进入VM110043VM110056两个虚拟机文件。

通过eval进入虚拟机文件
图3:通过eval单步进入虚拟机文件

放行断点后,重新启用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

vscode调试运行test.js
方法: get   对象: window   属性: addEventListener   属性类型: string   属性值类型: undefined

env.js中补全该函数:

window.addEventListener = function() {};

继续运行后报错缺失window.document,继续补全:

window.document = {};

按照报错顺序依次补全缺失的环境,包括:

  • document及相关DOM方法
  • navigator对象及其属性
  • locationscreen等浏览器对象
  • 其他浏览器特定API

整个过程需要根据代理输出的监测信息,逐个补全所有缺失的浏览器环境,确保虚拟机代码能够在Node.js环境中正常执行。这种浏览器环境补全是逆向工程中的关键技术环节。(文末获取补全环境课件

七、生成x3参数验证

完成所有环境补全后,运行node test.js成功生成x3参数:

x3参数逆向签名生成
图4:x3参数在Node.js中成功生成

生成的x3参数与浏览器环境中长度完全一致。将该参数代入上篇的X-S生成流程,成功得到可用的动态X-S签名,验证了逆向方案的正确性。

八、技术总结

回顾整个逆向过程,成功攻克了小红薯X-S签名的核心加密层。关键技术要点包括:

  • 迂回分析策略:当直接分析虚拟机内部逻辑受阻时,通过寻找加载源头实现突破
  • 完整执行链路验证:建立signV2Init → VM文件加载 → mnsv2调用的完整调用关系
  • 系统性环境补全:基于代理监测信息,逐个补全浏览器环境缺失项

至此,结合上篇的X-S外层签名算法,通过完整的x3参数逆向过程,完整掌握了小红薯签名生成技术体系。

九、x3补环境完整课件获取

为方便读者复现整个x3参数逆向过程,本文涉及的完整代码和环境配置已整理为课件包,关注微信公众号孤狼网络科技,回复x3即可获取完整课件包

本文由林石工作室提供技术支持,转载请注明出处。

Comments

No comments yet. Why don’t you start the discussion?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注