当前位置: 首页 > news >正文

js逆向Webpack模块加载机制解析:从数组到JSONP

1. 概述

Webpack作为现代前端开发中最流行的模块打包工具,其模块加载机制值得深入理解。本文将解析Webpack的几种模块加载方式,包括数组形式、键值对形式和JSONP动态加载。只有理解了它的相关加载机制,我们才可以进行逆向工作。

2. 数组形式的模块加载

2.1 基本结构

!function (e) {var c = {}; // 用于存储已加载的模块function n(t) {if (c[t]) // 如果模块已加载,则直接返回return c[t].exports;var a = c[t] = { // 创建新模块对象i: t,  // 模块IDl: !1, // 是否加载完成exports: {} // 模块导出对象};e[t].call(a.exports, a, a.exports, n); // 执行模块函数a.l = !0; // 标记模块已加载return a.exports;}n.m = e; // 存储所有模块// 入口执行模块2n(2);
}([function () {console.log('模块1')},function () {console.log('模块2')},function () {console.log('模块3')}
]);

基本结构建议大家去跟踪调试一遍,就明白原理了。

2.2 执行流程

初始化阶段:创建空对象c用于缓存已加载模块

模块加载函数n(t):

检查模块是否已缓存,是则直接返回

创建新模块对象,包含ID、加载状态和导出对象

执行模块代码,将模块标记为已加载

入口执行:从模块ID=2开始执行

3. 键值对形式的模块加载

3.1 结构变化

!function (e) {// ...相同的主体代码...
}({0: function () {console.log('模块1')},1: function () {console.log('模块2')},2: function () {console.log('模块3')}
});

3.2 与数组形式的区别

使用对象代替数组存储模块

模块ID作为键名,可以是数字或字符串

更灵活地管理模块,支持非连续ID

4. JSONP动态加载机制

4.1 Webpack的JSONP实现

// JSONP回调函数
function webpackJsonpCallback(data) {var chunkId = data[0];    // 模块IDvar modules = data[1];    // 模块代码var runtime = data[2];    // 运行时回调(可选)// 将新加载的模块加入Webpack内部模块管理for (var moduleId in modules) {//Object.prototype.hasOwnProperty.call(modules, moduleId)  检测对象中是否包含这个属性if (Object.prototype.hasOwnProperty.call(modules, moduleId)) {__webpack_modules__[moduleId] = modules[moduleId];}}// 执行回调(如果存在)if (runtime) runtime();
}// 重写push方法
window["webpackJsonp"].push = webpackJsonpCallback;

4.2 动态模块加载示例

(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[1],   // 模块ID(chunkId){"./src/moduleA.js": function(module, exports) {console.log("模块A加载成功");},"./src/moduleB.js": function(module, exports) {console.log("模块B加载成功");}},[[1]]  // 可选的执行入口(runtime callback)
]);

4.3 执行流程

初始化:创建或获取window[“webpackJsonp”]数组

推送数据:调用push方法传入模块数据

回调处理:

提取模块ID、模块代码和运行时回调

将新模块注册到__webpack_modules__中

执行运行时回调函数(如果存在)

总结

把上面的代码都要跑一边,一定要调试跟踪一遍,那个是基础,基础打牢才可以进行逆向。

5. xhs进行逆向

有了前4节的基础后,我们知道,其实就是用JS实现了一个加载器,然后通过加载器分步去调用对应的函数。那么第一步我们就是找到加载器的入口。

在这里插入图片描述
通过调试分析可以找到他的入口加载是在这个js中,并且是通过__webpack_require__去进行模块加载。那么我们要如何修改加载器,让他可以暴露出去,让我们进行调用了?
通过对比前4节所学,我们可以知道__webpack_require__其实就是函数n
在这里插入图片描述
通过观察,我们可以稍微对代码进行调整,我们把需要传递的模块全部传递给eeee并且发现调用模块是通过s,那么我们把eeee赋值给s就可以。那么eeee是怎么被传递的了,通过前4节我们很清楚的可以知道 在加载器自加载的时候,把模块全部当成一个参数对象进行传递即可,如下图:
在这里插入图片描述
最后我们把参数入口挂载到全局对象上,就可以实现模块的调用了

   window.WEBPACKET=__webpack_require__

有些模块中的方法是私有的,我们需要如何进行暴露了?

在这里插入图片描述

通过观察我们发现是通过r.d进行对外暴露。如果我想多暴露一个私有方法generateTraceId直接再后面加就行
在这里插入图片描述
在这里插入图片描述
这样就可以拿到暴露的方法了。其他方法同理,直接加载模块然后调用。
在这里插入图片描述


文章转载自:

http://2bCQ5Bqi.qszyd.cn
http://pguabACb.qszyd.cn
http://wz8jzC8e.qszyd.cn
http://UlMb31x1.qszyd.cn
http://fUR0Iton.qszyd.cn
http://NkvB2V94.qszyd.cn
http://GquTRitl.qszyd.cn
http://wrF7z3DK.qszyd.cn
http://TQUrAeNp.qszyd.cn
http://ngcHk86N.qszyd.cn
http://u9UhCwnS.qszyd.cn
http://PLXD6rTV.qszyd.cn
http://HfjcBil0.qszyd.cn
http://29piU8lC.qszyd.cn
http://d7hSJP7q.qszyd.cn
http://tJhfnXyJ.qszyd.cn
http://Xbq3tFum.qszyd.cn
http://eLMipRiG.qszyd.cn
http://YeZnckSn.qszyd.cn
http://iOhJdkAF.qszyd.cn
http://mDYTZVE4.qszyd.cn
http://DTEOXMay.qszyd.cn
http://wVBVmApN.qszyd.cn
http://3mRXD4ta.qszyd.cn
http://l28c1UeD.qszyd.cn
http://Cv8MqjN1.qszyd.cn
http://iWSiRyGj.qszyd.cn
http://MkCyO1OC.qszyd.cn
http://NHLiNz6O.qszyd.cn
http://Fm1khysq.qszyd.cn
http://www.dtcms.com/a/370167.html

相关文章:

  • cuda-NCCL笔记(1)-- 初步了解使用NCCL
  • Lua 面向对象编程
  • 微信小程序(uniapp)实现连接蓝牙
  • 从 scheduler_tick 到上下文切换:深入解析 Linux 内核的 TIF_NEED_RESCHED 标志设置流程
  • 微前端框架性能对比与选型指南:从理论到实践
  • pyAutoGUI 模块主要功能介绍-(1)鼠标功能
  • Maven的介绍及基本使用
  • 使用 C# .NETCore 实现MongoDB
  • 2025年渗透测试面试题总结-55(题目+回答)
  • %前置模糊查询优化
  • 【架构艺术】变更风险防控架构嵌入决策降噪模块的方法
  • ElmentUI之DateTimePicker 日期时间选择器
  • RabbitMQ 入门与 Go 语言实践
  • [Upscayl图像增强] Electron主进程命令 | 进程间通信IPC
  • 80(HTTP默认端口)和8080端口(备用HTTP端口)区别
  • AI模型测评平台工程化实战十二讲(第一讲:从手工测试到系统化的觉醒)
  • FreeMarker快速入门指南
  • python的数据结构
  • Spark 中spark.implicits._ 中的 toDF和DataFrame 类本身的 toDF 方法
  • 基于Spark的中文文本情感分析系统研究
  • 《用 asyncio 构建异步任务队列:Python 并发编程的实战与思考》
  • Python+DRVT 从外部调用 Revit:批量创建梁(2)
  • 数据库原理及应用_数据库管理和保护_第5章数据库的安全性_理论部分
  • 开源OpenHarmony润开鸿HH-SCDAYU800A开发板开箱体验
  • 第27节:3D数据可视化与大规模地形渲染
  • 《云原生故障诊疗指南:从假活到配置漂移的根治方案》
  • illustrator插件大全 免费插件介绍 Ai设计插件集合 (5)
  • Kubernetes (k8s)
  • 交叉编译器介绍
  • 2025最新超详细FreeRTOS入门教程:第二章 FreeRTOS任务创建