【JavaScript 逆向】猿人学 web 第十八题:jsvmp,洞察先机

2023-11-19

案例目标

网址:第十八题 jsvmp 洞察先机 - 猿人学

本题目标:抓取 5 页数字,计算加和并提交结果

常规 JavaScript 逆向思路

一般情况下,JavaScript 逆向分为三步:

  • 寻找入口:逆向在大部分情况下就是找一些加密参数到底是怎么来的,关键逻辑可能写在某个关键的方法或者隐藏在某个关键的变量里,一个网站可能加载了很多 JavaScript 文件,如何从这么多的 JavaScript 文件的代码行中找到关键的位置,很重要;

  • 调试分析:找到入口后,我们定位到某个参数可能是在某个方法中执行的了,那么里面的逻辑是怎么样的,调用了多少加密算法,经过了多少赋值变换,需要把整体思路整理清楚,以便于断点或反混淆工具等进行调试分析;

  • 模拟执行:经过调试分析后,差不多弄清了逻辑,就需要对加密过程进行逻辑复现,以拿到最后我们想要的数据

接下来开始正式进行案例分析:

寻找入口

F12 打开开发者人员工具,刷新网页进行抓包,在 Network 中可以看到数据接口为 18data?page=1,响应预览中可以看到当前页面各数字数据:

但是并没有看到类似加密的字段,通过对比,点击第二页的后,数据接口变成了 18data?page=2&t=XXX&v=XXX,请求 url 中多出了两个参数 t 和 v:

t 看起来像是时间戳,不过时间戳一般为 13 位,这里只有 10 位,v 是一串加密内容,从 Initiator 处跟栈到 getdata 中,逆向分析以下加密逻辑:

调试分析

会跳转到 18 文件的第 764 行,点击左下角的 { } 对其进行格式化操作,在第 1453 行 send 处打下断点调试分析,在第 1423 行创建了一个 XMLHttpRequest 对象,XMLHttpRequest 用于在后台与服务器交换数据,后面通过 xml.open( ) 建立链接,一个 HTTP 请求,xml.send( ) 发送请求,连接对象为当前接口的 url:

在第 1427 行定义了个 data 参数,在第 1429 行打断点调试,data 传入了当前页面所有数字:

  • responseText:将响应信息作为字符串返回

  • responseXML:将响应信息格式化为 XML 文档格式返回

在第 1452 行建立连接处打断点,鼠标选中 xml.open 进入到 y__ 中:

在第 1365 行,这块就是 jsvmpzl 框架混淆过的代码,全是大小写的 v、u、y 和下划线,非常不便于调试分析,第 1415 行能看到该框架的版本,在第 1385 行打下断点:

先分析一下,_U__ 函数有四个参数,后三个定义在第 771 行:

  • ___:判断是 node 环境还是浏览器环境

  • v__:window 环境和鼠标点击事件(argument)

  • V__:返回指定 unicode 编码对应的字符

_ 参数在这一块并没有定义,鼠标选中后查看,展开后发现了特别的字段 AES、mode、pad,这里就看起来是数组中的对象经过了 AES 加密,并且加密模块为 CBC,填充方式为 Pkcs7:

并且这里类似于鼠标滑点坐标,断点调试时也发现只要鼠标在页面晃动断点就能断住:

在第 1385 行打断点,向上跟栈,跟到 _y__ 处,这里将 __ 数组作为参数传递给了 yU[_v] 函数:

return yU_[_v].apply(yU_, __)

在第 1338 行,在控制台打印输出一下,_v 为 createEncryptor,是个加密方法,yU_ 有个 encryptBlock,跟进去发现又跳转回了 y__ 函数位置:

__ 中看到了关键字 iv、mode、padding,更确定了这里有过 AES 加密处理:

在该行插桩打下日志断点,鼠标在网页中滑动控制台会打印出如下内容,与 _[1][0]['mouse'] 中的鼠标坐标一致:

这部分和 _U__ 函数都囊括在第 979 行的 __V 函数体中,往后跟栈,所有的堆栈都走到其中,可以尝试 hook 该函数中的 _ 参数的加密内容,找找突破口__V 函数有五个参数,hook 内容如下:

encrypt = _[1][0]['CryptoJS']['AES']['encrypt']
_[1][0]['CryptoJS']['AES']['encrypt']=function(a,b,c,d,e){
    var result = encrypt(a,b,c,d,e);
    console.log(result.toString())
    debugger;
    return a;
}

先在第 1385 行打断点断住后,将以上内容输入到控制台中进行 hook,不然会报错显示 _ 未定义,双击打印出的结果,即可进入到虚拟机中:

取消其他断点,点击第二页,即会在虚拟机中 hook 代码的 debugger;处断住,并会在控制台打印出如下内容:

通过与 v 参数对比,内容相似,长度匹配,即 __V 函数完成了对 v 参数的加密,且使用了 AES 加密,向上跟栈到 _y 中,又会跳转到第 1338 行,此处为加密位置:

上文讲过 __ 数组作为参数传递给了 yU[_v] 函数,__ 数组中的三个对象分别对应 hook 函数中的 a、b、c:

一般的 AES 加密方式如下,需要传入 text、key、iv,即对应 a、b、c.iv:

function aesEncrypt() {
    var key = CryptoJS.enc.Utf8.parse(aesKey),
        iv = CryptoJS.enc.Utf8.parse(aesIv),
        srcs = CryptoJS.enc.Utf8.parse(text),
        encrypted = CryptoJS.AES.encrypt(srcs, key, {
            iv: iv,
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Iso10126
        });
    return encrypted.toString();
}
​
var aesKey = 'YyRose',
    aesIv = 'YyRose',
    text = 'YyRose';
​
console.log(aesEncrypt())

打印一下这三部分内容:

可以看出来 a 是页码加上 | 符再加上鼠标坐标组成的,那 b 和 c.iv 偏移量呢,在第 1338 行插桩打印下日志:

取消其他断点,点击第二页,打印出来的内容中有如下部分,第四行样式与 b 和 c.iv 一致,第四行是由第二行和第三行两个一样的内容组合而成的,第二行是由十三位时间戳去掉后三位转换为十六进制后,去掉前两位得到的结果,至此分析完成:

完整代码

JavaScript 代码

// 引用 crypto-js 加密模块
var CryptoJS = require('crypto-js')

function vEncrypt(text_num) {
    var text = text_num + "|67m508,66m509,66d509,66m509,66u509"
    var timestamp = Math.round(Date.parse(new Date())/1000);
    var aesIv = timestamp.toString(16) + timestamp.toString(16);
    var key = CryptoJS.enc.Utf8.parse(aesIv),
        iv = CryptoJS.enc.Utf8.parse(aesIv),
        srcs = CryptoJS.enc.Utf8.parse(text),
        encrypted = CryptoJS.AES.encrypt(srcs, key, {
            iv: iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        });
    return encrypted.toString();
}

// console.log(vEncrypt(2));

Python 代码

sessionid 要改为自己的:

import time

import execjs
import requests
import re


def yrx18_demo():
    num_sum = 0
    for page_num in range(1, 6):
        with open('yrx18.js', 'r', encoding='utf-8') as f:
            encrypt = f.read()
            v = execjs.compile(encrypt).call('vEncrypt', page_num)
        headers = {
            "user-agent": "yuanrenxue.project",
        }
        cookies = {
            "sessionid": " your sessionid ",
        }
        params = {
            "t": str(int(time.time() * 1000))[:-3],
            "v": v
        }
        url = "https://match.yuanrenxue.com/match/18data?page=%s" % page_num
        response = requests.get(url, headers=headers, cookies=cookies, params=params)
        for i in range(10):
            value = response.json()['data'][i]
            num = re.findall(r"'value': (.*?)}", str(value))[0]
            num_sum += int(num)
    print(num_sum)


if __name__ == '__main__':
    yrx18_demo()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【JavaScript 逆向】猿人学 web 第十八题:jsvmp,洞察先机 的相关文章

  • java实现简单的生成52张牌、三个人洗牌、码牌算法

    定义一个Pocker类 用于定义牌类 package demo public class Poker private String suit 花色 private int rank 数字 构造函数 public Poker String s
  • Java学习day17

    异常处理 异常处理机制 代码 public class Demo01 public static void main String args int a 1 int b 0 假如要捕获多个异常 从小到大 try if b 0 throw t
  • Mybatis一对多查询,分页显示问题解决方案

    分页查询在我们的开发中也许是遇到最多的功能 一张表的分页 多张表一对一功能的分页相信大家写来都是得心应手 但是在一对多分页查询的时候大家写法不对的时候 可能会遇到查询的总条数和实际总条数对不上的问题 不多说下面请看演示 1 先提供2张表的建
  • 3254 Corn Fields 这题解真的不能再详细了!

    题意 农场主John新买了一块长方形的新牧场 这块牧场被划分成 M M M行 N N N列 1
  • 大数据建模与数据模型工具

    一 什么是大数据 大数据一般指在数据量在10TB以上的数据集 通常有以下5个特点 1 容量 Volume 数据量大 数据量的大小决定所考虑的数据的价值和潜在的信息 2 种类 Variety 数据类型多 包括但不仅限于文本 音频 视频以及图片
  • Unity—UGUI

    每日一句 读数 学习 去更远的地方 才能摆脱那些你不屑一顾的圈子 目录 InputFiled输入框 例 用户名和密码 Toggle组件 案例 冷却效果 InputFiled输入框 Text Component 输入文本组件 Text输入内容
  • 菜鸟学python之计算第10次球体反弹高度

    题目 一球从100米高度自由落下 每次落地后反跳回原高度的一半 再落下 求它在第10次落地时 共经过多少米 第10次反弹多高 n 0 落地次数 high 0 反弹高度 hight 100 落地前n次高度 tour 0 经过的路程 for i
  • python string前加b的原因

    From https stackoverflow com questions 6269765 what does the b character do in front of a string literal they produce an
  • python 下载及安装-CentOS下python的下载及安装

    针对 CentOS下python的下载及安装 的问题 下面由IT产品经理 陆亦晓为您解答 Python这门编程语言在数据分析 数据发掘以及服务端开发等方面都有非常好的使用 我们之前介绍过Windows环境下python开发工具的安装 今天为
  • HTML 表格td中无内容时不显示边框的解决办法

    有时我们想实现不输入内容展示时 会不显示边框 解决方法 1 在单元格中加入一个空格 这样 td nbsp td 2 直接在table里这样写 table border 0 cellspacing 0 table
  • BUG处理流程图

    流程描述 1 测试人员发现bug提交给开发 2 开发人员判断是否是bug 3 如果是bug 进行修改 修改完成后更改bug状态为已解决 4 如果不是bug 退回给测试人员并描述退回原因 或为设计如此 或为外部原因 或者不能重现 5 开发人员
  • 【Linux】自动化构建工具:make/Makefile

    内容专栏 Linux操作系统基础 本文概括 工具使用的背景 理解make makefile工具 探索工作原理 文件修改时间的对比 PHONY伪目标 特性等 本文作者 阿四啊 发布时间 2023 9 14 背景 make 和 Makefile
  • C4D和3dmax有什么区别?

    很多小伙伴都知道3d Max和C4D都是一款三维制作软件 可是 很少见到游戏公司使用C4D软件制作模型呢 反而设计师们用的最多的就是3dmax 而C4D往往用于广告行业 那么C4D和3d max的区别是什么呢 一 性质不同 1 3Dmax
  • 2-4、React+antd页面UI美化——登录界面设计

    React Antd 实现组件的UI美化示例 目标UI 创建一个页面page 用于用户登录 要求页面简洁 美观 易懂 要求有背景 要求引入antd登录表单组件 要求有登录样式 基于antd的表单对页面完成简单的渲染 图示 UI拆解 背景渲染
  • linux spring mvc tomcat配置,Spring MVC配置详解

    一 Spring MVC处理流程 1 Spring MVC将所有请求都交由DispatchServlet进行处理 2 DispatchServlet获取HandlerMapping 处理映射器 然后找到对应的HandlerBean处理Con
  • python列表增加元素的三种方法

    本文主要介绍了关于python列表增加元素的几种操作方法 主要有insert方法 extend方法和append方法 每种方法给大家介绍的非常详细 希望对你有所帮助 1 insert方法 该方法包含两个参数 第一个参数为插入的位置参数 第二
  • 解决Eclipse没有serve及无tomcat9.0

    网上一般提供的 Kepler repository http download eclipse org releases kepler 版本老 在Eclipse help install new 直接输入版本时间 出现如下 我的版本是201

随机推荐

  • 区块链java的demo_区块链-java入门Demo-Go语言中文社区

    正在创建第一个区块链 创建区块 00000d3c0681cd67f8050ab996e1400f99c0060ba4cb22d0c07685d9ae50cd10 正在创建第二个区块链 创建区块 00000eafdd53bed5586d480
  • 使用h5标签需要兼容,不使用没有标签进行语义化,如何取舍?兼容IE6,7,8,canvas,video

    HTML5已向开发人员提供了很多新的标签 如section nav article header和footer等 这些标签语义化程度高 会被经常使用 但在IE6 IE7 IE8和Firefox 2等老式浏览器中却不能识别和正常使用 很多浏览
  • 记录问题: HTTPSConnectionPool(host=‘files.pythonhosted.org‘, port=443): Read timed out.

    python报错 HTTPSConnectionPool host files pythonhosted org port 443 Read timed out 这个问题目前遇到都是因为网速引起的 解决办法是 使用命令 pip instal
  • 国际快递查询代码,网站的online track

    今天高兴了一把 只花了一小片的功夫 解决了一个大问题 哈哈 使用以下代码 就可以使用17track网站来查询国际单号 跟踪快递 航空包裹 不同的是 我可以随意更改自己想要的 比如按钮值 页面样式 增加一些效果等 以下是 文本域可以清空的效果
  • python一维数组变三维数组_python numpy 一维数组转变为多维数组的实例

    python numpy 一维数组转变为多维数组的实例 如下所示 import numpy new list i for i in range 9 numpy array new list reshape 3 3 借助numpy库 以上这篇
  • 服务器上安装anaconda

    1 下载anaconda 这里有两种方法 第一种在官网上下载对应版本的安装包 地址 https www anaconda com products individual 再将安装包上传到服务器 之后输入命令 完成安装 第二种方法 在控制台上
  • Generative AI 新世界

    在上一篇 Generative AI 新世界 大型语言模型 LLMs 概述 中 我们一起探讨了大型语言模型的发展历史 语料来源 数据预处理流程策略 训练使用的网络架构 最新研究方向分析 Amazon Titan LLaMA PaLM E 等
  • android的webView的教程,Android WebView 应用界面开发教程

    WebView组件本身就是一个浏览器实现 Android5 0增强的WebView基于Chromium M37 直接支持WebRTC WebAudio WebGL 开发者可以直接在WebView中使用聚合 Polymer 和Material
  • Python 查找文件夹下某一类型的文件

    查找文件夹下面的某一类型的文件 并输出列表 import os 例如txt格式 def get files list directory file type txt file list for f root f dirs f files i
  • Springboot使用slf4j记录日志

    前言 在项目开发中 记录日志是必做的一件事情 而当我们使用Springboot框架时 记录日志就变得极其简单了 springboot内置了slf4j日志框架 我们只需要添加依赖 做一些简单的配置就ok了 下面 我们就来看看在Springbo
  • python圆的代码:如何使用Python绘制一个圆形

    Python圆的代码可以使用matplotlib库中的Circle函数来实现 Circle函数接受两个参数 一个是圆心的坐标 x y 另一个是圆的半径r 下面是一个简单的Python代码示例 Python圆的代码可以使用matplotlib
  • Matlab连接字符串的方法

    Matlab连接字符串的方法 2011 04 20 13 22 42 转载 标签 杂谈 分类 matlab 在Matlab中 想要将两个字符串连接在一起 有以下的方法 假定有两个字符串 gt gt str1 Iloveyou str2 12
  • 【SQL注入-15】自动化注入案例—以sqli-labs-less9为例(利用sqlmap工具)

    目录 1 前言 2 自动化注入案例 以sqli labs less9为例 2 1 实验平台 2 2 注入前准备 2 3 判断注入点及注入类型 2 3 1 自动判断注入点及注入类型 2 3 2 手动判断注入点及注入点类型 2 4 爆库名 2
  • 云函数部署之网易云

    云函数部署之网易云 云函数 什么是云函数 就是可以让你没有服务器 本地电脑不用下载Python也可以使用这个项目 而且还是白嫖 既解决了很多人部署的麻烦 也给了那些被劝退的朋友回来的勇气 十分钟便可以全部弄完 1 进入云函数 这里拿腾讯云的
  • caffe im2col 详解

    caffe im2col详解 本文讲解的是caffe中卷积过程 众所周知caffe中卷积采用的是im2col和sgemm的方式 网上已经有很多的im2col的讲解 原本不打算写这篇文章 在此不得不吐槽下 网上有不少的讲解caffe im2c
  • redis缓存雪崩、穿透、击穿

    这篇文章我们来了解一下一些redis的高并发问题以及他的解决方法 上图是一个简单的数据查询流程 前台请求 后台先从缓存中取数据 取到直接返回结果 取不到时从数据库中取 数据库取到更新缓存 并返回结果 数据库也没取到 那直接返回空结果 一 r
  • CentOs8 安装 Mysql 8 步骤及问题解决

    1 Mysql数据库采用的版本是Mysql8 在Mysql官方网站 MySQL 下载Mysql安装包 2 安装新版mysql之前 我们需要将系统自带的mariadb lib卸载 执行命令 rpm qa grep mariadb 若检查出系统
  • sql数据库查询

    sql数据库查询要点 查询 在GROUP BY 的后面使用 HAVING指定筛选条件 select from 表 group by 分组条件 having 筛选条件 内连接INNER JOIN 只返回符合条件的值 SELECT FROM t
  • IntelliJ IDEA中如何使用JUnit4

    背景 最近参与了一个Anroid医疗项目 其中项目底层有很多基础类及通讯类 而且很多涉及复杂的字节操作还有多线程同步及状态机处理 这样的项目做一下TDD还是必要的 尽量项目前期把风险降低一些 现在的问题是本人使用的是IntelliJ开发的A
  • 【JavaScript 逆向】猿人学 web 第十八题:jsvmp,洞察先机

    案例目标 网址 第十八题 jsvmp 洞察先机 猿人学 本题目标 抓取 5 页数字 计算加和并提交结果 常规 JavaScript 逆向思路 一般情况下 JavaScript 逆向分为三步 寻找入口 逆向在大部分情况下就是找一些加密参数到底