【js逆向专题】8.webpack打包

news2024/9/21 2:43:05
本教程仅供学习交流使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,请各学员自觉遵守相关法律法规。

小节目标:

  1. 熟悉 webpack打包原理
  2. 熟悉 webpack打包方式
  3. 了解 webpack多模块打包

一. webpack打包

概念:

webpack 是 JavaScript 应用程序的模块打包器,可以把开发中的所有资源(图片、js文件、css文件等)都看成模块,通过loader(加载器)和 plugins (插件)对资源进行处理,打包成符合生产环境部署的前端资源。所有的资源都是通过 JavaScript 渲染出来的。
  • webpack 是一个基于模块化的打包(构建)工具, 它把一切都视作模块

  • 如果一个页面大部分是script标签构成,80%以上是 webpack 打包。

  • 地址:http://cls.cn/telegraph

在这里插入图片描述

1. webpack打包简介

在这里插入图片描述

  • 整个打包的文件是一个自执行函数
  • 方法里面是webpack的加载器
  • 存放的模块就是js的每个功能,可以有两种方式,数组和键值对的形式
2. 加载器样式
  • 加载器是网站的开发人员用工具生成的我们可以不用管直接拿过来用就好(一般加载器的名字都是n可以直接通过加载器的名字定位到打包的位置)
  • 加载器的核心代码
!function (e) {
    // 存放加载器
    var c = {}
    // t是加载器对应的名字
    function n(t) {
        // 创建一个a对象 
        var a = c[t] = {
            i: t, // 表示模块的标识符,它被设置为参数 t。
            l: !1, // 一个布尔值,初始值为 false,用于标记模块是否已经加载。
            exports: {} // 一个空对象,用于将模块的导出内容存储在其中。
        };
        console.log(a)
        // 执行函数里面的方法
        return e[t].call(a.exports, a, a.exports, n),
            // 设置模块已被加载
            a.l = !0,
            a.exports
    }
   //  
    n.m = e
    // 入口
    n(2)
}([])
1. webpack数组形式
  • 给需要处理业务的模块进行打包,通过下标取值
// 这个格式就是webpack
!function (e) {
    // 存放加载器
    var c = {}
    function n(t) {
        var a = c[t] = {
            i: t,
            l: !1,
            exports: {}
        };
        console.log(a)
        return e[t].call(a.exports, a, a.exports, n),
            a.l = !0,
            a.exports
    }
    n.m = e
    // 入口
    n(2)
}([
    // 存放模块
    function () {
        console.log('负责登陆')
    },
    function () {
        console.log('负责注册')
    },
    function () {
        console.log('负责注册')
    }
])


2. webpack对象格式
  • 给需要处理业务的模块进行打包,通过 key 取值
!function (e) {
    var t = {};

// 所有的模块 都是从这个加载器 执行的 分发器
    function n(r) {
        if (t[r])
            return t[r].exports;
        var o = t[r] = {
            i: r,
            l: !1,
            exports: {}
        };
        return e[r].call(o.exports, o, o.exports, n),
            o.l = !0,
            o.exports
    }

    n('xialuo') // 对象 根据KEY 找模块
}({
        0: function () {
            console.log('我是模块1 负责加密')
        },
        'xialuo': function () {
            console.log('我是模块2 负责解密')
        },
        2: function () {
            console.log('我是模块3 负责爬数据')
        }
    }
);
3.多个js文件打包
  • 如果模块比较多,就会将模块打包成JS文件, 然后定义一个全局变量 window["webpackJsonp"] =[ ] ,它的作用是存储需要动态导入的模块,然后重写 window["webpackJsonp"] 数组的 push( ) 方法为 webpackJsonpCallback( ) ,也就是说 window["webpackJsonp"].push( ) 其实执行的是webpackJsonpCallback( ) , window["webpackJsonp"].push( ) 接收三个参数,第一个参数是模块的ID,第二个参数是 一个数组或者对象,里面定义大量的函数,第三个参数是要调用的函数(可选)
    在这里插入图片描述

二.教学案例1

1.逆向目标
  • 首页:https://36kr.com/

  • 逆向参数: password: 8cbf7f88e70300def68533a74c77b785e11d743c77627b624

2. 参数定位
  • 通过登录按钮触发发包请求

  • 关键字定位password

  • xhr断点定位(根据栈堆来进行调试)

在这里插入图片描述

3.逆向代码分析
  • o.a.get(t, "password") 获取网页输入的明文密码
  • Object(i.b)是加密代码
  • Object(i.b)是将i.b包装到新对象中实际使用和i.b()是差不多的
  • 进入加密代码,查看加密逻辑

在这里插入图片描述

  • 可以看到a函数是加密的主体逻辑
  • 通过t的导出的方法进行加密的
  • n可以很明显看出为webpack打包的方法
  • 跟进到加载器的位置,拿到加载器,把需要的方法扣下来就行
4.逆向结果
  • JavaScript代码

在这里插入图片描述

三.教学案例2

1.逆向目标
  • 首页:https://kuajing.pinduoduo.com/login

  • 逆向参数: encryptPassword

2. 参数定位
  • 像这种参数比较特别的,不容易起冲突的关键字可以直接用搜索的方法来进行定位encryptPassword
    在这里插入图片描述
3.逆向代码分析
  • 通过Object(P.a)来实现加密, b.password是明文密码, G.current是秘钥

在这里插入图片描述

  • 可以很直观看出加密方法,o的对象生成是调用了o = t(1394)
  • 我们直接找到加载期去触发1394 的任务就行
  • 秘钥是后台请求返回的,登录接口会请求两次,第一次就是返回的秘钥文件
4.逆向结果
  • JavaScript代码
    在这里插入图片描述

四.教学案例3

1.逆向目标
  • 地址:https://fse.agilestudio.cn/search?keyword=%E7%81%AB%E8%BD%A6%E5%91%BC%E5%95%B8%E8%80%8C%E8%BF%87
  • 逆向参数:X-Signature 请求头数据(主要是扣webpack打包)
2. 参数定位
  • xhr定位数据

  • xhr定位的数据有时候里加密的位置会非常远,尤其是遇见异步加载的方法的时候会更加的难找,遇见异步的时候我们可以用跳过函数执行的方法,先快速的把整个异步方法都过一边,过的过程中看有没有生成我们想要的数据,先粗在细的查找方法对定位会更加有帮助

  • 关键字X-Signature定位

在这里插入图片描述

3.逆向代码分析
  • 调用了_函数e.params是查询字符串的参数
    在这里插入图片描述

  • 赋值了一个时间戳,通过Object(c["a"])对数组键进行处理

  • c是一个加载器进行赋值,需要将加载器扣下来

  • 要是加载的模块比较多的话建议全扣

4.逆向结果
  • JavaScript代码
var c = xxx('b85c')
var crypto = require('crypto-js')
d = function (e) {
    e._ts = (new Date).getTime() - 9999;
    var t, n = Object.keys(e), i = "", o = Object(c["a"])(n.sort());
    try {
        for (o.s(); !(t = o.n()).done;) {
            var a = t.value;
            void 0 !== e[a] && null !== e[a] && (i += "".concat(a, "=").concat(e[a], ","))
        }
    } catch (r) {
        o.e(r)
    } finally {
        o.f()
    };
    return {
        'sign':crypto.MD5(i).toString(),
        'time': e._ts
    }
}

console.log(d({
    "keyword": "火车呼啸而过)",
    "page": 1,
    "limit": 12,
    "_platform": "web",
    "_versioin": "0.2.5"
}))
  • python 代码
import requests
import execjs


class SouZen():

    def __init__(self):
        self.params = {
            "keyword": "火车呼啸而过",
            "page": "2",
            "limit": "12",
            "_platform": "web",
            "_versioin": "0.2.5",
        }
        self.headers = {
            "Origin": "https://fse.agilestudio.cn",
            "Referer": "https://fse.agilestudio.cn/",
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36",
        }
        self.url = "https://fse-api.agilestudio.cn/api/search"

    def get_data(self):
        js = execjs.compile(open('demo.js', encoding='utf-8').read())
        res = js.call('d', self.params)
        self.params['_ts'] = res['time']
        self.headers["X-Signature"] = res['sign']
        response = requests.get(self.url, headers=self.headers, params=self.params)
        print(response.json())

    def parse_data(self):
        pass

    def save_data(self):
        pass


if __name__ == '__main__':
    sz = SouZen()
    sz.get_data()

结语

以上就是关于js逆向技术中的webpack打包全部内容了,欢迎同学们在评论区讨论交流,有任何js逆向、数据采集相关需求也可以V后台regentwan与我联系哟~

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

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

相关文章

【颤抖不再怕,帕金森患者的活力锻炼秘籍!】

Hey小伙伴们~👋 今天我们来聊聊一个温暖而重要的话题——如何帮助我们的亲人或自己,在帕金森病的挑战下,依然保持生活的活力与光彩!🌈 帕金森病,这个名字听起来或许让人心生畏惧,但它绝不是生活…

地产行业如何利用Java实现精准营销

在当今竞争激烈的地产市场中,如何有效触达潜在客户并促进销售转化,成为众多房企关注的焦点。106短信平台作为一种精准的营销工具,在地产行业中发挥着越来越重要的作用。 支持免费对接试用:乐讯通PaaS平台 找好用的短信平台,选择乐…

AUTO TECH 2025 华南展 第十二届广州国际汽车零部件加工技术及汽车模具展览会——探索未来出行的创新动力

AUTO TECH 2025 华南展 第十二届广州国际汽车零部件加工技术及汽车模具展览会——探索未来出行的创新动力 随着全球汽车工业的不断进步和新能源汽车技术的迅猛发展,2025年11月20-22日在广州保利世贸博览馆将迎来一场行业瞩目的盛会——2025 第十二届广州国际汽车零部…

外接串口板,通过串口打开adb模式

一、依赖库 import subprocess import serial from serial.tools import list_ports import logging import time 二、代码 import subprocessimport serial from serial.tools import list_ports import logging import timedef openAdb(com):# com []# for i in list_por…

无人机之地面站篇

无人机的地面站,又称无人机控制站,是整个无人机系统的重要组成部分,扮演着作战指挥中心的角色。以下是对无人机地面站的详细阐述: 一、定义与功能 无人机地面站是指具有对无人机飞行平台和任务载荷进行监控和操纵能力的一组设备&…

[数据集][目标检测]翻越栏杆行为检测数据集VOC+YOLO格式512张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):512 标注数量(xml文件个数):512 标注数量(txt文件个数):512 标注类别…

通过卷积神经网络(CNN)识别和预测手写数字

一:卷积神经网络(CNN)和手写数字识别MNIST数据集的介绍 卷积神经网络(Convolutional Neural Networks,简称CNN)是一种深度学习模型,它在图像和视频识别、分类和分割任务中表现出色。CNN通过模仿…

快排的深入学习

目录 交换类排序 一、冒泡排序 1. 算法介绍 2.算法流程 3. 算法性能分析 (1)时间复杂度分析 (2) 空间复杂度分析 冒泡排序的特性总结: 二、快速排序 1.算法介绍 2. 执行流程 1). hoare版本 2). 挖坑法 3)…

5.9灰度直方图

目录 实验原理 实验代码 运行结果 实验原理 calcHist 函数通常是指在计算机视觉和图像处理中用于计算图像直方图的一个函数。 cv:calcHist () 用于计算一个或多个数组的直方图。它可以处理图像数据并返回一个表示像素强度分布的向量(对于灰度图像)或…

Java:集合的相关汇总介绍

主要包含Set(集)、 List(列表包含 Queue)和 Map(映射)。 1、Collection: Collection 是集合 List、 Set、 Queue 的最基本的接口。 2、Iterator:迭代器,可以通过迭代器遍历集合中的数据。 3、Map:是映射表的…

VTK随笔十三:QT与VTK的交互

一、基于 Ot的 VTK 应用程序 以 VTK 读入一幅 JPG 图像,然后在 Qt 界面上使用 VTK 显示该图像为例,演示QT与VTK的交互。 1、创建QT项目QT_VTK_Demo 2、配置VTK库 在CMakeLists.txt中添加如下代码: 配置完成后重新打开工程加载VTK库。 3、编…

制裁下的转型:俄罗斯加密货币战略布局与人民币挂钩BRICS稳定币的崛起

在国际制裁重压下,俄罗斯正在积极推进加密货币政策改革,通过设立加密货币交易所和推动与人民币挂钩的BRICS稳定币,试图在全球金融体系中谋求新的生存与发展路径。这一系列举措标志着俄罗斯在数字经济领域的重大转向,既是对当前经济…

Linux【5】远程管理

目录 shutdown关机 ifconfig输出网卡信息 ping ip地址——检测连接正常 ssh 【-p port】 userip scp不同主机之间的文件copy 当前文件复制到远程 远程文件复制到本地 复制文件夹 -r shutdown关机 shutdown -r 重启 ifconfig输出网卡信息 ping ip地址——检测连接正常…

集成电路学习:什么是PCB印刷电路板

一、PCB:印刷电路板 PCB,全称为Printed Circuit Board,即印刷电路板,是现代电子设备中不可或缺的基础构件。它作为电子元器件的载体和连接体,在电子设备中发挥着至关重要的作用。以下是对PCB的详细解析: 二…

【C++初阶】一、C++入门(万字总结)

「前言」 「专栏」C详细版专栏 🌈个人主页: 代码探秘者 🌈C语言专栏:C语言 🌈C专栏: C 🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅 目录 一、关于C 1.1 什么是C 1.2 C 发展史 二、C关键字(C…

5.8幂律变换

目录 示例代码1 运行结果1 示例代码2 运行结果2 补充示例原理 示例:使用cv::pow进行图像处理 代码 运行结果 ​编辑 补充 实验代码3 运行结果3​编辑 在OpenCV中,幂律变换(Power Law Transformations)是一种常用的图像…

集成电路学习:什么是MOSFET(MOS管)

一、MOSFET:MOS管 MOSFET,全称Metal-Oxide-Semiconductor Field-Effect Transistor,即金属-氧化物半导体场效应晶体管,也常被称为MOS管或金氧半场效晶体管。它是一种可以广泛使用在模拟电路与数字电路的场效应晶体管(f…

【游戏安全】CheatEngine基础使用——如何对不同类型的数值进行搜索?如何破解数值加密找到想修改的数值?

游戏安全 不同数值类型的搜索破解简单数值加密 不同数值类型的搜索 可以在游戏中看到很精确的物品数量,但是在CE中却什么都扫不到。 这是因为他的数值类型可能并不是四字节的,在游戏中这个数值的机制是一个慢慢增长的数值,所以他很有可能是…

【重学 MySQL】八、MySQL 的演示使用和编码设置

【重学 MySQL】八、MySQL 的演示使用和编码设置 MySQL 的使用演示登录 MySQL查看所有数据库创建数据库使用数据库创建表插入数据查询数据删除表或数据库注意事项 MySQL 的编码设置查看 MySQL 支持的字符集和排序规则服务器级别的编码设置数据库级别的编码设置表级别的编码设置列…

Python3.8绿色便携版嵌入式版制作

Python 的绿色便携版有两种:官方 Embeddable 版本(嵌入式版);安装版制作的绿色版。Embeddable 版适用于需要将 Python 集成到其他应用程序或项目中的情况,它不包含图形界面的安装程序,只提供了 Python 解释器和必要的库文件。安装版包含了 Python 解释器、标准库和其他一些…