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

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

相关文章

【杂记-浅谈DHCP动态主机配置协议】

DHCP动态主机配置协议 一、DHCP概述1、定义2、作用3、报文类型 二、DHCP的工作原理三、DHCP服务器的配置和管理 一、DHCP概述 1、定义 DHCP,Dynamic Host Configuration Protocol,动态主机配置协议,是一种网络协议,主要用于在IP网络中自动分配和管理IP地址以及其他网络配置参数。 2、作用 DHCP允许计算机和其他设备通

将一维机械振动信号构造为训练集和测试集(Python)

从如下链接中下载轴承数据集。 https://www.sciencedirect.com/science/article/pii/S2352340918314124 import numpy as npimport scipy.io as sioimport matplotlib.pyplot as pltimport statistics as statsimport pandas

剑指offer(C++)--数组中只出现一次的数字

题目 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 class Solution {public:void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {int len = data.size();if(len<2)return;int one = 0;for(int i

JavaWeb系列六: 动态WEB开发核心(Servlet) 上

韩老师学生 官网文档为什么会出现Servlet什么是ServletServlet在JavaWeb项目位置Servlet基本使用Servlet开发方式说明快速入门- 手动开发 servlet浏览器请求Servlet UML分析Servlet生命周期GET和POST请求分发处理通过继承HttpServlet开发ServletIDEA配置ServletServlet注意事项和细节 Servlet注

IOS 数组去重的几种方式

本来只知道NSSet和KeyValues的。今天又新学了几种方式 还有就是和同事学的一种方式 外层循环从0开始遍历,内层从最后一个元素开始遍历 for(int i=0;i<index;i++){  for(int j=index-1;j>i;j-- ){ } }

OSG学习:LOD、数据分页、动态调度

LOD(level of detail):是指根据物体模型的结点在显示环境中所处的位置和重要度,决定物体渲染的资源分配,降低非重要物体的面数和细节度,从而获得高效率的渲染运算。在OSG的场景结点组织结构中,专门提供了场景结点osg::LOD来表达不同的细节层次模型。其中,osg::LOD结点作为父节点,每个子节点作为一个细节层次,设置不同的视域,在不同的视域下显示相应的子节点。 数据分页:在城市

PHP序列化用到的构造:__sleep() __wakeup()

串行化serialize可以把变量包括对象,转化成连续bytes数据. 你可以将串行化后的变量存在一个文件里或在网络上传输. 然后再反串行化还原为原来的数据. 你在反串行化类的对象之前定义的类,PHP可以成功地存储其对象的属性和方法. 有时你可能需要一个对象在反串行化后立即执行. 为了这样的目的,PHP会自动寻找__sleep和__wakeup方法.   当一个对象被串行化,PHP会

Java基础(二)——数组,方法,方法重载

个人简介 👀个人主页: 前端杂货铺 ⚡开源项目: rich-vue3 (基于 Vue3 + TS + Pinia + Element Plus + Spring全家桶 + MySQL) 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步至千里,积小流成江海 🥇推荐学习:🍖开源 rich-vue3 🍍前端面试

Java代理-动态字节码生成代理的5种方式

上篇讲到了代理模式出现的原因,实现方式以及跟其他相似设计模式的区别。传送门@_@ http://blog.csdn.net/wonking666/article/details/79497547 1.静态代理的不足 设计模式里面的代理模式,代理类是需要手动去写的。但是手写代理的问题颇多 1.如果不同类型的目标对象需要执行同样一套代理的逻辑,比如说在方法调用前后打印参数和结果,那么仍然需要为每

poj 3882(Stammering Aliens) 后缀数组 或者 hash

后缀数组:  构建后缀数组,注意要在字符串莫末尾加上一个没出现过的字符。然后可以2分或者直接扫描,直接扫描需要用单调队列来维护 VIEW CODE #include<cstdio>#include<algorithm>#include<iostream>#include<cmath>#include<queue>#include<stack>#include<string