某讯滑块验证码反汇编分析-第一章

news2024/11/17 16:15:06

某讯滑块验证码反汇编分析-第一章

    • js分析
    • 初步分析vmp结构

js分析

在滑动完成后,会请求【cap_union_new_verify】接口,其中有5个比较长的参数,看起来可能会有加密的,分别如下。

参数名来源
ua
sess
collect
eks
vData

那现在js看看这些参数是怎么来的,ua看名字很有可能是User-Agent的简写,把值直接放到base64解码,可以发现就是与请求的User-Agent一模一样。

sess 从【cap_union_prehandle】的请求返回的,而这个请求并没有其他的加密请求参数,那么sess就可以理解为是由服务器返回的。

接着直接搜索【collect】

在这里插入图片描述
发现只有两处,实际就是下面的js中

在这里插入图片描述
【collect】就是由【C()】得到,同时也带出了下面的【eks】参数由【R()】得到·,非常好。一次找到两个。

最后是vData,发现在下面的函数出现到,那么接下来动态调试看看。

在这里插入图片描述
可以看到C函数绑定的是getData函数,继续往里面走

在这里插入图片描述

里面调用的是g的函数,而这个已经是vmp的函数了,就不往下走了,接着很容易发现R函数绑定的是getEks函数,并且也会走到vmp内部

在这里插入图片描述
接着再往下,去到send下断点

在这里插入图片描述
发现send的时候,还没有vData参数,但是实际发出去的时候却有了,那么很有可能和某音一样重写了XMLHttpRequest的原型,那么查看一下是否被修改

在这里插入图片描述
发现确实被重写,同时也是指向了vmp的内部,那么现在总结一下参数的来源

参数名来源
uaUser-Agent的base64编码
sess前面请求返回
collectgetData (jsvmp-tdc)
eksgetEks (jsvmp-tdc)
vDataXMLHttpRequest.prototype.send (jsvmp-slide)

初步分析vmp结构

把tdc的js下载到本地,然后格式化阅读一下。

在这里插入图片描述
里面有一大段base64编码的字符串,以及一个大数组,这两个最终会解码成一个大数组,这个大数组就是包含字节码的数组,并传入【__TENCENT_CHAOS_VM】运行

在这里插入图片描述
经过一段分析,发现主要用到的是前四个参数

在这里插入图片描述
配合上面的一个子函数创建的指令,大概可以猜测到各个参数含义

参数作用
1pc寄存器
2字节码数组
3函数调用者
4调用堆栈

这里我暂时写了小小的解释器,可以看到微量的函数逻辑

(function () {
  function _0x7(_0x7_0) {
    function _0x14(_0x14_0) {}
    let tx_1 = new window["Object"]();
    _0x14["m"] = _0x7_0;
    _0x14["c"] = tx_1;
    function _0x131(_0x131_0, _0x131_1, _0x131_2) {}
    _0x14["d"] = _0x131;
    function _0x1d2(_0x1d2_0) {}
    _0x14["r"] = _0x1d2;
    function _0x32f(_0x32f_0, _0x32f_1) {}
    _0x14["t"] = _0x32f;
    function _0x4e5(_0x4e5_0) {}
    _0x14["n"] = _0x4e5;
    function _0x571(_0x571_0, _0x571_1) {
      let tx_2 = window["Object"]["prototype"]["hasOwnProperty"]["call"](_0x571_0, _0x571_1);
      return tx_2;
    }
    _0x14["o"] = _0x571;
    _0x14["p"] = "";
    _0x14["s"] = 0;
    let tx_3 = _0x14(0);
    return tx_3;
  }
  let tx_4 = new window["Array"]();
  function _0x608(_0x608_0, _0x608_1, _0x608_2) {
    let tx_5 = new window["Object"]();
    tx_5["info"] = window["window"]["QQVkQHQWOfMFNTXSYXlimJVnCGHWjNnK"];
    let tx_6 = new window["Object"]();
    try {
      window["window"]["TDC"] = tx_6;
      function _0x761() {
        let tx_7 = _0x608_2(1);
        let tx_8 = tx_7["getGuid"]();
        tx_5["tokenid"] = tx_8;
        return tx_5;
      }
      tx_6["getInfo"] = _0x761;
      let tx_9 = _0x608_2(3);
      tx_6["setData"] = tx_9["mSet"];
      tx_6["clearTc"] = tx_9["mClear"];
      tx_6["getData"] = tx_9["mGetData"];
      let tx_10 = tx_9["mInit"]();
    } catch (tx_11) {
      try {
        let tx_12 = _0x608_2(60);
        let tx_13 = tx_12(tx_11);
        function _0x6e6() {}
        tx_6["getData"] = _0x6e6;
      } catch (e) {
        return undefined;
      }
      return undefined;
    }
    return undefined;
  }
  tx_4[0] = _0x608;
  function _0x84c(_0x84c_0, _0x84c_1, _0x84c_2) {}
  tx_4[1] = _0x84c;
  function _0xb89(_0xb89_0, _0xb89_1, _0xb89_2) {}
  tx_4[2] = _0xb89;
  function _0x1022(_0x1022_0, _0x1022_1, _0x1022_2) {}
  tx_4[3] = _0x1022;
  function _0x19fd(_0x19fd_0, _0x19fd_1, _0x19fd_2) {}
  tx_4[4] = _0x19fd;
  function _0x1b81(_0x1b81_0, _0x1b81_1, _0x1b81_2) {}
  tx_4[5] = _0x1b81;
  function _0x1bb9(_0x1bb9_0, _0x1bb9_1) {}
  tx_4[6] = _0x1bb9;
  function _0x2758(_0x2758_0, _0x2758_1, _0x2758_2) {}
  tx_4[7] = _0x2758;
  function _0x2bd2(_0x2bd2_0, _0x2bd2_1, _0x2bd2_2) {}
  tx_4[8] = _0x2bd2;
  function _0x2c52(_0x2c52_0, _0x2c52_1, _0x2c52_2) {}
  tx_4[9] = _0x2c52;
  function _0x2d52(_0x2d52_0, _0x2d52_1, _0x2d52_2) {}
  tx_4[10] = _0x2d52;
  function _0x2dd4(_0x2dd4_0, _0x2dd4_1, _0x2dd4_2) {}
  tx_4[11] = _0x2dd4;
  function _0x2e46(_0x2e46_0, _0x2e46_1, _0x2e46_2) {}
  tx_4[12] = _0x2e46;
  function _0x309b(_0x309b_0, _0x309b_1, _0x309b_2) {}
  tx_4[13] = _0x309b;
  function _0x33d2(_0x33d2_0, _0x33d2_1, _0x33d2_2) {}
  tx_4[14] = _0x33d2;
  function _0x35f0(_0x35f0_0, _0x35f0_1, _0x35f0_2) {}
  tx_4[15] = _0x35f0;
  function _0x36b9(_0x36b9_0, _0x36b9_1, _0x36b9_2) {}
  tx_4[16] = _0x36b9;
  function _0x36ed(_0x36ed_0, _0x36ed_1, _0x36ed_2) {}
  tx_4[17] = _0x36ed;
  function _0x376f(_0x376f_0, _0x376f_1, _0x376f_2) {}
  tx_4[18] = _0x376f;
  function _0x3d18(_0x3d18_0, _0x3d18_1, _0x3d18_2) {}
  tx_4[19] = _0x3d18;
  function _0x3e8f(_0x3e8f_0, _0x3e8f_1, _0x3e8f_2) {}
  tx_4[20] = _0x3e8f;
  function _0x3f25(_0x3f25_0, _0x3f25_1, _0x3f25_2) {}
  tx_4[21] = _0x3f25;
  function _0x408b(_0x408b_0, _0x408b_1, _0x408b_2) {}
  tx_4[22] = _0x408b;
  function _0x40fb(_0x40fb_0, _0x40fb_1, _0x40fb_2) {}
  tx_4[23] = _0x40fb;
  function _0x41cc(_0x41cc_0, _0x41cc_1, _0x41cc_2) {}
  tx_4[24] = _0x41cc;
  function _0x4414(_0x4414_0, _0x4414_1, _0x4414_2) {}
  tx_4[25] = _0x4414;
  function _0x4812(_0x4812_0, _0x4812_1, _0x4812_2) {}
  tx_4[26] = _0x4812;
  function _0x49ff(_0x49ff_0, _0x49ff_1, _0x49ff_2) {}
  tx_4[27] = _0x49ff;
  function _0x5243(_0x5243_0, _0x5243_1, _0x5243_2) {}
  tx_4[28] = _0x5243;
  function _0x5364(_0x5364_0, _0x5364_1, _0x5364_2) {}
  tx_4[29] = _0x5364;
  function _0x555f(_0x555f_0, _0x555f_1, _0x555f_2) {}
  tx_4[30] = _0x555f;
  function _0x58fa(_0x58fa_0, _0x58fa_1, _0x58fa_2) {}
  tx_4[31] = _0x58fa;
  function _0x60f6(_0x60f6_0, _0x60f6_1, _0x60f6_2) {}
  tx_4[32] = _0x60f6;
  function _0x6487(_0x6487_0, _0x6487_1, _0x6487_2) {}
  tx_4[33] = _0x6487;
  function _0x6698(_0x6698_0, _0x6698_1, _0x6698_2) {}
  tx_4[34] = _0x6698;
  function _0x6a36(_0x6a36_0, _0x6a36_1, _0x6a36_2) {}
  tx_4[35] = _0x6a36;
  function _0x6dc0(_0x6dc0_0, _0x6dc0_1, _0x6dc0_2) {}
  tx_4[36] = _0x6dc0;
  function _0x8a18(_0x8a18_0, _0x8a18_1, _0x8a18_2) {}
  tx_4[37] = _0x8a18;
  function _0x8b72(_0x8b72_0, _0x8b72_1, _0x8b72_2) {}
  tx_4[38] = _0x8b72;
  function _0x8c13(_0x8c13_0, _0x8c13_1, _0x8c13_2) {}
  tx_4[39] = _0x8c13;
  function _0x8d47(_0x8d47_0, _0x8d47_1, _0x8d47_2) {}
  tx_4[40] = _0x8d47;
  function _0x8e28(_0x8e28_0, _0x8e28_1, _0x8e28_2) {}
  tx_4[41] = _0x8e28;
  function _0x8ec7(_0x8ec7_0, _0x8ec7_1, _0x8ec7_2) {}
  tx_4[42] = _0x8ec7;
  function _0x8f3d(_0x8f3d_0, _0x8f3d_1, _0x8f3d_2) {}
  tx_4[43] = _0x8f3d;
  function _0x90f3(_0x90f3_0, _0x90f3_1, _0x90f3_2) {}
  tx_4[44] = _0x90f3;
  function _0x928a(_0x928a_0, _0x928a_1, _0x928a_2) {}
  tx_4[45] = _0x928a;
  function _0x934a(_0x934a_0, _0x934a_1, _0x934a_2) {}
  tx_4[46] = _0x934a;
  function _0x94e0(_0x94e0_0, _0x94e0_1, _0x94e0_2) {}
  tx_4[47] = _0x94e0;
  function _0x9573(_0x9573_0, _0x9573_1, _0x9573_2) {}
  tx_4[48] = _0x9573;
  function _0x964a(_0x964a_0, _0x964a_1, _0x964a_2) {}
  tx_4[49] = _0x964a;
  function _0x9da5(_0x9da5_0, _0x9da5_1, _0x9da5_2) {}
  tx_4[50] = _0x9da5;
  function _0xa203(_0xa203_0, _0xa203_1, _0xa203_2) {}
  tx_4[51] = _0xa203;
  function _0xa38f(_0xa38f_0, _0xa38f_1, _0xa38f_2) {}
  tx_4[52] = _0xa38f;
  function _0xa41f(_0xa41f_0, _0xa41f_1, _0xa41f_2) {}
  tx_4[53] = _0xa41f;
  function _0xa4b4(_0xa4b4_0, _0xa4b4_1, _0xa4b4_2) {}
  tx_4[54] = _0xa4b4;
  function _0xa627(_0xa627_0, _0xa627_1, _0xa627_2) {}
  tx_4[55] = _0xa627;
  function _0xa698(_0xa698_0, _0xa698_1, _0xa698_2) {}
  tx_4[56] = _0xa698;
  function _0xa852(_0xa852_0, _0xa852_1, _0xa852_2) {}
  tx_4[57] = _0xa852;
  function _0xa902(_0xa902_0, _0xa902_1, _0xa902_2) {}
  tx_4[58] = _0xa902;
  function _0xa9d5(_0xa9d5_0, _0xa9d5_1, _0xa9d5_2) {}
  tx_4[59] = _0xa9d5;
  function _0xab51(_0xab51_0, _0xab51_1, _0xab51_2) {}
  tx_4[60] = _0xab51;
  function _0xacd5(_0xacd5_0, _0xacd5_1, _0xacd5_2) {}
  tx_4[61] = _0xacd5;
  let tx_14 = _0x7(tx_4);
  return undefined;
})();

此代码因为没有完整验证,仅供参考。

接着我还没发现原来解释器的指令数组是会变的,好家伙,这使得我需要重构部分逻辑才能继续往下走

在这里插入图片描述

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

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

相关文章

让车机「下雨」,路特斯的智能座舱跑偏了吗?

HIEV消息(文/张祥威)“我们今天用双8155,都觉得(算力)还不够。”杨平说。 这位路特斯的智能座舱研发负责人,目前带领着一支两百多人的团队,为Eletre这款车操刀座舱智能化。 双8155,指…

Gitee应用(1):快速搭建Git环境在不同电脑同步文件

一、前言 环境:Windows 11 64位 ;vscode:1.73.1 当你要操作在两台不同的电脑上操作,或许经常会遇到一个问题,就是怎么同步同一个或几个文件,以方便你在不同的电脑上进行同个文件内容的创作。 在申请了公司电…

【Java难点攻克】「NIO和内存映射性能提升系列」彻底透析NIO底层的内存映射机制原理与Direct Memory的关系

NIO与内存映射文件 Java类库中的NIO包相对于IO包来说有一个新功能就是 【内存映射文件】,在业务层面的日常开发过程中并不是经常会使用,但是一旦在处理大文件时是比较理想的提高效率的手段,之前已经在基于API和开发实战角度介绍了相关的大文…

Java Math类

JavaMath类\huge{Java \space Math类}Java Math类 Math类 包含执行基本数字运算的方法,Math类没有提供公开的构造器。 MathMathMath类本质就是一个工具类,提供许多方法用于其他类调用,但是无法创建子类对象。 常用方法 ①. abs()取绝对值…

CANoe测试的两种方式Test Module 和 Test Unit对比,你常用哪种呢?

🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe&…

前端接口联调时传的参数是array数组形式处理

情景:使用van-uolaoder组件上传多个图片后调用保存按钮,这时由于存在多张图片,调用接口时前端传的参数就是数组形式。(前端传的数组要先转为字符串) 处理方法是: 1. 先确定后端使用什么注解,如…

Gerb视图支持新表单和旧表单

Gerb视图支持新表单和旧表单 GerbView生产高级软件Companions,但也易于替换、打印和查看HPGL、HPGL/2、Excellon和国际象棋文件。该程序支持RS274D和RS274X。您可以使用此软件将旧格式和标准RS274D转换为具有默认信息的新类型RS274X。Gerbview将致力于展示和绘制您的…

计算机毕业设计django基于python租房系统-房屋租赁系统

项目介绍 在各学校的教学过程中,租房系统是一项非常重要的事情。随着计算机多媒体技术的发展和网络的普及。采用当前流行的B/S模式以及3层架构的设计思想通过Python技术来开发此系统的目的是建立一个配合网络环境的租房系统的平台,这样可以有效地解决租房系统混乱的局面。 本文…

(P3)python类的特殊方法 init、getitem、len、call

python 类的特殊方法 参考资料 python解释器遇到特殊句法时,会去调用特殊方法,这些特殊方法以双下划线开头。 1、__init __ () 该方法在对象创建时被解释器自动调用。 2、__getitem __ () getitem 获取实例对象的具体内容 p[key] 3、__len __() len …

牛客挑战赛65 D.233求min(二维偏序 树状数组/cdq分治)

题目 给出长度为n(n<1e5)的序列a1,a2,...,an​和b1,b2,...,bn(-1e3<ai,bi<1e3)&#xff0c; 请你找出1≤l≤r≤n&#xff0c;使得min(alal1...ar, blbl1...br)最大&#xff0c;并输出这个值 思路来源 官方题解 LYC_music submission 题解 两种做法&#xff0c; …

Python模块和包的介绍(模块含义、用模块好处、模块分类、包和模块的创建)

&#x1f308; 个人主页&#xff1a;王子玉博客 &#x1f506; 免费专栏&#xff1a;Python基础教程、python常用模块 ❤️ 分享网站&#xff1a; 《Python自学网》&#x1f449;&#x1f449;基础入门到逐步深入 | 适合新手入门到精通 | web开发、爬虫、自动化运维、自动化…

yocto 自动挂载分区(基于stmp32mp1)

yocto 自动挂载分区&#xff08;基于stmp32mp1&#xff09; 上一章我们在stm32mp1开发板上实践了创建分区的过程&#xff0c;本节我们再来分析下上小节创建的分区开机时是怎么完成分区的自动挂载的。 答案就在systemd里面&#xff1a; 下面就来详细分析一下这个几个文件 mo…

C/C++入门003-C语言变量与运算符

文章目录变量常量的概念常量的类型变量的概念定义变量为什么要定义变量如何使用变量&#xff1f;变量初始化修改变量变量之间的值传递如何查看变量的值?变量的作用域printf函数scanf函数函数的参数运算符算数运算符赋值运算符sizeof运算符逗号运算符关系运算符逻辑运算符三目运…

攻击类型的攻击次数分布

攻击类型分析 2018 年&#xff0c;主要的攻击类型 1 为 SYN Flood&#xff0c;UDP Flood&#xff0c;ACK Flood&#xff0c;HTTP Flood&#xff0c;HTTPS Flood&#xff0c; 这五大类攻击占了总攻击次数的 96&#xff05;&#xff0c;反射类攻击不足 3%。和 2017 年相比&…

【Linux网络编程】select多路复用

文章目录前言如何增强服务端的通信能力Linux的设计哲学文件描述符代码讲解以文件方式操作命令行阻塞函数与非阻塞函数轮询select()代码全貌The End前言 我们上节课讲解了服务端的编程(Linux服务端编程初体验) 本节课要讲的是select 提示&#xff1a;以下是本篇文章正文内容&am…

RocketMQ引发的磁盘预警复盘

RocketMQ引发的磁盘预警复盘前言发现问题排查过程Step 1Step 2Step 3Step 4Step 5Step 6Step 7Step 8Step 9解决方式写在最后前言 一款优秀的中间件&#xff0c;参数的缺省值必然是经过反复验证得出的最优解&#xff0c;勿动&#xff01; 发现问题 某台SaaS服务器磁盘不足发出…

kafka的 __consumer_offsets

Zookeeper不适合大批量的频繁写入操作。Kafka 1.0.2将consumer的位移信息保存在Kafka内部的topic中&#xff0c;即__consumer_offsets主题&#xff0c;并且默认提供了kafka_consumer_groups.sh脚本供用户查看consumer信息。 1、创建topic “tp_test_01” [rootnode1 ~]# kafka…

《Linux运维总结:Centos7.6部署二进制mongodb4.4.8三节点副本集群》

一、Mongodb集群模式 1、三种集群介绍 MongoDB有三种集群部署模式&#xff0c;分别为主从复制&#xff08;Master-Slaver&#xff09;、副本集&#xff08;Replica Set&#xff09;和分片&#xff08;Sharding&#xff09;模式。 1、Master-Slaver 是一种主从副本的模式&#x…

自动驾驶之行人轨迹预测数据集

一、 Real Data ETH: Univ. Hotel;750 pedestrians exhibiting complex interactions UCY: Zara01, Zara02 and Uni.780 pedestrians 单应性矩阵&#xff0c;SLAM中的当用多个不同相机拍摄同一个三维平面需要考虑的矩阵&#xff0c;适应场景为平面情况 商场 这个数据集是用双…

Onvif学习

ONVIF onvif&#xff08;Open Network Video Interface Forum&#xff0c;开放型网络视频接口论坛&#xff09;协议. onvif协议涵盖了设备发现、设备配置、事件、PTZ控制、视频分析和实时流媒体直播功能&#xff0c;以及搜索&#xff0c;回放和录像录音管理功能。 先去看许振…