WEB逆向—X-Bogus逆向分析(纯算+补环境)

声明

本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!

前言

此平台 本人 仅限研究。只针对某些算法参数进行研究。网站链接自己去找。

流程分析

这里就不多说了

直接看接口。发现有两个字需要我们逆向

msToken:

X-Bogus:

msToken

这里msToken 跟断点走。往上追栈后发现是直接读取的cookie里的。然后看了一下。然后测试了一下 这个有点像每次请求的token令牌。

这个应该可以模拟生成的。

 

不重要 暂时写死都行。这里也提供一份代码。

1

2

3

4

5

6

7

8

9

10

11

12

13

import random

def get_ms_token(randomlength=107):

    """

    根据传入长度产生随机字符串

    """

    random_str = ''

    base_str = 'ABCDEFGHIGKLMNOPQRSTUVWXYZabcdefghigklmnopqrstuvwxyz0123456789='

    length = len(base_str) - 1

    for in range(randomlength):

        random_str += base_str[random.randint(0, length)]

    return random_str

xb

这里话也不多说了。

直接讲流程。

首先 如下图所示

然后跳到断点之后往上找断点。

到达如图所示位置之后

 

这个apply啥意思就不多说了 直接插桩

1

_0x2458f0['apply'](_0xc26b5e, _0x1f1790)==28(xb的长度)

然后 单点调试下一步 ok 到达了一个JSVMP的方法。然后传的值都是字节码 然后把这些汇编代码转换为JS代码 

这里就考虑两种方法了。要不插桩纯算。要不补环境。

补环境

先说补环境。

直接全扣下来。

然后在下图位置赋值。

然后著名语录: 缺啥补啥。

这里已经补完了 就这么点。

1

2

3

4

5

6

window = global

document = {}

document.addEventListener = function () {}

navigator = {

    "userAgent"'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.366'

}

然后直接得到答案

至于这个警告。是一个弃用警告。代表这个Buffer这个方法已经不用了。可以通过修改代码

然后看看传参是什么

 

然后给他封装成参数去调用就可以了。

算法

这里我们看到这个文件里其实是经过混淆的 非常不利于我们分析加密参数。

所以我们需要使用到ast等工具对他进行解混淆。

然后通过解混淆完了的JS 进行文件重写覆盖。

这里简单讲讲流程。

 选择替换内容。浏览器会自动帮我们把js保存到替换的文件夹中。非常方便。

然后就能看到我们的文件了。然后复制文件。到v-tools中 

 然后继续往上找栈。发现下图就是JSVMP初始化的地方。并且通过执行了W方法 最终获得返回值。

我们这里就直接进入文中这个W方法。

这里进去看可以看到一堆的流程控制语句。

把这个方法复制下来。可以看到。这个方法的走向就是靠判断语句执行的。然后判断语句中又有一堆的流程控制语句。

而且这个判断条件也是由传参的最后一个参数控制的。那这个就很有意思了。

里在这两短流程语句中分别打上日志断点。然后来分析其中的参数。

第一处断点

1

"1""j>>>", j, "A>>>>", A, "O>>>>>", JSON.stringify(O, function(key, value) {if (value == window) {return undefined} return value})

 

第二处断点

1

"2","j>>>", j, "A>>>>", A, "O>>>>>", JSON.stringify(O, function(key, value) {if (value == window) {return undefined} return value})

 

这里一定要注意debugger不要乱删 不然很容易卡死 。打出来的数据非常之大。

如下图。把所有的日志断点保存 然后往上找第一个X-Bogus 生成的地方。

 可以看到 如下图所示。是赋值 值给 X-Bogus的地方。那我们去搜索这个值

 

这里就可以看到 。越往上 这个X-Bogus的值就越少。那我们大概就明白了。

这就意味着xb是一个字一个字的根据算法生成。

这里在浏览器看 不是很方便。我们把控制台另存为到文件中方便我们调试。

(这里浏览器卡死了。xb的值可能不固定,不要在意细节)

首先分析下这个3 是如何生成的。

 

1

2 j>>> 16 A>>>> 716 O>>>>> [null,[null,{},null,null,"\u0002ÿ-%.*¯Ë^9õ²\u000b&7\u0012","s2","=",{"s0":"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=","s1":"Dkdpgh4ZKsQB80/Mfvw36XI1R25+WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=","s2":"Dkdpgh4ZKsQB80/Mfvw36XI1R25-WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe="},"Dkdpgh4ZKsQB80/Mfvw36XI1R25-WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=","DFSzswVOPSzANro1t-KBsNAwgYo",1214867,21],"DFSzswVOPSzANro1t-KBsNAwgYo","3","Dkdpgh4ZKsQB80/Mfvw36XI1R25-WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=",[19],63,21]

也就是代表 要通过 上面这些值 拿到 3

我们打个条件断点。去看看最后一个的生成逻辑

 

打断点继续往下走。

这里注意 要注意我们的O 里是否会有 如上值。如下图 才能正确单步调试。

 

我们的xb值为 DFSzswVOPSzANro1t-KBsNAwgYo3

由于我们目标是获得数值3。 用以下代码可以做到

1

2

"Dkdpgh4ZKsQB80/Mfvw36XI1R25-WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=".charAt(19)

>> 3

同理 获得倒数第二位。继续看我们的日志

这里是 o,38位

根据断点可知 xb4个为一组。

charAt后面的值就是我们所需要的值。

这里 就不废话太多了

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

str1 = "Dkdpgh4ZKsQB80/Mfvw36XI1R25-WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe="

// 19 = (1214867 & 63) >> 0

str1.charAt((1214867 & 63) >> 0)

//结果:3

// 38 = (1214867 & 4032) >> 6

str1.charAt((1214867 & 4032) >> 6)

// 结果:o

// 40 = (1214867 & 258048) >> 12

str1.charAt((1214867 & 258048) >> 12)

// 结果:Y

// 4 = (1214867 & 16515072) >> 18

str1.charAt((1214867 & 16515072) >> 18)

// 结果:g

上述刚好对应了 xb的最后四位

DFSz swVO PSzA Nro1t-KB sNAw gYo3

其余算法也一样。

数字算法逻辑

现在唯一可能要注意的就是这个1214867的算法是什么?

这里篇幅原因不展开搞了。反正概念都是一样。根据索引找方法。


这里 1214867 是通过位运算符的 1214720 | 147 最终得到1214867

 

 

这里又牵扯到了 两个值

  • 1214720

    • 通过位运算 1179648 | 35072 移位得到1214720 那又有两个值出现了
      • 1179648 通过 18<< 16 左移得来 (这里16为定值)

 

 137 通过乱码charCodeAt得来 

image-20240330000412236

    • 而147 则是通过 乱码 charCodeAt 获取到的

有点乱 梳理一下

  1. 通过 乱码 charCodeAt(20)获得147
  2. 通过 乱码 charCodeAt(19)获得137
  3. 通过 乱码 charCodeAt(18)获得18
  4. 通过147 << 0 获得了 147(找规律得来)
  5. 通过 137 << 8 获得 35072
  6. 通过 18<< 16 获得 1179648
  7. 通过位运算 1179648 | 35072 获得1214720
  8. 位运算符的 1214720 | 147 最终得到1214867

那这个只是最后一组的。根据这四组 找规律 获取其他组的信息可得以下代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

const encodedString = "\u0002ÿ-%.*¯Ë^9õ²\u000b&7\u0012";

const decodingMap = "Dkdpgh4ZKsQB80/Mfvw36XI1R25-WUAlEi7NLboqYTOPuzmFjJnryx9HVGcaStCe=";

let xb = "";

for (let index = 0; index <= 20; index += 3) {

    const charCode1 = encodedString.charCodeAt(index);

    const charCode2 = encodedString.charCodeAt(index + 1);

    const charCode3 = encodedString.charCodeAt(index + 2);

    const combinedCode = charCode3 | (charCode2 << 8) | (charCode1 << 16);

    const codePart1 = (combinedCode & 16515072) >> 18;

    const codePart2 = (combinedCode & 258048) >> 12;

    const codePart3 = (combinedCode & 4032) >> 6;

    const codePart4 = combinedCode & 63;

    xb += decodingMap[codePart1] + decodingMap[codePart2] + decodingMap[codePart3] + decodingMap[codePart4];

}

console.log(xb);

乱码生成分析

然后就是获取这个乱码的生成处了。可以看到 如下图所示。

 

 

如上图所示。这个b的生成还是没有还原出来。我们继续来找b。

下图 是生成b的地方。所以我们把这个函数也扣下来。

 

事实证明和上文一样。没问题。

部分代码如下

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

function _0x86cb82(a) {

    return String.fromCharCode(a);

}

function _0x94582(a, b, c) {

    return _0x86cb82(a) + _0x86cb82(b) + c;

}

function _0x25788b(a, b) {

    for (var c, e = [], d = 0, t = "", f = 0; f < 256; f++) {

        e[f] = f;

    }

    for (var r = 0; r < 256; r++) {

        d = (d + e[r] + a.charCodeAt(r % a.length)) % 256, c = e[r], e[r] = e[d], e[d] = c;

    }

    var n = 0;

    d = 0;

    for (var o = 0; o < b.length; o++) {

        d = (d + e[n = (n + 1) % 256]) % 256, c = e[n], e[n] = e[d], e[d] = c, t += String.fromCharCode(b.charCodeAt(o) ^ e[(e[n] + e[d]) % 256]);

    }

    return t;

}

function _0x398111(a, b, c, e, d, t, f, r, n, o, i, _, x, u, s, l, v, h, p) {

    var y = new Uint8Array(19);

    return y[0] = a, y[1] = i, y[2] = b, y[3] = _, y[4] = c, y[5] = x, y[6] = e, y[7] = u,

        y[8] = d, y[9] = s, y[10] = t, y[11] = l, y[12] = f, y[13] = v, y[14] = r, y[15] = h,

        y[16] = n, y[17] = p, y[18] = o, String.fromCharCode.apply(null, y);

};

这个已经弄完了。还差最后一个就是这个数组。arr其实 不是一个完整的数组,而是一个个数字。

arr 共有19位。

这里说下大概。我也没有每个都去研究。

前4位是固定值

第5位到第10位通过md5 hex_md5 以及转码得到数组 然后切片取其中的值。

第11位到第18位是通过时间戳还有个canvas固定值拼接而来。

最后一位通过前面的签名最终得到最后一位数组

最后通过19位 数字 然后编码得到乱码。

最终结果

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习之视觉特征提取器——VGG系列

VGG 提出论文&#xff1a;1409.1556.pdf (arxiv.org) 引入 距离VGG网络的提出已经约十年&#xff0c;很难想象在深度学习高速发展的今天&#xff0c;一个模型能够历经十年而不衰。虽然如今已经有VGG的大量替代品&#xff0c;但是笔者研究的一些领域仍然有大量工作选择使用VG…

Web前端安全问题分类综合以及XSS、CSRF、SQL注入、DoS/DDoS攻击、会话劫持、点击劫持等详解,增强生产安全意识

前端安全问题是指发生在浏览器、单页面应用、Web页面等前端环境中的各类安全隐患。Web前端作为与用户直接交互的界面&#xff0c;其安全性问题直接关系到用户体验和数据安全。近年来&#xff0c;随着前端技术的快速发展&#xff0c;Web前端安全问题也日益凸显。因此&#xff0c…

SQLite导出数据库至sql文件

SQLite是一款实现了自包含、无服务器、零配置、事务性SQL数据库引擎的软件库。SQLite是世界上部署最广泛的SQL数据库引擎。 SQLite 是非常小的&#xff0c;是轻量级的&#xff0c;完全配置时小于 400KiB&#xff0c;省略可选功能配置时小于250KiB。 SQLite 源代码不受版权限制。…

Visual Studio Code基础:打开一个编辑器(文件)时,覆盖了原编辑器

相关阅读 VS codehttps://blog.csdn.net/weixin_45791458/category_12658212.html?spm1001.2014.3001.5482 在使用vscode时&#xff0c;偶尔会出现这样的问题&#xff1a;打开了某个编辑器&#xff08;文件&#xff0c;下面统称文件&#xff09;后&#xff0c;再打开其他文件…

Python AI库 Pandas的常见操作的扩展知识

Python AI库 Pandas的常见操作的扩展知识 本文默认读者具备以下技能&#xff1a; 熟悉python基础知识&#xff0c;vscode或其它编辑工具 熟悉表格文件的基本操作 具备自主扩展学习能力 前文中对Pandas的数据结构以及基础操作做了介绍,本文中会在前文的基础上,对常见的操作进…

MacOS通过命令行开启关闭向日葵远程控制的后台服务

categories: [Tips] tags: MacOS Tips 写在前面 经常有小伙伴问我电脑相关的问题, 而解决问题的一个重要途径就是远程了. 关于免费的远程工具我试过向日葵和 todesk, 并且主要使用向日葵, 虽然 MacOS 下要设置很多权限, 但是也不影响其丝滑的控制. 虽然用着舒服, 但是向日葵…

arm架构,django4.2.7适配达梦8数据库

【Python相关包版本信息】 Django 4.2.7 django-dmPython 3.1.7 dmPython 2.5.5 【达梦数据库版本】 DM Database Server 64 V8 DB Version: 0x7000c 适配过程中发现的问题如下&#xff1a; 错误一&#xff1a;d…

[图解]软件开发中的糊涂用语-04-为什么要追究糊涂用语

0 00:00:00,030 --> 00:00:05,620 今天呢&#xff0c;我们来说一个为什么要追究糊涂用语的问题 1 00:00:06,310 --> 00:00:06,548 2 00:00:06,548 --> 00:00:11,077 大家知道我们前些天都发了好几个视频 3 00:00:11,077 --> 00:00:13,461 追究这个糊涂用语 4 00…

视频批量下载工具

1、功能演示 该工具实现了某个人主页视频批量下载&#xff0c;最多支持一次下载50个视频&#xff0c;这50个选取的是最新发布的50个视频&#xff0c;视频为高清的1080p&#xff0c;并直接将视频保存到本地。 2、软件使用介绍 2.1 解压 拿到工具软件后&#xff0c;首先是对软件…

《HCIP-openEuler实验指导手册》1.4 Apache MPM工作模式调整

MPM介绍 二、配置步骤 查看MPM当前工作模式 方法一&#xff1a; httpd -M | grep mpm方法二&#xff1a; 浏览器访问&#xff1a;http://IP:端口/server-status 方法三&#xff1a; cat /etc/httpd/conf.modules.d/00-mpm.conf查看 LoadModule mpm_event_module modules/mo…

第三节课,后端登录【1】

一、总任务 二、登录接口 get 请求&#xff0c;有缺陷&#xff0c;长度有限制 三、登录逻辑 四、代码书写位置 4.1 编写业务逻辑的位置 五、写代码 5.1 代码1 5.1.1 细节 按 CtrlAltShiftL ,快速格式化 5.1. 2 自动生成接口参数 先/** 再回车 效果图 5.2 按 alt enter …

【C语言】贪吃蛇详解(附源码)

一、贪吃蛇实现效果 【C语言】贪吃蛇&#xff08;控制台&#xff09; 二、源码 &#x1f388;&#x1f388;&#x1f388;Snake 残风也想永存/C语言项目 - 码云 - 开源中国 (gitee.com)&#x1f388;&#x1f388;&#x1f388; 三、如何使用C语言去实现一个贪吃蛇&#xff1f…

Three.js和Cesium.js中坐标

在了解Three.js和Cesium.js前先了解并弄清楚图形学关于空间的基本概念流程&#xff1a; 计算机图形学 图形学中涉及到多个坐标空间&#xff0c;这些空间之间的变换是图形渲染中的核心部分。下面是一些常见的图形学空间及其变换顺序&#xff1a; 对象空间&#xff08;Object Sp…

分类神经网络1:VGGNet模型复现

目录 分类网络的常见形式 VGG网络架构 VGG网络部分实现代码 分类网络的常见形式 常见的分类网络通常由特征提取部分和分类部分组成。 特征提取部分实质就是各种神经网络&#xff0c;如VGG、ResNet、DenseNet、MobileNet等。其负责捕获数据的有用信息&#xff0c;一般是通过…

ASP.NET基于WEB的选课系统

摘要 设计本系统的目的是对选课信息进行管理。学生选课系统维护模块主要完成的是系统管理与维护功能。课题研究过程中&#xff0c;首先对系统管理模块进行了详尽的需求分析&#xff0c;经分析得到系统管理模块主要完成如下的功能&#xff1a;用户基本信息、选课信息的录入,查看…

Spring Boot 如何实现缓存预热

Spring Boot 实现缓存预热 1、使用启动监听事件实现缓存预热。2、使用 PostConstruct 注解实现缓存预热。3、使用 CommandLineRunner 或 ApplicationRunner 实现缓存预热。4、通过实现 InitializingBean 接口&#xff0c;并重写 afterPropertiesSet 方法实现缓存预热。 1、使用…

华为先进芯片麒麟9010效能再升级,挑战新高度 | 百能云芯

根据最新的彭博资讯报道&#xff0c;华为再次引领了智能手机行业的先进技术&#xff0c;其最新发布的Pura 70系列智能手机搭载了由中芯国际生产的麒麟9010高阶处理器。这一消息再次证明了华为在芯片设计和生产领域的持续创新能力&#xff0c;并且表明华为对于提升智能手机性能和…

【机器学习】集成学习---Bagging之随机森林(RF)

【机器学习】集成学习---Bagging之随机森林&#xff08;RF&#xff09; 一、引言1. 简要介绍集成学习的概念及其在机器学习领域的重要性。2. 引出随机森林作为Bagging算法的一个典型应用。 二、随机森林原理1. Bagging算法的基本思想2. 随机森林的构造3. 随机森林的工作机制 三…

开源文本嵌入模型M3E

进入正文前&#xff0c;先扯点题外话 这两天遇到一个棘手的问题&#xff0c;在用 docker pull 拉取镜像时&#xff0c;会报错&#xff1a; x509: certificate has expired or is not yet valid 具体是下面&#x1f447;这样的 rootDS918:/volume2/docker/xiaoya# docker pul…

一款神奇的地理数据可视化python库

在地理信息系统&#xff08;GIS&#xff09;和地理数据可视化领域&#xff0c;Python的易用性和强大的库支持使其成为处理地理数据的理想选择之一。今天我们介绍Cartopy库&#xff0c;它为地理数据可视化提供了强大的支持。无论是对于GIS专业人士还是对地理数据可视化感兴趣的初…