webpack原理和逆向实战

文章目录

      • 什么是webpack
      • webpack基本原理
      • webpack代码分析
      • webpack代码抠取
      • webpack全模块自吐
      • webpack自动扣取
      • 总结

什么是webpack

webpack是一个现代 JavaScript 应用程序的静态模块打包器(module bundler),负责分析翻译压缩打包代码。

在这里插入图片描述

上面的官网的一张示例图。

webpack基本原理

首先我们来把两个最简单的js文件合并成一个,第一个JS文件代码如下:

var dt = require('./work.js')

第二个JS文件代码如下:

CryptoJS = require("crypto-js")
document.write('hello')

具体的合并过程我们不关注,各位有兴趣可以自行研究一下。代码很简单,只是引入一下CryptoJS库,我们看看webpack为了引入这个库,会生成什么样的代码。

下面是生成代码的部分粘贴

function (t) {var e = {};function r(i) {if (e[i]) return e[i].exports;var n = e[i] = {i: i, l: !1, exports: {}};return t[i].call(n.exports, n, n.exports, r), n.l = !0, n.exports}...}, r.p = "", r(r.s = 10)
}([function (t, e, r) {},function (t, e, r) {},function (t, e, r) {},function (t, e, r) {},......}(r(0), r(3), r(4), r(2), r(1))
}]);

上面的webpack代码,我经过了大量的删减,只保留了框架部分,看懂了这个框架的运行流程,就明白了webpack的原理。

接下来对webpack执行流程进行分析

在这里插入图片描述

首先是一个自执行函数,这个函数比较大,是整个webpack的入口。自执行函数传入了一个参数t

在这里插入图片描述

这个t是一个函数数组

在这里插入图片描述

继续往下走,定义了一个空对象e和一个函数r。

在这里插入图片描述

然后接下来的执行流都是一些赋值操作,这个不需要关心

在这里插入图片描述

一直到这个位置,前面都是一系列的赋值操作。而这里调用的函数r,传入了参数10。

这个r函数是我们要分析的重点,我们继续跟进
在这里插入图片描述

首先会判断当前e[i]的值是否为空,不为空的话就直接返回了。当前我们的e对象是一个空对象

在这里插入图片描述

接着往e[i]里面加入了一个对象
在这里插入图片描述

这个对象有三个元素,分别是exports,i和l。

在这里插入图片描述

接着执行了t[i]函数,并且把this指向改成了n.exports,这里直接步过这个函数,看看函数执行完成之后e[i]对象的内容。
在这里插入图片描述

执行完成之后,我们再来看下e[i]的值,可以看到此时exports里面已经被填充了一堆函数

CryptoJS = require("crypto-js")
document.write('hello')

我们合并的源码实际上是包含了CryptoJS库

在这里插入图片描述

这个exports里面也包含了Crypto对象。

那么整个webpack实际上就是一个以加载器为核心的,以加载器的某一个模块为入口(代码里是r(10)),分模块打包,最终返回exports进行调用的一种打包工具

也就是说r函数实际上就是一个加载器,把所有需要的模块全部加载进来,这样就能让后面的代码进行调用。

那么下面这段代码我们就能够理解了

//webpack函数入口 自执行函数
function (t) {var e = {};//webpack加载器function r(i) {if (e[i]) return e[i].exports;var n = e[i] = {i: i, l: !1, exports: {}};return t[i].call(n.exports, n, n.exports, r), n.l = !0, n.exports}...}, r.p = "", r(r.s = 10)
}([//函数数组function (t, e, r) {},function (t, e, r) {},function (t, e, r) {},function (t, e, r) {},......}(r(0), r(3), r(4), r(2), r(1))
}]);

webpack代码扣取的时候,需要把整个加载器的代码都拿到本地,然后通过调用加载器函数r(10)得到需要的模块对象。

webpack代码分析

示例网站是这个

https://open.babytree.com/default#/login

在这里插入图片描述

先抓一个登陆的包,这个包里面有两个字段,分别是sign和password,如果想要搞定这个登陆接口的话,就必须对这两个参数进行逆向分析。
在这里插入图片描述

通过搜索password关键词,可以定位到这个位置,password和加密后的数值也都符合预期,那么接下来就要进入到handleEncryptValue函数进行分析
在这里插入图片描述

进去以后,这里调用了Object函数,通过控制台可以看到函数原型,继续往里跟
在这里插入图片描述

这里关注两个地方

var o = n(409);
t.a = function(e) {var t = new o.JSEncrypt;return t.setPublicKey("-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2qC67Y3KF6mupPBsnsoIqEM1dfohMkMI4Rxj60Ae3MOT+Ch3vPZwCj4P5vVw+sVuRv0N94MqraNxLBlQfyeIf2Vu1KOdHD+gFfWneSrNM7Cs4b7Cn+ctCf9tJ239IrLilfsasV6iWc7kDHGIwInMJ9XqqTZTBnWP07SCQYf8J3mL/vw/PY1klBknwh8oLuJi8+BfAS1KPgMuK60NxTAMny+9h9Dno1kVGeLa0Osm4TkVWK9Uyx0XbbV0IfrnbpT/0FUxC6X+K+gHsWzmywrC7145+Bgz0lQo2kRTy551RcyMStlT41poc6ASn8mzCMD4u4MyNU+V0srtFBD8fdwZZwIDAQAB-----END PUBLIC KEY-----"),t.encrypt(e)
}

function(e)是关键参数的加密函数,而这里是通过o.JSEncrypt来进行调用的,而这个o是var o = n(409);

这是不是就有点像我们之前分析的加载器函数r10。这种就是典型的webpack调用模块的方式。特征如下:

r(10)
n(409)

在这里插入图片描述

这里的o已经是一个完成了加载过程的对象,可以直接进行调用。接下来就要对webpack代码进行扣取了。

webpack代码抠取

在这里插入图片描述

首先我们在这个加载器函数下断,并刷新网页,然后跟进去这个函数里面
在这里插入图片描述

可以看到这个代码跟我们之前分析的webpack代码几乎一样
在这里插入图片描述

我们需要复制下整个加载器函数,然后构造一个自执行函数,把这个加载器放进自执行函数里面

var Func;//自执行函数
!function (e)
{var n={};function i(t) {if (n[t])return n[t].exports;var r = n[t] = {i: t,l: !1,exports: {}};return e[t].call(r.exports, r, r.exports, i),r.l = !0,r.exports}//提供给外部调用Func=i;
}({//这里放需要的模块函数 
})

接着我们需要去找到需要加载的模块
在这里插入图片描述

执行到下面这个位置,然后输入想要的e[409]就可以在控制台拿到需要的模块函数,然后右键->Show function definition

如果想要拿到所有的模块,可以在这个位置打一个日志断点或者是Hook,让他打印出所有的t和e[t],这样就可以拿到所有的模块。
在这里插入图片描述

就可以跳转到这个函数位置,然后粘贴到代码里面。最近一步,我们来编写调用代码

//补一下缺的环境
var navigator={}
var window=global//调用
var o = Func(409);function Crypt(e) {var t = new o.JSEncrypt;return t.setPublicKey("-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2qC67Y3KF6mupPBsnsoIqEM1dfohMkMI4Rxj60Ae3MOT+Ch3vPZwCj4P5vVw+sVuRv0N94MqraNxLBlQfyeIf2Vu1KOdHD+gFfWneSrNM7Cs4b7Cn+ctCf9tJ239IrLilfsasV6iWc7kDHGIwInMJ9XqqTZTBnWP07SCQYf8J3mL/vw/PY1klBknwh8oLuJi8+BfAS1KPgMuK60NxTAMny+9h9Dno1kVGeLa0Osm4TkVWK9Uyx0XbbV0IfrnbpT/0FUxC6X+K+gHsWzmywrC7145+Bgz0lQo2kRTy551RcyMStlT41poc6ASn8mzCMD4u4MyNU+V0srtFBD8fdwZZwIDAQAB-----END PUBLIC KEY-----"),t.encrypt(e)
}
console.log(Crypt('123456'))

在这里插入图片描述

然后查看运行结果,测试应该没问题,到这里这个webpack就扣取完成了。

webpack全模块自吐

我们现在只扣取了一个模块的代码,假如说如果想要把所有的模块函数全部扣下来,就可以用下面的方法。
在这里插入图片描述

先在加载器调用的前后各打一个断点
在这里插入图片描述

然后在控制台定义一个变量
在这里插入图片描述

进到函数里面,在第一行打一个日志断点

window.result = window.result + '"'+ r + '":'+:e[r] +''+','

就可以通过日志的方式拿到所有的模块。

webpack自动扣取

https://gitcode.net/zjq592767809/webpack_ast

推荐一个可以自动扣取webpack的脚本,支持大部分常见的webpack,业内很有名的一个大佬写的,实战的这个网站也可以用webpack直接扣取。

使用方法:

node webpack_mixer.js -l loader.js -m function.js -o webpack_out.js
  • webpack_mixer.js脚本文件
  • -l 加载器的js路径
  • -m 函数模块的js路径
    在这里插入图片描述

脚本运行以后会生成一个JS文件,这个里面的webpack是完整的模块,而不是我们只扣取了一个模块的
在这里插入图片描述

用代码打印一下所有的函数列表,可以看到跟我们自己手动扣的完全不一样
在这里插入图片描述

然后直接调用,可以看到结果也出来了。只能说一个字,牛逼!

总结

最后,总结一下,扣取webpack的步骤如下:

  1. 找到加载器,在调用模块的地方下断点,刷新网页
  2. 构造自执行函数
  3. 找到调用的模块
  4. 编写调用函数

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

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

相关文章

大数据实时抓取软件:Maxwell学习网站的高效框架!

介绍:Maxwell是由美国Zendesk开源的,使用Java编写的MySQL实时抓取软件。它能够实时读取MySQL的二进制日志(Binlog),并将这些信息生成为JSON格式的消息。进一步地,Maxwell将这些消息作为生产者发送给Kafka、…

Springboot项目Nacos做配置中心

Springboot项目Nacos做配置中心 说明安装2.Springboot整合使用Nacos3.问题处理 说明 文档参考 Nacos Spring Boot 安装 查看nacos镜像 docker search nacos 下载镜像 docker pull nacos/nacos-server启动naocs镜像 docker run --env MODEstandalone --name nacos -d -p 8…

Abaqus2023安装下载教程

用钢铁意志,成就不平凡的人生。 今天博主整理了一下Abaqus2023安装下载教程,希望大家学习。 安装之前请关闭电脑所有杀毒软件和防火墙,并保证计算机名不是中文!!!! 1.首先创建一个用于Abaqus…

【Linux】进程程序替换

👑作者主页:@安 度 因 🏠学习社区:安度因 📖专栏链接:Linux 文章目录 简单看看程序替换原理(单进程)多进程进程程序替换补充exec 系列进程创建时有两个目标: 执行父进程的部分代码,由自己编写的,通过 if else 分流,让子进程执行的对应任务。执行和父进程完全不同…

Linux上如何一键安装软件?yum源是什么?Linux如何配置yum源?

这几个问题是Linux操作的入门问题,但是确实也会让刚上手Linux小伙伴头疼一阵,故特有此文,希望能对刚入门的小伙伴有一些帮助~ 众所周知 在linux上在线安装软件需要用到yum命令,经常下述命令来安装 yum install [-y] 包名 #-y的…

Hive基础知识(十二):Hive的基本查询

1. 全表和特定列查询 0)数据准备 原始数据 dept: 10 ACCOUNTING 1700 20 RESEARCH 1800 30 SALES 1900 40 OPERATIONS 1700 emp: 7369 SMITH CLERK 7902 1980-12-17 800.00 20 7499 ALLEN SALESMAN 7698 1981-2-20 1600.00 300.00 30 7521 WARD SALESM…

数据结构与算法教程,数据结构C语言版教程!(第三部分、栈(Stack)和队列(Queue)详解)五

第三部分、栈(Stack)和队列(Queue)详解 栈和队列,严格意义上来说,也属于线性表,因为它们也都用于存储逻辑关系为 "一对一" 的数据,但由于它们比较特殊,因此将其单独作为一章,做重点讲解。 使用栈…

Java Swing 图书借阅系统 窗体项目 期末课程设计 窗体设计

视频教程: 【课程设计】图书借阅系统 功能描述: 图书管理系统有三个角色,系统管理员、图书管理员、借阅者; 系统管理员可以添加借阅用户; ​图书管理员可以添加图书,操作图书借阅和归还; 借…

c++例题2点和直线关系

#include<iostream> #include<string> using namespace std; //圆的类 class yuan{ public:int x2 10;int y2 10;int r 5; }; //点的类 class dian{ public :void setx(int x){x1 x;}int getx(){return x1;}void sety(int y){y1 y;}int gety(){return y1;} pr…

Lagrange对偶法

这里写自定义目录标题 5.1.1 The Lagrangian5.1.2 The Lagrange dual function5.2 The Lagrange dual problem5.2.3 Strong duality and Slater’s constraint qualification5.2.3 Strong duality and Slater’s constraint qualification5.5.3 KKT optimality conditions Lagr…

2024上半年教资笔试报名详细教程1月12日开始报名啦

重点提醒&#xff1a; 1、注册开放时间&#xff1a;2024年1月10日开始。 &#xff08;参加过笔试的考生&#xff0c;需要重新注册&#xff0c; 不影响已获得的笔试成绩。名额少的考点建议提前注册抢名额&#xff09; 2、网上报名时间&#xff1a;2024年1月12日至15日。 千万不…

[开发语言][c++][python]:C++与Python中的赋值、浅拷贝与深拷贝

C与Python中的赋值、浅拷贝与深拷贝 1. Python中的赋值、浅拷贝、深拷贝2. C中的赋值、浅拷贝、深拷贝2.1 概念2.2 示例&#xff1a;从例子中理解1) 不可变对象的赋值、深拷贝、浅拷贝2) 可变对象的赋值、浅拷贝与深拷贝3) **可变对象深浅拷贝(外层、内层改变元素)** 写在前面&…

资源三角形

美国哈佛大学的研究小组提出了著名的资源三角形&#xff1a;没有物质&#xff0c;什么也不存在&#xff1b;没有能量&#xff0c;什么也不会发生&#xff1b;没有信息&#xff0c;任何事物都没有意义。物质、能量和信息是相互有区别的&#xff0c;是人类社会赖以生存、发展的三…

Nginx负载均衡以及常用的7层协议和4层协议的介绍

一、引言 明人不说暗话&#xff0c;下面来解析一下 Nginx 的负载均衡。需要有 Linux 和 Nginx 环境哈。 二、nginx负载均衡的作用 高并发&#xff1a;负载均衡通过算法调整负载&#xff0c;尽力均匀的分配应用集群中各节点的工作量&#xff0c;以此提高应用集群的并发处理能力…

Ftrans飞驰云联荣获“CSA 2023安全创新奖”

2023年12月21日&#xff0c;第七届云安全联盟大中华区大会在深圳成功举办。会上&#xff0c;CSA大中华区发布了多个研究成果并进行 CSA 2023年度颁奖仪式&#xff0c;Ftrans飞驰云联以其突出的技术创新能力和广泛的市场应用前景&#xff0c;荣获备受瞩目的“CSA 2023安全创新奖…

【算法与数据结构】62、LeetCode不同路径

文章目录 一、题目二、解法2.1 动态规划解法2.2 数论解法 三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 2.1 动态规划解法 思路分析&#xff1a;机器人只能向下或者向右移动&#xff0c;那么到达&a…

leetcode 2645. 构造有效字符串的最少插入数-python

题目&#xff1a; 给你一个字符串 word &#xff0c;你可以向其中任何位置插入 “a”、“b” 或 “c” 任意次&#xff0c;返回使 word 有效 需要插入的最少字母数。 如果字符串可以由 “abc” 串联多次得到&#xff0c;则认为该字符串 有效 。 解题方法 1.先判断字符串是否…

【剪枝】【广度优先】【深度优先】488祖玛游戏

作者推荐 【动态规划】458:可怜的小猪 涉及知识点 剪枝 广度优先 深度优先 488祖玛游戏 在这个祖玛游戏变体中&#xff0c;桌面上有 一排 彩球&#xff0c;每个球的颜色可能是&#xff1a;红色 ‘R’、黄色 ‘Y’、蓝色 ‘B’、绿色 ‘G’ 或白色 ‘W’ 。你的手中也有一些…

kubeadm安装kubernetes

基本环境配置 节点分为&#xff1a;master&#xff0c;node&#xff0c;masterlb(keepalived虚拟Ip&#xff0c;不占用机器) k8s-master01 16 k8s-node01 113 15 k8s-node02 115 进入之后直接选done done 上海 123456 设置静态ip 然后去虚拟机里面设置ens即可 查看命…

MFC为对话框资源添加类

VC6新建一个对话框类型的工程; 建立之后资源中默认有2个对话框,一个是主对话框,About这个是默认建立的关于版权信息的; 然后主对话框有对应的.h和.cpp文件;可以在其中进行编程; 默认建立的有一个 关于 对话框; 在资源中新插入一个对话框,IDD_DIALOG1是对话框ID; 新加…