某讯滑块动态明文数组构造

2024-03-08 10:36

本文主要是介绍某讯滑块动态明文数组构造,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

声明:

        本文章中所有内容仅供学习交流使用,不用于其他任何目的,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!若有侵权,请添加(wx:wyqlxl99)联系删除

前言:

        这段时间摆烂了、有点不知道自己该干嘛了 陷入了迷茫,然后听群友问起某讯滑块的动态明文数组顺序怎么搞?动态key要怎么获取?一开始我也听过这个滑块但是好像补环境比较方便一点,抱着探索的心态开启下面的逆向旅程.

        通过接口的堆栈直接定位到加密的位置,然后往里面跟可以看到window.TDC.getData(!0)就是生成collect参数的调用方法

图片

图片

        再往里面跟就可以跟到熟悉的tdc.js文件,这里面是一个jsvmp,既然是vmp我们先找一下主入口、堆栈、操作这些都是怎么做的

图片

            单步往下跟几步就会跳到这个地方,可以看到这个R就相当于ip即指向下一个要取的字节码,w则是存贮字节码的数组,G可以看到是存放操作函数的数组,那这一部分的操作应该是根据R取w中的字节码,然后从G中到字节码所对应的函数执行,如果存在返回值则会跳出这个for循环 否则将一直执行这段操作。

图片

图片

        这里我们只分析动态明文数组如何构造,加密部分就不多说了,我们找到+操作的部分打上日志断点h[h.length - 2], '+' ,h.at(-1) 注意!断点里面不能用h.pop()因为日志里面的代码是执行了如果你跟网页上一样在日志中使用了pop则会打乱vmp堆栈的执行顺序导致报错!

图片

滑动滑块等日志输出完毕,我们可以在控制台看到一共四个部分组成其中第一个部分属于环境数组、第二部分则是轨迹、第三部分也是环境数组里、第四部分则是setTdcData方法设置进去的

图片

图片

图片

图片

        其中第一部分和第三部分的环境顺序是会根据不同的字节码去改变的、因为这个文件是动态的所以每次解析的字节码都是不同的所以每次生成的环境数组顺序是动态的,我们在下面这个位置插桩'push',H[0][H[1]],H可以看到,我们要的环境值都来自于一个37数组,看操作应该是一次取出37数组里的对象执行get方法获取到响应的环境值。

图片

图片

        对于37数组以及刚才的四部分,确实补环境比较方便,如果我们要搞算法的话需要处理几种情况:

        第一:我们需要拿到37数组每个闭包方法的起始ip,这样的话我们就可以根据起始ip写一个vmp或者利用他本身的vmp执行根据执行里面操作的特征来判断当前这个方法是属于环境检测的哪一条

        第二:我们需要找到他切割的点,就是第一部分和第三部分中间会被切开那这个切开是按什么去切的?

        第三:动态的key数组我们要怎么获取?

图片

        一步一步来首先我们要先获取到37数组,那么怎么拿这个37数组呢?我们划完执行这个方法单步跟进去,控制台输出h查看堆栈,可以看到在走整个加密之前37数组就已经生成了,那说明这个37数组大概率是在vmp初始化的时候已经生成!

图片

图片

        跟栈的过程就不说了直接控制台搜u.appendChild(d)下个断点然后重新触发滑块之后点script断点一般点1-2下就回到tdc.js文件开始加载的地方,这个时候就可以插桩分析找到37数组的位置

图片

图片

        其实可以拿到37数组的位置有很多,我找了下面这个位置用来拿我的37数组,当然这是在浏览器上,浏览器上当然可以拿到37数组我们要做的是如果在本地拿到。

图片

        我们先把整个文件拿下来放本地,然后在我们找到的位置写好判断并且设定一个全局变量用来把37数组给取出来,在初始化完vmp之后打印一下arr37.

图片

图片

        直接执行发现还是空数组?难道我们写的判断错了没有取到37数组?刚才我们说是浏览器上取到的,本地要取的话是不是会缺了一些环境呢?

        那我们怎么知道少了一些啥?我们要的是执行拿到37数组就行就是要保证初始化vmp完整运行,最起码在我取到37数组之前不要报错!所以我们在catch的部分打印一下因为啥报错了

图片

        然后补了十几行我们发现37数组就已经有值了.

图片

            我们依次执行可以看到有返回值,但是有些是空有些是0,这个我怎么判断当前这个方法是取了哪一块环境呢?

图片

        还记得我上面是如何获取到环境数组部分的值的么?对就是一样插桩然后用网页的跟本地的进行对比,一一对应我们就可以知道这部分实际的值是什么然后推出大致是取得哪部分的值。

图片

        但是单凭这一点还不能够完全确定,所以我们要在vmp里面动手脚,我们找到这个部分下面这部分是将字节码转换成字符串的操作我们写一段输出。我们找第五个执行可以看到我们的返回值是[undefined]但是实际值是720,我们可以看到我们刚才日志输出的位置打印出来screen,height

图片

图片

        那我们是不是可以在他输出height这个特征的时候写一个判断然后抛出异常,走异常处理再把异常信息返回出来.

图片

图片

        再次执行的时候可以看到返回的信息就变成我们抛出错误的信息了,这样我们就可以判断当前这个索引所对应的是哪一块的信息,再写一些判断就可以完美的还原环境数组了,建议有一些简单的环境可以直接补上对于dom监测点一些很恶心的操作就不管了

图片

        后续我差不多补了80行左右不涉及子节点的添加删除,一些乱七八糟的dom操作,成功获取到了动态key已经相关的动态环境,关于动态key可以根据K[K.length - 2] = K[K.length - 2] + K.pop()部分观察规律写出相对应的判断代码将其存下来

图片

图片

        仔细观察你可以发现有这一段字符串,这一段其实就是我所说的第二部分轨迹加密的加密值,这就是为什么我没有调用window.TDC.getData(!0)也可以拿到动态key的原因,而且这个部分就是分割动态环境数组的分割点(一开始我想着是不是根据某个值处理判断),那一切就变得很简单了,我的处理方式是讲这段索引的所对应的值改成动态key数组值,后面根据这个动态key数组分割,前面的部分为第一部分,动态key数组为第二部分,分割后的部分为第三部分,最后setTdcData的部分为第四部分。

图片

        运用到实际代码中,嗖的一下errorCode:0 成功啦!后续能不能用就没有继续测试了

图片

有兴趣的可以加入我的星球后续会持续分享和更新!

图片

这篇关于某讯滑块动态明文数组构造的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/786826

相关文章

慢sql提前分析预警和动态sql替换-Mybatis-SQL

《慢sql提前分析预警和动态sql替换-Mybatis-SQL》为防止慢SQL问题而开发的MyBatis组件,该组件能够在开发、测试阶段自动分析SQL语句,并在出现慢SQL问题时通过Ducc配置实现动... 目录背景解决思路开源方案调研设计方案详细设计使用方法1、引入依赖jar包2、配置组件XML3、核心配

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

MySQL中动态生成SQL语句去掉所有字段的空格的操作方法

《MySQL中动态生成SQL语句去掉所有字段的空格的操作方法》在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况,本文将详细介绍如何在MySQL中动态生成SQL语句来去掉所有字段的空... 目录在mysql中动态生成SQL语句去掉所有字段的空格准备工作原理分析动态生成SQL语句在MySQL

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.