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://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…