Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >webmsxyw x-s分析

webmsxyw x-s分析

作者头像
李玺
发布于 2023-05-23 06:37:01
发布于 2023-05-23 06:37:01
1.7K00
代码可运行
举报
文章被收录于专栏:爬虫逆向案例爬虫逆向案例
运行总次数:0
代码可运行

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

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

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

危!

X-s

还是先找x-s。全局搜关键词"X-s"

c = (a || void 0 !== window._webmsxyw ? window._webmsxyw : sign)(u, i) || {};

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
(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 字符的逻辑。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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类型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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,修改为对象就能解决问题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
window._webmsxyw("/api/sns/web/v1/feed",{"source_note_id":"62d4e8a800000000120019dd"})

改完发现还是不能用。。。继续调试,重新检查,结果发现本地x2和浏览器不一样,应该是有环境没补上,省时间就直接写死吧。

判断后赋值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023/05/21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【操作系统】操作系统运行环境——处理器的运行模式
在上一篇内容中我们介绍了操作系统的发展史,操作系统从诞生到发展主要经历了手工操作阶段、批处理阶段、分时操作系统阶段、实时操作系统阶段、网络操作系统和分布式计算机系统阶段以及个人计算机操作系统这6个阶段。我们可以将其归纳为以下4个阶段:
蒙奇D索隆
2024/09/07
3510
【操作系统】操作系统运行环境——处理器的运行模式
​五分钟扫盲:进程与线程基础必知
进程(Process)和线程(Thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握。以下这个解释出自阮一峰老师的博客(http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html),虽然「不是非常严谨,但是足够形象」,看完之后能对进程和线程有个非常直观的印象,这样也方便理解后文。
飞天小牛肉
2021/02/26
3930
​五分钟扫盲:进程与线程基础必知
操作系统习题知识点
操作系统有硬件和软件组成,硬件是CPUC软件建立与活动的基础,而软件是对硬件功能的扩充。硬件包括CPU、内存、I/O设备和总线等,软件通常分为应用软件、支撑软件和系统软件。
kif
2023/02/27
1.9K0
操作系统习题知识点
操作系统学习笔记-进程描述和控制
进程控制块包含了充分的信息,这样就可以中断一个进程的执行,并且在后来恢复执行进程时就好像进程未被中断过。进程控制块是操作系统能够支持多进程和提供多处理的关键工具。当进程被中断时,操作系统会把程序计数器和处理器寄存器(上下文数据)保存到进程控制块中的相应位置,进程状态也被改变为其他的值(例如阻塞状态或就绪状态)。
花猪
2022/02/16
8230
操作系统学习笔记-进程描述和控制
[每天五分钟,备战架构师-2]操作系统基本原理
操作系统是管理和控制计算机硬件和软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件。注意,这里说的裸机可以是物理机,也可以是虚拟机。随着技术的发展,现在还出现了Docker容器技术,一个Docker容器实际上不一定需要具备完整的系统功能也能够运行程序,其底层是通过宿主机的内核来与硬件进行交互的。
大江小浪
2018/09/19
5300
[每天五分钟,备战架构师-2]操作系统基本原理
开发成长之路(21)-- 不可不知的操作系统知识(1)
最下面是硬件系统;最上面是使用计算机的人,即各种各样的用户;人与硬件系统之间是软件系统。系统软件是最靠近硬件的一层,其次是支撑软件和应用软件。
看、未来
2021/09/18
4730
操作系统 - 进程
系统为每一个运行的程序配置一个数据结构,称为进程控制块(PCB),用来描述进程的各种信息(如程序代码存放位置)
ppxai
2020/09/23
9230
操作系统 - 进程
《Linux操作系统编程》第二章 进程运行与调度: 了解进程的定义与特征、进程的状态与切换、进程管理的数据结构、进程的创建与终止、阻塞与唤醒、挂起与激活以及处理机调度的相关概念
要求学生了解进程的定义与特征、进程的状态与切换、进程管理的数据结构、进程的创建与终止、阻塞与唤醒、挂起与激活以及处理机调度的相关概念。
猫头虎
2024/04/08
4250
《Linux操作系统编程》第二章 进程运行与调度: 了解进程的定义与特征、进程的状态与切换、进程管理的数据结构、进程的创建与终止、阻塞与唤醒、挂起与激活以及处理机调度的相关概念
操作系统知识清单
1、存储器在CPU外,一般指硬盘,U盘等可以在切断电源后保存资料的设备,容量一般比较大,缺点是读写速度都很慢,普通的机械硬盘读写速度一般是50MB/S左右。
zhangjiqun
2024/12/16
680
操作系统知识梳理共9次缺页
第一章:概述 什么是操作系统? 是一段一直运行在计算机上的程序 是资源的分配者 向上管理软件向下管理硬件 为用户提供良好接口 中断的概念? 中断指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。 中断向量的概念? 各种设备的中断处理子程序的地址数组 什么是系统调用? 由操作系统实现提供的所有系统调用所构成的集合即(Application Programming Interface,API)。是应用程序同系统之间的接口。 内存是什么? 内存是处理器可以直接访问的唯一的大容量存储区
张俊怡
2018/04/24
8980
操作系统笔记-进/线程模型
进程表(process table),也称进程控制块(PCB),是由操作系统维护的,每个进程占用其中一个表项。该表项包含了操作系统对进程进行描述和控制的全部信息,从而保证该进程换出后再次启动时,就像从未中断过一样。
Cloud-Cloudys
2020/07/25
5570
关于操作系统的一些事,这些你应该要知道~
操作系统的运行机制 计算机系统中,通常CPU执行两种不同性质的程序:一种是操作系统内核程序;另一种是用户自编程序或系统外层的应用程序。对操作系统而言,这两种程序的作用不同,前者是后者的管理者,因此“管理程序”要执行一些特权指令,而“被管理程序”出于安全考虑不能执行这些指令。所谓特权指令,是指计算机中不允许用户直接使用的指令,如I/O指令、 置中断指令,存取用于内存保护的寄存器、送程序状态字到程序状态字寄存器等指令。操作系统在具体实现上划分了用户态(目态)和核心态(管态),以严格区分两类程序。 现代计算机几
谭庆波
2018/08/10
4350
关于操作系统的一些事,这些你应该要知道~
操作系统知识点整理
书《计算机操作系统》第四版(汤小丹编著) 课程操作系统 操作系统启动流程略了 md和pdf下载:Chasssser 完整版包括收集的题目 以下仅为知识点
Enterprise_
2019/02/20
1.2K0
你该懂得操作系统知识—内核态和用户态
现代操作系统一般将 OS 划分非若干层次,再将 OS 的不同功能分别设置在不同的层次中。通常将一些与硬件紧密相关的模块(如中断处理程序等)、各种常用设备的驱动程序以及运行频率较高的模块(如时钟管理、进程调度和许多模块所公用的一些基本操作),都安排在紧靠硬件的软件层次中,将它们常驻内存,即通常所称为的OS 内核。这种安排方式的目的在于两个方面:
早安嵩骏
2020/08/11
1.8K0
操作系统笔记-进程
由于某些硬件或操作是需要操作系统进行调用的,保证安全所以防止用户直接进行操作,而当用户要操作的只有操作系统能够调用的操作的时候,此时需要通知操作系统,而此时则是产生中断,中断实际上就是设置中断寄存器的标识位,cpu会在每个指令后检查其中断寄存器是否发生中断,如果发生则需要执行对应的中断程序。
大猫的Java笔记
2023/03/08
5970
操作系统笔记-进程
操作系统笔记【进程管理及控制
顺序执行:单道批处理的执行方式,也用于简单的单片机系统,具有独立功能的程序独占cpu直到得到最终结果的过程
BWH_Steven
2020/05/09
9570
操作系统之进程管理(上),研究再多高并发,都不如啃一下操作系统进程!!!
由图可知程序会先由编译器编译成机器指令,运行之前先把程序放入内存,在内存中创建一个进程实体。一个进程实体(进程映像)由PCB、程序段、数据段组成。然后CPU从内存中取出指令,来运行程序。
阿甘的码路
2022/09/22
4890
操作系统之进程管理(上),研究再多高并发,都不如啃一下操作系统进程!!!
大学课程 | 计算机操作系统
(3) 模块接口法的优缺点: 优点: ①提高OS设计的正确性,可理解性,可维护性 ②增强OS的可适应性 ③加速OS的开发过程 缺点: ①接口很难满足实际需求 ②无序模块法,无法寻找一个可靠的决定顺序
Justlovesmile
2021/12/14
9340
大学课程 | 计算机操作系统
《计算机操作系统-第三章》之中断与系统调用
早期的计算机虽然对程序的处理是成批进行的,但是内存中始终只能处理一个程序,而CPU的处理速度是非常的快的,当CPU运行期间向IO设备发送输入或者输出请求时,高度运转的CPU需要等待龟速的IO完成状态。为了提高资源利用率,人们就发明了操作系统,引入了中断机制,实现了多道程序技术。
用户10517932
2023/10/07
4700
《计算机操作系统-第三章》之中断与系统调用
『操作系统』 进程的描述与控制 Part 1 前驱图与程序执行
一个程序由若干个程序段组成,而这些程序段的执行必须是顺序的,这种程序执行的方式就称为程序的顺序执行。
风骨散人Chiam
2021/09/06
1.3K0
推荐阅读
相关推荐
【操作系统】操作系统运行环境——处理器的运行模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验