webpack下加密方法提取思路
字数 1378 2025-08-06 12:21:05
Webpack下加密方法提取思路详解
0x01 JS中常规提取思路
1.1 找到加密方法位置
常见定位方法:
- 搜索加解密关键字:如
encrypt、encode、decrypt、decode等 - 搜索被加密接口或参数名:如
login、password等 - 使用XHR监听,搜索调用堆栈
1.2 提取加密方法和相关调用函数
提取步骤:
- 定位到加密函数后,将其提取到本地
- 跟进并补齐所有被调用的函数定义
- 示例中需要提取的函数包括:
i、n、s、sm2.doEncrypt等
1.3 两种处理方式
1.3.1 递进式补齐所有依赖
- 特点:需要不断调试进入函数,逐步补齐所有依赖
- 问题:Webpack代码通常非常庞大(几万行),逆向难度大
- 缺点:对于Webpack加密网站,通常不建议采用扣代码方式
1.3.2 自实现加密方法
当依赖补齐困难时,可尝试:
- 阅读并理解加密逻辑
- 用脚本模拟实现加密处理逻辑
示例分析:
- 加密方法传入三个参数:待加密字符串
t、SM2公钥、SM4密钥 - SM4密钥由
newGuid方法生成(32位hex随机字符串) - 加密逻辑:
- 使用SM2加密随机生成的SM4密钥
- 使用SM4加密明文字符串
- 将两个加密结果加上长度信息组合后转base64
关键函数:
i:hex字符串转数组n:返回8位字符串,参数前面用0填充s:取数组元素ASCII码值(用于数组转base64)
0x02 Webpack基础知识
2.1 基本结构
两种常见形式:
- 数组形式:
!function(形参){加载器;}([模块1, 模块2...])
- 字典形式:
!function(形参){加载器;}({'模块名1':模块1, '模块名2':模块2...})
模块较多时会打包成JS文件:
(window.webpackJsonp = window.webpackJsonp || []).push([[模块ID], {函数对象}, [n, e, t]]);
2.2 加载器基础知识
加载器处理逻辑:
- 检查模块是否有缓存,有则返回缓存模块的
exports对象 - 新建模块
module并放入缓存 - 执行文件路径对应的模块函数
- 标记模块为已加载
- 返回模块的
exports对象
2.3 Webpack识别方法
- 多模块打包特征:
(window.webpackJsonp = window.webpackJsonp || []).push([[0], []]);
- 加载器实现特征:
!function(){
function xx(n){
return x[n].call(**.exports, ***, ***.exports, xx)
}
}();
- 文件命名特征:如
app.版本号.js、chunk-libs.版本号.js等
0x03 Webpack提取加密方法思路
3.1 定位加密方法
- 通过搜索接口名和加密字段找到加密方法
3.2 提取加载器方法
- 查找形如
n(字符串)的调用(模块引用) - 断点跟进,识别加载器特征代码:
return c[n].call(u.exports,u,u.exports,d),u.l=!0,u.exports;
- 提取整个script标签中的JS代码
- 在Node.js环境中需定义
var window = global;解决window对象缺失问题
3.3 提取加密实现模块
- 通过控制台输出模块数组
- 根据模块名(如"MuMZ")定位加密模块
- 复制加密模块到本地
- 使用
require引用缺失的模块(如"xbrz")
3.4 调用加密模块执行输出
- 将立即执行函数改为可调用形式
- 导出加载器方法
- 调用加密模块并返回结果
0x04 总结
三种提取方法对比:
- 递进式补齐依赖:复杂,适合简单场景
- 自实现加密算法:需要深入理解加密逻辑
- 利用Webpack特性:最简单高效,只需复制加载器和加密模块代码
最佳实践:
- 优先采用Webpack结构特性进行提取
- 只需复制加载器和加密模块代码
- 引用其他必要文件即可调用加密方法
关键点:
- 准确识别Webpack结构和加载器
- 正确提取和导出模块
- 处理Node.js与浏览器环境差异
- 模块依赖关系的完整保留