JS逆向:Webpack打包后的代码怎么搞?猿人学爬虫比赛第十六题详细题解

2023-11-02

实战地址

http://match.yuanrenxue.com/match/16

抓包分析

地址栏输入 地址,按下F12并回车,发现数据在这里:

查看cookie,无加密相关的字段。请求的接口倒是有个m的加密参数,看来这题的主要目的就是 看看m参数怎么进行加密的吧。

切换 Initiator,这请求也太明显了,点击下面所示的js文件:

跟进去并美化后,来到这里:

不用过多分析,m加密在这里:

r.m = n[e(528)](btoa, p_s),
r.t = p_s;

而这个实参 p_s 是由上面的这行代码生成的:

p_s = Date[e(496)](new Date)[e(517)]();

 

在 r.m 赋值的这行打上断点,请求第二页,控制台输入 btoa 并回车,双击跟进,来到这里:

看这个混淆,很明显的 obfuscator 混淆,直接将整个 732 copy下来保存到文件,并写出AST插件进行反混淆:

进行反混淆和删除垃圾代码,优化后的btoa函数:

function btoa(e) {
  var f = "U9876543210zyxwvutsrqpomnlkjihgfdecbaZXYWVUTSRQPONABHICESQWK2Fi+9876543210zyxwvutsrqpomnlkjihgfdecbaZXYWVUTSRQPONABHICESQWK2Fi";
  for (var o, a, s, l = 0, c = []; l < e["length"];) {
    a = e["charCodeAt"](l), s = l % 6;
    switch (s) {
      case 0:
        c["push"](f["charAt"](a >> 2));
        break;


      case 1:
          c["push"](f["charAt"]((2 & o) << 3 | a >> 4));
        break;


      case 2:
        c["push"](f["charAt"]((15 & o) << 2 | a >> 6)), c["push"](f["charAt"](a & 63));
        break;


      case 3:
        c["push"](f["charAt"](a >> 3));
        break;


      case 4:
        c["push"](f["charAt"]((o & 4) << 6 | a >> 6));
        break;


      case 5:
        c["push"](f["charAt"]((o & 15) << 4 | a >> 8)), c["push"](f["charAt"](a & 63));
    }


    o = a, l++;
  }
  
  c["push"](f["charAt"]((o & 3) << 4)), c["push"]("FM");
  
  return d(15) + md5(c["join"]("")) + d(10);
}

这里可以看到还有 d 函数 和 md5 函数,分别进行抠取和优化。

优化后的d函数:

function d(e) {
  e = e ||32;
  var l = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678";
  var s = l["length"];
  var c = "";
  for (i = 0; i < e; i++) c += l["charAt"](Math["floor"](Math["random"]() * s));
  return c;
}

优化后的md5函数:

function md5(e) {
  function o(e, n) {
    e[n >> 5] |= 128 << n % 32;
    e[(n + 64 >>> 9 << 4) + 14] = n;
    var b = 1732584193;
    var x = -271733879;
    var T = -1732584194;
    var w = 271733878;


    for (var d = 0; d < e["length"]; d += 16) {
      var m = b;
      var y = x;
      var v = T;
      var g = w;
      b = s(b, x, T, w, e[d + 0], 7, -680976936);
      w = s(w, b, x, T, e[d + 1], 12, -389564586);
      T = s(T, w, b, x, e[d + 2], 17, 606105819);
      x = s(x, T, w, b, e[d + 3], 22, -1044525330);
      b = s(b, x, T, w, e[d + 4], 7, -176418897);
      w = s(w, b, x, T, e[d + 5], 12, 1200080426);
      T = s(T, w, b, x, e[d + 6], 17, -1473231341);
      x = s(x, T, w, b, e[d + 7], 22, -45705983);
      b = s(b, x, T, w, e[d + 8], 7, 1770035416);
      w = s(w, b, x, T, e[d + 9], 12, -1958414417);
      T = s(T, w, b, x, e[d + 10], 17, -42063);
      x = s(x, T, w, b, e[d + 11], 22, -1990404162);
      b = s(b, x, T, w, e[d + 12], 7, 1804550682);
      w = s(w, b, x, T, e[d + 13], 12, -40341101);
      T = s(T, w, b, x, e[d + 14], 17, -1502002290);
      x = s(x, T, w, b, e[d + 15], 22, 1236531029);
      b = l(b, x, T, w, e[d + 1], 5, -165796510);
      w = l(w, b, x, T, e[d + 6], 9, -1069501632);
      T = l(T, w, b, x, e[d + 11], 14, 643717713);
      x = l(x, T, w, b, e[d + 0], 20, -373897302);
      b = l(b, x, T, w, e[d + 5], 5, -701520691);
      w = l(w, b, x, T, e[d + 10], 9, 38016083);
      T = l(T, w, b, x, e[d + 15], 14, -660478335);
      x = l(x, T, w, b, e[d + 4], 20, -405537848);
      b = l(b, x, T, w, e[d + 9], 5, 568446438);
      w = l(w, b, x, T, e[d + 14], 9, -1019803690);
      T = l(T, w, b, x, e[d + 3], 14, -187363961);
      x = l(x, T, w, b, e[d + 8], 20, 1163531501);
      b = l(b, x, T, w, e[d + 13], 5, -1444681467);
      w = l(w, b, x, T, e[d + 2], 9, -51403784);
      T = l(T, w, b, x, e[d + 7], 14, 1735328473);
      x = l(x, T, w, b, e[d + 12], 20, -1921207734);
      b = u(b, x, T, w, e[d + 5], 4, -378558);
      w = u(w, b, x, T, e[d + 8], 11, -2022574463);
      T = u(T, w, b, x, e[d + 11], 16, 1839030562);
      x = u(x, T, w, b, e[d + 14], 23, -35311556);
      b = u(b, x, T, w, e[d + 1], 4, -1530992060);
      w = u(w, b, x, T, e[d + 4], 11, 1272893353);
      T = u(T, w, b, x, e[d + 7], 16, -155497632);
      x = u(x, T, w, b, e[d + 10], 23, -1094730640);
      b = u(b, x, T, w, e[d + 13], 4, 681279174);
      w = u(w, b, x, T, e[d + 0], 11, -358537222);
      T = u(T, w, b, x, e[d + 3], 16, -722881979);
      x = u(x, T, w, b, e[d + 6], 23, 76029189);
      b = u(b, x, T, w, e[d + 9], 4, -640364487);
      w = u(w, b, x, T, e[d + 12], 11, -421815835);
      T = u(T, w, b, x, e[d + 15], 16, 530742520);
      x = u(x, T, w, b, e[d + 2], 23, -995338651);
      b = c(b, x, T, w, e[d + 0], 6, -198630844);
      w = c(w, b, x, T, e[d + 7], 10, 11261161415);
      T = c(T, w, b, x, e[d + 14], 15, -1416354905);
      x = c(x, T, w, b, e[d + 5], 21, -57434055);
      b = c(b, x, T, w, e[d + 12], 6, 1700485571);
      w = c(w, b, x, T, e[d + 3], 10, -1894446606);
      T = c(T, w, b, x, e[d + 10], 15, -1051523);
      x = c(x, T, w, b, e[d + 1], 21, -2054922799);
      b = c(b, x, T, w, e[d + 8], 6, 1873313359);
      w = c(w, b, x, T, e[d + 15], 10, -30611744);
      T = c(T, w, b, x, e[d + 6], 15, -1560198380);
      x = c(x, T, w, b, e[d + 13], 21, 1309151649);
      b = c(b, x, T, w, e[d + 4], 6, -145523070);
      w = c(w, b, x, T, e[d + 11], 10, -1120210379);
      T = c(T, w, b, x, e[d + 2], 15, 718787259);
      x = c(x, T, w, b, e[d + 9], 21, -343485551);
      b = f(b, m);
      x = f(x, y);
      T = f(T, v);
      w = f(w, g);
    }


    return Array(b, x, T, w);
  }


  function a(e, n, r, o, a, s) {
    return f(d(f(f(n, e), f(o, s)), a), r);
  }


  function s(e, n, r, o, s, l, u) {
    return a(n & r | ~n & o, e, n, s, l, u);
  }


  function l(e, n, r, o, s, l, u) {
    return a(n & o | r & ~o, e, n, s, l, u);
  }


  function u(e, n, r, o, s, l, u) {
    return a(n ^ r ^ o, e, n, s, l, u);
  }


  function c(e, n, r, o, s, l, u) {
    return a(r ^ (n | ~o), e, n, s, l, u);
  }


  function f(e, n) {
    var o = (65535 & e) + (n & 65535),
        a = (e >> 16) + (n >> 16) + (o >> 16);
    return a << 16 | o & 65535;
  }


  function d(e, n) {
    return e << n | e >>> 32 - n;
  }


  function p(e) {
    for (var r = Array(), o = 65535, a = 0; a < e["length"] * 16; a += 16) r[a >> 5] |= (e["charCodeAt"](a / 16) & o) << a % 32;


    return r;
  }


  function h(e) {
    for (var r = "0123456789abcdef", o = "", a = 0; a < e["length"] * 4; a++) o += r["charAt"](15 & e[a >> 2] >> a % 4 * 8 + 4) + r["charAt"](15 & e[a >> 2] >> a % 4 * 8);


    return o;
  }


  return function (e) {
    return h(o(p(e), 16 * e["length"]));
  }(e);
}

代码合并后,运行不再报错。很快就写出了 Python代码:

# -*- coding: utf-8 -*-
import time
import execjs
import requests




def main():
    sums = 0
    headers = {"User-Agent": "yuanrenxue.project",}


    with open("decode_16.js","r",encoding = "utf-8") as fp:
        jscode = fp.read()


    ctx = execjs.compile(jscode)
    
    for i in range(1, 6):
        t = str(int(time.time()*1000))


        m = ctx.call("btoa",t)
        
        params = {
            "m":m,
            "page":i,
            "t":t,
            }
        response = requests.get(url="http://match.yuanrenxue.com/api/match/16",params = params,headers=headers).json()
        for each in response["data"]:
            sums += each["value"]
    print(sums)
    # 287383




if __name__ == "__main__":
    main()


对于这个webpack打包的网站来说,基本没啥难度吧,先优化一波,去混淆,删除垃圾代码,再缺啥补啥就好,浏览器相关的都不用补。

当然,webpack也有技巧,不过很少用的,无脑抠就好,然后缺啥补啥

我也不喜欢一大坨代码搞在一起,简单点,事情简单点,心情或许会好很多。

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

JS逆向:Webpack打包后的代码怎么搞?猿人学爬虫比赛第十六题详细题解 的相关文章

随机推荐

  • JVM垃圾回收器

    目录 串行垃圾回收器 Serial Collector 并发式垃圾回收器 7种经典垃圾回收器 Serial 收集器 ParNew收集器 Parallel Scavenge收集器 CMS收集器 G1收集器 小结 常用参数 按垃圾回收器的线程数
  • [管理与领导-74]:IT基层管理者 - 辅助技能 - 4- 职业发展规划 - 构建自己的个人品牌

    前言 一 什么是信任账户 在职场中受到信任是建立良好声誉和专业形象的基础 以下是一些可以帮助职场人受到信任的方法 诚实守信 始终保持诚实和可靠的行为 遵守诺言 履行承诺 不轻易背信弃义 专业素养 展现专业的知识和技能 以及对工作的敬业精神
  • 51单片机学习之-串口中断

    串口中断 SM2 多机通信控制位 0 数据直接进入SBUF 并同时使R1致1 T1 发送中断标志位 发送数据自动由硬件置1 并且同时执行中断程序 也必须在中断程序中写0 RI 接收中断标志位 收到数据自动由硬件置1 并且同时执行中断程序 也
  • 全球与中国注塑磁体市场竞争策略分析及投资前景研究报告2021-2027年版

    全球与中国注塑磁体市场竞争策略分析及投资前景研究报告2021 2027年版 2020年 全球注塑磁体市场规模达到了 亿元 预计2027年将达到 亿元 年复合增长率 CAGR 为 本报告研究全球与中国市场注塑磁体的产能 产量 销量 销售额 价
  • 华为云云服务器评测|前端开发同学的初体验部署贪吃蛇!

    文章目录 前言 初配置 初始化宝塔面板 安装Nginx 上传项目 修改nginx配置 效果展示 前言 作为一名前端同学 我的技能和日常工作主要集中在用户界面的设计和交互上 与服务器产品相关的经验相对较少 正好看到了咱们华为云开展的评测活动
  • pta冒泡排序c语言_PTA 冒泡排序

    编程实现冒泡排序函数 void bubbleSort int arr int n 其中arr存放待排序的数据 n为数组长度 1 n 1000 函数接口定义如下 对长度为n的数组arr执行冒泡排序 void bubbleSort int ar
  • 统计学习:ANOVA(方差分析)(1)

    统计学习 最近在处理数据的过程中 越发发觉自己理论知识的薄弱 因此 开始了这一系列的帖子 记录自己的理论补充过程 同时方便后来人理解 ANOVA 方差分析 方差分析 Analysis of Variance 简称ANOVA 又称 变异数分析
  • 思科配置STP生成树协议

    第一步 给所有接口开trunk 第二步 左边的三层交换机和右边的三层交换机建立vlan 并给上IP地址 第三步 下面的二层交换机创建两个vlan 第四步 左边三层交换机配置 spanning tree mode pvst 开启vlan快速生
  • netty实现websocket推送消息

    前言 由于http协议为应答模式的连接 无法保持长连接于是引入了websocket套接字长连接概念 能够保持数据持久性的交互 本篇文章将告知读者如何使用netty实现简单的消息推送功能 websocket请求头 GET HTTP 1 1 H
  • apt 安装nginx

    ubuntu和debain下的apt方式安装软件很方便 特别是对于新手安装和卸载nginx 由于nginx不能动态添加模块 所以会经常安装和卸载 升级 apt安装nginx方法 sudo apt add repository ppa ngi
  • 旋转轴、旋转矩阵、四元数之间相互转换

    1 旋转轴To四元数 假设某个旋转是绕单位向量 n n x n y n z n n x n y n z n nx ny nz 进行了角度为 theta 的旋转 那么这个旋转的四元数形式为 q c o s 2 n x s i n 2 n y
  • java排查一个线上死循环cpu暴涨的过程

    问题 打一个页面cpu暴涨 打开一次就涨100 一会系统就卡的不行了 排查方法 因为是线上的linux 没有用jvm监控工具rim链接上去 只好用命令排查 top cpu排序 一个java进程cpu到500 了 什么鬼 查到对应java进程
  • 通过反射获取对象的所有属性&&表格的行转对象

    获取对象的属性并赋值 获取对象的属性方法 getFields 获得某个类的所有的公共 public 的字段 包括父类中的字段 getDeclaredFields 获得某个类的所有声明的字段 即包括public private和protece
  • 【图解】ERP系统如何操作?具体步骤是什么?

    信息时代 对于企业来说 实现统筹化管理 提升办公效率 这就是管理的王道 那么 如何快速实现这一目标呢 这就离不开ERP系统的使用了 在这里 我们就以智邦国际ERP系统的基本操作为例 给大家讲述一下 1 登录系统 每个企业的员工 对计算机知识
  • Java对blob文件的保存和解析

    1 在Java中经常需要保存一个xml文件到数据中 这个时候blob是最好的选择 但是保存的时候发现可不是那么容易的 网上很多资料都是先保存一个空的数据 再一点点插入进去 InputStream in new FileInputStream
  • STM32F103系列定时器TIM2 产生多路PWM —占空比可修改

    STM32F103系列定时器TIM2 产生多路PWM 占空比可修改 一 查看手册 手册中标明 当PA0 PA3当做TIM2 PWM输出时需要打开重映射功能GPIO PinRemapConfig GPIO PartialRemap2 TIM2
  • 【转载】十进制小数转二进制小数方法

    十进制小数转二进制小数方法 十进制小数 二进制小数 方法 乘2取整 对十进制小数乘2得到的整数部分和小数部分 整数部分既是相应的二进制数码 再用2乘小数部分 之前乘后得到新的小数部分 又得到整数和小数部分 如此不断重复 直到小数部分为0或达
  • 很多人都不知道的监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法

    在实际的应用中 我们常常需要实现在移动app和浏览器中点击返回 后退 上一页等按钮实现自己的关闭页面 调整到指定页面或执行一些其它操作的 需求 那在代码中怎样监听当点击微信 支付宝 百度糯米 百度钱包等app的返回按钮或者浏览器的上一页或后
  • STM32进入Standby模式并唤醒

    项目背景 设备具备电池 电源适配器两种供电方式 实现出厂 和电池一并密封装盒 时最低功耗 即进入待机模式 到用户开始使用时需要手动磁棒唤醒 开始复位运行 在检测到设备是交流供电时 设备全速运行 检测到是电池供电时 定时采集数据 采集完毕进入
  • JS逆向:Webpack打包后的代码怎么搞?猿人学爬虫比赛第十六题详细题解

    实战地址 http match yuanrenxue com match 16 抓包分析 地址栏输入 地址 按下F12并回车 发现数据在这里 查看cookie 无加密相关的字段 请求的接口倒是有个m的加密参数 看来这题的主要目的就是 看看m