xhs-xs webmsxyw分析

news2025/2/21 20:03:05

近期又更新了,先是改了x-s生成,然后又加上了a1校验。

后面可能会全参校验,比如再加上gid、deviceId、profileData、x-s-common、smidV2之类。

估计以后不能写xhs了,大家且看且珍惜吧。之前相关的文章都被下架了

危!


文章目录

    • X-s
    • window._webmsxyw
      • Shanks
      • decode
      • _garp_dc33b
    • 补环境
    • X-s生成流程
    • 备注


X-s

还是先找x-s。全局搜关键词"X-s"
在这里插入图片描述
c = (a || void 0 !== window._webmsxyw ? window._webmsxyw : sign)(u, i) || {};

if a:
    return a
elif "window._webmsxyw" in globals() and window._webmsxyw is not None:
    return window._webmsxyw
else:
    return sign

在这里插入图片描述

可发现feed接口没走sign,走的方法是在 window._webmsxyw = _garp_dc33b

在这里插入图片描述
可以测试下把 window._webmsxyw置为null是否能正常返回。
在这里插入图片描述


window._webmsxyw

跳转过去能发现代码混淆过了,并且自执行了,不便阅读。

Shanks

先看外部Shanks。

(function() {
    function Shanks() {
        var _garp_d6c76 = 2147483647
          , _garp_a0c6d = 1
          , _garp_33d28 = 0
          , _garp_cb56b = !!_garp_a0c6d
          , _garp_35e13 = !!_garp_33d28;
        return function(_garp_d3e7c, _garp_d0ad1, _garp_8d381){}
        ;
    }
    ;Shanks()(window, {});
}
)();

这段代码定义了Shanks函数,定义了一个闭包,返回一个匿名函数,并使用立即执行函数将其调用。
在调用Shanks函数时,它接受两个参数,分别是window和对象{}。


decode

不难看出 decode 是一段实现了 Base64 解码的方法,包括了将 Base64 编码的字符串解码为正常字符串的逻辑,以及处理 Unicode 字符的逻辑。

var decode = function(j) {
    if (!j) {
        return ""
    }
    var n = function(e) {
        var f = []
          , t = e.length;
        var u = 0;
        for (var u = 0; u < t; u++) {
            var w = e.charCodeAt(u);
            if (((w >> 7) & 255) == 0) {
                f.push(e.charAt(u))
            } else {
                if (((w >> 5) & 255) == 6) {
                    var b = e.charCodeAt(++u);
                    var a = (w & 31) << 6;
                    var c = b & 63;
                    var v = a | c;
                    f.push(String.fromCharCode(v))
                } else {
                    if (((w >> 4) & 255) == 14) {
                        var b = e.charCodeAt(++u);
                        var d = e.charCodeAt(++u);
                        var a = (w << 4) | ((b >> 2) & 15);
                        var c = ((b & 3) << 6) | (d & 63);
                        var v = ((a & 255) << 8) | c;
                        f.push(String.fromCharCode(v))
                    }
                }
            }
        }
        return f.join("")
    };
    var k = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("");
    var p = j.length;
    var l = 0;
    var m = [];
    while (l < p) {
        var s = k.indexOf(j.charAt(l++));
        var r = k.indexOf(j.charAt(l++));
        var q = k.indexOf(j.charAt(l++));
        var o = k.indexOf(j.charAt(l++));
        var i = (s << 2) | (r >> 4);
        var h = ((r & 15) << 4) | (q >> 2);
        var g = ((q & 3) << 6) | o;
        m.push(String.fromCharCode(i));
        if (q != 64) {
            m.push(String.fromCharCode(h))
        }
        if (o != 64) {
            m.push(String.fromCharCode(g))
        }
    }
    return n(m.join(""))

_garp_dc33b

简单调了一下,大面积的自增运算,让人看不下去。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


补环境

直接把上面代码copy到本地先补环境看看,看日志要补的东西挺多,具体怎么用的没细看。(后面没用的我会删掉)

RegExp、Math、indexedDB、eval、localStorage、isNaN、unescape、Array、Function、setInterval、encodeURIComponent、decodeURIComponent、CanvasRenderingContext2D、HTMLCanvasElement、navigator、location、String、Date、Object、screen、document、

还有追加的 openDatabase、devicePixelRatio、AudioContext、webkitAudioContext、setInterval、getAttribute、xhsFingerprintV3

主要都是window对象的方法和属性,有两处报错的地方,补好后try-catch一下。
在这里插入图片描述

另外输出中还看到了process,先不管这个。

等到报错:
在这里插入图片描述
补到这里就快了。

在这里插入图片描述

还是catch下,把_webmsxyw给到window上。

在这里插入图片描述

这里补好就可以生成了。
在这里插入图片描述
但是发现本地生成的和浏览器的差了很多位数,调试发现是由于cookie中没有xsecappid和a1参数。

把cookie加上后发现还是少了24位,再检查下发现本地生成的x-s中没有加 “signVersion”:“1” 。

signVersion追加在localStorage中,默认是1。
在这里插入图片描述

简单一点,可以做类型判断然后给上值,注意signVersion的值是string类型。

 if (_garp_a3d40 && typeof _garp_a3d40==="object" && _garp_a3d40.hasOwnProperty('signVersion')){
     _garp_a3d40["signVersion"] = "1"
 }

现在生成的位数就一致了,但是测了下还是不可用。


X-s生成流程

继续调试分析,看流程是先去生成X1,然后构建payload。
payload由x1、x2、x3、x4组成。x1是api+formdata md5生成的,x2固定,x3是a1,x4是时间戳。
在这里插入图片描述
拼接为:x1=72ff6a81a0474a774ad1db6681c9614a;x2=0|0|0|1|0|0|1|0|0|1|1|0|0|0|0;x3=188392ccdbbk41ajfrbba1ngli7wcccg88o04w12v50000303000;x4=1684603371781;

然后做一些编码和加密生成密文payload,payload生成后再跟几个参数拼起来。

在这里插入图片描述

拼接完进行base64编码,然后和XYW_拼起来生成了最终的X-s。

在这里插入图片描述

流程并不复杂,现在需要找到本地生成不可用的原因,排除了请求报文和生成环境的可能后,需要从payload加密的位置入手。

前面已经看了x2固定,x3是a1,x4是时间戳。大概率问题在x1上面。确定下md5结果是否和浏览器一样。

在这里插入图片描述

控制台覆盖JS文件,然后查看输出。

在这里插入图片描述

一看不太对,feed接口在本地的x1是7开头的,控制台x1是1开头的。

本地 Nodejs 和浏览器的 MD5 算法结果是相同的,那说明本地md5前的参数不对。

本地x1一直是72ff6a81a0474a774ad1db6681c96,浏览器是会根据不同作品ID变化的。

调试发现,本地x1参数生成时没有加formdata。
在这里插入图片描述
确认原因发现是我在调用的时候传了string类型的formdata,修改为对象就能解决问题。

window._webmsxyw("/api/sns/web/v1/feed",{"source_note_id":"62d4e8a800000000120019dd"})

在这里插入图片描述

改完发现还是不能用。。。继续调试,重新检查,结果发现本地x2和浏览器不一样,应该是有环境没补上,省时间就直接写死吧。
在这里插入图片描述
判断后赋值。

   if (_garp_a3d40 && Array.isArray(_garp_a3d40)){
         const lastElement = _garp_a3d40[_garp_a3d40.length - 3];
            if (typeof lastElement === "object" &&  lastElement.hasOwnProperty("key")&& lastElement.key === "x2") {
               _garp_a3d40[_garp_a3d40.length - 3].value = '0|0|0|1|0|0|1|0|0|0|1|0|0|0|0'
            }
  }

然后再将时间戳固定后,生成的x-s和浏览器一致。
在这里插入图片描述


有插件检测和一些hook检测。注意还有个 crawler-spam ,用的异常点检测,影响调试。

在这里插入图片描述

如果断到这部分直接跳过,重试吧。

在这里插入图片描述


备注

注意请求时的a1要和xs生成时的a1一致,然后注意formdata参数格式的问题。

大家加油, 本文内容建立在feed接口上,gid和web_session注册不再说了,其他接口自行修改。

有问题欢迎留言,估计文章过几天又被下架了 。


另外,祝更新签名的你也好,O.o
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/551506.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言扫雷小游戏

扫雷小游戏 一&#xff0c;扫雷游戏的理解和整体思路1. 扫雷游戏的玩法2.写扫雷小游戏的整体思路 二&#xff0c;函数功能的实现模块1.宏定义2.打印菜单3.初始化雷盘4.打印雷盘5.布置雷6.玩家排雷6.1 显示该坐标有几个雷的函数6.2雷盘展开函数的实现 三.最终扫雷游戏的的实现1.…

AI绘画Stable Diffusion安装、使用教程 整合包下载

安装Stable Diffusion webui 效果图&#xff1a; 1.准备工作 在下载 AI 绘画工具前&#xff0c;电脑上需要提前下载一些运行的环境 1.下载python、git 首先本地机器最好是英伟达的 N 卡&#xff0c;并且至少需要 4GB 显存才能在本地运行&#xff0c;当然&#xff0c;A 卡也是…

微服务开发系列——第一篇:项目搭建(保姆级教程)

总概 A、技术栈 开发语言&#xff1a;Java 1.8数据库&#xff1a;MySQL、Redis、MongoDB、Elasticsearch微服务框架&#xff1a;Spring Cloud Alibaba微服务网关&#xff1a;Spring Cloud Gateway服务注册和配置中心&#xff1a;Nacos分布式事务&#xff1a;Seata链路追踪框架…

【CH32】| 00——开发环境搭建 | 软件安装 | 资料及工具下载

系列文章目录 TODO 文章目录 1. 简介2. 下载软件3. 安装4. 资料及工具下载4.1 芯片数据手册/参考手册4.2 评估(开发)板原理图/demo4.3 烧录软件4.3.1 isp串口一键下载4.3.2 WCH-LINK Utility烧录 4.4 WCH LINK相关资料/驱动安装4.4.1 WCH LINK相关资料4.4.2 WCH LINK驱动安装 5…

摆摊卖网红气球怎么样?

本章主要介绍一下最近网红气球&#xff1a; 最近看到很多摆摊的抖音视频&#xff0c;都在说卖气球很好&#xff0c;成本低&#xff0c;收益高&#xff0c;所以调研了一下&#xff0c;网红气球分好几种&#xff1a; a,飘空气球&#xff1b; b.手持网红气球 c.青蛙 首先介绍飘空…

初始python

初始python 缘由 ​ 对于python&#xff0c;相比大家并不陌生&#xff0c;Python是一种高级的、解释性编程语言&#xff0c;它具有简洁的语法和强大的内置函数&#xff0c;适用于广泛的应用领域&#xff0c;例如运维,Web开发&#xff0c;数据科学&#xff0c;人工智能等。Pyt…

JVM基础学习---1、JVM总体机制、类加载机制

1、JVM总体机制 1.1 JVM概念 JVM&#xff1a;Java Virtual Machine&#xff0c;翻译过来是Java虚拟机。 JRE&#xff1a;Java Runtime Environment&#xff0c;翻译过来是Java运行时环境。 JDK&#xff1a;Java Development Ki JDK&#xff1a;Java Development Kits&#…

Mysql字符集

1、修改MySQL5.7字符集 我们在新建数据库时&#xff08;Navicat&#xff09;界面时会遇到这两个选项&#xff0c;字符集和排序规则 在MySQL 8.0版本之前&#xff0c;MySQL 5.7 默认的客户端和服务器都用了 latin1 &#xff0c;而latin1是不包含中文的&#xff0c;所以保存中文…

MetersPhere 试用

1. 功能测试 1.1 用例管理 脑图管理 样式&#xff1a; 脑图用例导入 1.2 用例评审 1.2.1 发起用例评审 1.2.2 关联用例&#xff1a; 1.2.3 用例评审 2. 接口测试 2.1 接口定义 类似postman、foxapi等主流接口管理页面 2.2 用例配置&#xff1a; 需要在meterphere安装节点…

路径规划算法:基于人工蜂群算法的路径规划算法- 附代码

路径规划算法&#xff1a;基于人工蜂群的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于人工蜂群的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法人工…

C++ [STL之vector的使用]

本文已收录至《C语言和高级数据结构》专栏&#xff01; 作者&#xff1a;ARMCSKGT STL之vector的使用 前言正文默认成员函数普通构造拷贝构造析构函数赋值重载 迭代器正向迭代器反向迭代器const迭代器 容量类空间容量查询空间容量操作扩容操作元素数量操作缩容操作 数据访问下标…

numpy log随机产生非常奇怪的数字(np.log的大坑)

背景 有一批信号数据要送到网络里训练&#xff0c;训练之前为了统一量纲&#xff0c;首先根据方差和均值做了一次标准化&#xff0c;然后求了一次能量&#xff08;20*log10(x)&#xff09;&#xff0c;也就是说送进网络里的其实是一个能量谱&#xff0c;但是训练过程中经常蹦出…

Python的用途与学习计划

python的用途&#xff1a; 1、web开发&#xff1b; 2、网络爬虫&#xff1b; 3、数据科学&#xff1b; 4、自动化运维&#xff1b; 5、数据库编程&#xff1b; 6、网络编程&#xff1b; 7、图形处理、数学处理、文本处理&#xff1b; 8、多媒体应用。 其中&#xff0c…

组合问题-回溯算法

1题目 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] 示例 2&#xff1a; 输入&#xff1a;n …

美国国际留学生超136万,本科、硕士和博士各占多少?

国际教育市场研究机构ICEF Monitor近日公布&#xff0c;2022年美国持有F-1和M-1有效学习签证的国际学生数量共计136.2万人&#xff0c;与2021年相比增长了10.1%。 其中&#xff0c;国际学生来美国读本科学士学位的占37%&#xff0c;读硕士学位的占41%&#xff0c;读博士学位的…

为什么WordPress这么难用?(以及如何让它变得简单点)

WordPress 是世界上最受欢迎的网站构建器&#xff0c;为互联网上超过 43% 的网站提供支持。然而&#xff0c;有些人抱怨说 WordPress 比 Squarespace 和 Wix 等解决方案更难使用。 在本文中&#xff0c;我们将解决为何WordPress这么难用的神话&#xff0c;并分享您可以用来毫无…

用于具有缺失模态的脑肿瘤分割的模态自适应特征交互

文章目录 Modality-Adaptive Feature Interaction for Brain Tumor Segmentation with Missing Modalities摘要本文方法Modality-Adaptive Feature InteractionGraph RepresentationGraph Edge ComputationModality Feature Updating 实验结果 Modality-Adaptive Feature Inter…

OpenCV入门-基于Python

图像入门 1. 创建窗口namedWindow()resizeWindow()destroyAllWindow() 2.显示图像imread()imshow()imwrite()waitKey()flip() 代码演示3.显示视频VideoCapure()对象cap.get()cap.isOpened()cap.read()cap.release() 部分功能代码演示VideoWriter()对象VideoWriter_fourcc()writ…

K8s之Pod生命周期、启动停止钩子

文章目录 一、Pod生命周期流程二、初始化容器-initContainers三、主容器操作-containers1、启动钩子-lifecycle.postStart2、停止钩子-lifecycle.preStop 一、Pod生命周期流程 Pod生命周期整个过程 如下图&#xff1a; 1、在启动任何容器之前&#xff0c;前创建 pause 容器&am…

u-boot移植:详细讲解移植u-boot.2022.10版本到imx6ull开发板

目录 一、u-boot编译环境准备 1.安装交叉编译工具链 2.u-boot源码包下载 3.编译 4.安装依赖库 二、U-Boot中添加自己的开发板 1、添加开发板默认配置文件 2、添加开发板对应的头文件 3、添加开发板对应的板级文件夹 4、修改 arch/arm/mach-imx/mx6/Kconfig 5、其他需…