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://www.pswp.cn/web/95844.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95844.shtml
英文地址,请注明出处:http://en.pswp.cn/web/95844.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Joplin-解决 Node.js 中 “digital envelope routines::unsupported“ 错误

解决 Node.js 中 “digital envelope routines::unsupported” 错误 在使用 Webpack 构建 Joplin 插件时,你可能会遇到 error:0308010C:digital envelope routines::unsupported 错误。这个错误看起来很复杂,但实际上有明确的原因和解决方案。 错误原因…

UE5 UAT

通过UAT 打包的流程&#xff0c;先整理这么点入口// Engine\Source\Programs\AutomationTool\Program.cs /// <summary> /// Main entry point /// </summary> public partial class Program {public static async Task<int> Main(string[] Arguments){Logge…

Python带状态生成器完全指南:从基础到高并发系统设计

引言&#xff1a;状态化生成器的核心价值在复杂系统开发中&#xff0c;带状态的生成器是处理复杂逻辑的核心工具。根据2024年Python开发者调查报告&#xff1a;78%的状态机实现使用带状态生成器85%的数据管道依赖状态化生成器92%的并发系统需要状态管理65%的算法优化通过状态化…

Python元组:不可变但灵活的数据容器

Python元组&#xff1a;不可变但灵活的数据容器 元组(tuple)是Python中一种不可变(immutable)但功能灵活的有序集合数据类型&#xff0c;具有以下核心特性&#xff1a;一、基本特性 不可变性‌&#xff1a;创建后不能修改元素&#xff08;增删改操作均不允许&#xff09; 有序存…

FastGPT源码解析 Agent 大模型对接接口和使用详解

FastGPT 大模型对接核心代码分析 核心架构概览 FastGPT 采用统一模型抽象层设计&#xff0c;通过标准化接口对接多种大模型&#xff0c;支持 LLM、Embedding、ReRank、TTS、STT 等多种 AI 能力。 支持各种大模型能力的配置&#xff0c;包括本地ollama、各个AI云厂商的API接入配…

AI Compass前沿速览:Kimi K2、InfinityHuman-AI数字人、3D-AI桌面伴侣、叠叠社–AI虚拟陪伴

AI Compass前沿速览&#xff1a;Kimi K2、InfinityHuman-AI数字人、3D-AI桌面伴侣、叠叠社–AI虚拟陪伴 AI-Compass 致力于构建最全面、最实用、最前沿的AI技术学习和实践生态&#xff0c;通过六大核心模块的系统化组织&#xff0c;为不同层次的学习者和开发者提供从完整学习路…

如何下载B站视频,去水印,翻译字幕

首先先来看下如何下载B站视频及音频工具&#xff1a;手机下载视频打开文件管理器&#xff0c;找到video.m4s和audio.m4s两个文件更改文件后缀名第一步到此为止然后我们再来看一下如何去水印&#xff0c;去字幕工具&#xff1a;剪映导入视频选择蒙版 > 镜面点击反转点击基础&…

用 Cursor AI 快速开发你的第一个编程小程序

Cursor AI 作为新一代 AI 编程助手&#xff0c;集成了代码补全、智能调试、自动生成等强大功能&#xff0c;非常适合用来开发小型应用或小程序。本文我将手把手带你用 Cursor AI 开发一个简单的天气查询小程序&#xff0c;并在文中推荐一门实用的商业变现课程&#xff0c;助你走…

MacOS 使用 luarocks+wrk+luajit

MacOS 使用 luarockswrkluajit luarocks 默认使用的是 lua 5.4 版本&#xff0c;一些工具&#xff0c;例如 wrk 使用的 lua 5.1&#xff0c;那么 luarocks 在安装依赖的时候就需要指定 lua 5.1。 luarocks config 配置 lua 5.1 请确保已经安装了 lua5.1 或者 luajit&#xff0c…

PostgreSQL18-FDW连接的 SCRAM 直通身份验证

PostgreSQL18-FDW连接的 SCRAM 直通身份验证 PostgreSQL 18 为使用 postgres_fdw 或 dblink_fdw 的人带来了很好的改进&#xff1a;SCRAM 直通身份验证。设置外部服务器连接时&#xff0c;您不再需要在“用户映射”选项中存储纯文本密码。 这是实现它的提交&#xff1a; commit…

“卧槽,系统又崩了!”——别慌,这也许是你看过最通俗易懂的分布式入门

在分布式系统中&#xff0c;有效应对节点故障、网络分区延迟和数据一致性等挑战至关重要。本文将剖析保障分布式系统可靠性的核心机制&#xff1a;数据分片实现水平扩展&#xff0c;冗余副本保障数据高可用&#xff0c;租约&#xff08;Lease&#xff09;机制优化节点状态共识与…

【代码随想录算法训练营——Day4】链表——24.两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题02.07.链表相交、142.环形链表II

LeetCode题目链接 https://leetcode.cn/problems/swap-nodes-in-pairs/ https://leetcode.cn/problems/remove-nth-node-from-end-of-list/ https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/description/ https://leetcode.cn/problems/linked-list-cycle…

C#中一段程序类比博图

using system //博图中要使用自带指令库&#xff0c;指令库名称叫systemnamespace Simple//博图建立程序&#xff0c;分诊断文件夹&#x1f4c2;&#xff0c;vision文件夹&#xff0c;通讯Db文件夹&#x1f4c2;等等&#xff0c;simple类似博图中的文件夹名称{class Program//程…

vue飞自在酒店管理系统(代码+数据库+LW)

摘 要 近年来&#xff0c;随着科技的迅猛进步和经济全球化的深入发展&#xff0c;互联网技术正以前所未有的速度提升社会综合发展的效能。这一技术的影响力已渗透到各行各业&#xff0c;其中&#xff0c;飞自在酒店管理系统在互联网时代背景下扮演着举足轻重的角色。信息管理…

2025年统计与数据分析领域专业认证发展指南

在数据驱动决策日益重要的背景下&#xff0c;专业认证作为提升统计学和数据分析能力的一种方式&#xff0c;受到越来越多从业者的关注。本文基于行业发展趋势&#xff0c;分析6个相关领域的专业资格认证&#xff0c;为专业人士提供参考。一、数据分析能力认证含金量CDA数据分析…

激光频率梳 3D 轮廓测量 - 油路板的凹槽深度和平面度测量

一、引言油路板作为液压系统核心部件&#xff0c;其凹槽深度与平面度精度直接影响油液流动特性与密封性能。传统测量方法在面对复杂油路结构时存在效率低、精度不足等问题。激光频率梳 3D 轮廓测量技术凭借时频基准优势&#xff0c;为油路板关键参数测量提供了新路径&#xff0…

七彩喜微高压氧舱:科技与体验的双重革新,重新定义家用氧疗新标杆

在高压氧舱市场竞争日益激烈的今天&#xff0c;七彩喜微高压氧舱凭借其独特的技术创新、极致的用户体验和贴心的服务生态&#xff0c;在众多品牌中脱颖而出。它不仅是一台设备&#xff0c;更是一个“懂你需求、护你健康”的智能健康伙伴。对比其他品牌&#xff0c;七彩喜的优势…

[光学原理与应用-418]:非线性光学 - 数学中的线性函数与非线性函数

线性函数与非线性函数是数学和工程领域中描述变量关系的基础工具&#xff0c;二者在定义、性质、图像特征及应用场景上存在本质差异。以下从核心概念、数学特性、图像对比、应用场景及实际案例五个维度展开详细分析&#xff1a;一、核心概念&#xff1a;线性 vs 非线性线性函数…

前端登录鉴权详解

1.cookie-session1. cookiecookie简单来说就是浏览器客户端在请求时会携带的一个字段数据&#xff0c;常用与保存当前用户状态并在请求时携带给服务端验证。2. sessionsession简单来说就是服务单对于每一个用户生成一个用户会话标识session /session id&#xff0c;并返回给客户…

从零实现 LLM(上):原理讲透 + 最小可运行 GPT

引言 为什么要学习 LLM&#xff1f; 当你和 ChatGPT 对话时&#xff0c;它不仅能回答你的问题&#xff0c;还能续写故事、记住上下文&#xff0c;甚至调整风格。你可能会想&#xff1a;它是怎么做到的&#xff1f; 答案就是&#xff1a;大语言模型&#xff08;Large Languag…