webpack下加密方法提取思路
字数 1378 2025-08-06 12:21:05

Webpack下加密方法提取思路详解

0x01 JS中常规提取思路

1.1 找到加密方法位置

常见定位方法:

  • 搜索加解密关键字:如encryptencodedecryptdecode
  • 搜索被加密接口或参数名:如loginpassword
  • 使用XHR监听,搜索调用堆栈

1.2 提取加密方法和相关调用函数

提取步骤:

  1. 定位到加密函数后,将其提取到本地
  2. 跟进并补齐所有被调用的函数定义
  3. 示例中需要提取的函数包括:inssm2.doEncrypt

1.3 两种处理方式

1.3.1 递进式补齐所有依赖

  • 特点:需要不断调试进入函数,逐步补齐所有依赖
  • 问题:Webpack代码通常非常庞大(几万行),逆向难度大
  • 缺点:对于Webpack加密网站,通常不建议采用扣代码方式

1.3.2 自实现加密方法

当依赖补齐困难时,可尝试:

  1. 阅读并理解加密逻辑
  2. 用脚本模拟实现加密处理逻辑

示例分析:

  • 加密方法传入三个参数:待加密字符串t、SM2公钥、SM4密钥
  • SM4密钥由newGuid方法生成(32位hex随机字符串)
  • 加密逻辑:
    1. 使用SM2加密随机生成的SM4密钥
    2. 使用SM4加密明文字符串
    3. 将两个加密结果加上长度信息组合后转base64

关键函数:

  • i:hex字符串转数组
  • n:返回8位字符串,参数前面用0填充
  • s:取数组元素ASCII码值(用于数组转base64)

0x02 Webpack基础知识

2.1 基本结构

两种常见形式:

  1. 数组形式:
!function(形参){加载器;}([模块1, 模块2...])
  1. 字典形式:
!function(形参){加载器;}({'模块名1':模块1, '模块名2':模块2...})

模块较多时会打包成JS文件:

(window.webpackJsonp = window.webpackJsonp || []).push([[模块ID], {函数对象}, [n, e, t]]);

2.2 加载器基础知识

加载器处理逻辑:

  1. 检查模块是否有缓存,有则返回缓存模块的exports对象
  2. 新建模块module并放入缓存
  3. 执行文件路径对应的模块函数
  4. 标记模块为已加载
  5. 返回模块的exports对象

2.3 Webpack识别方法

  1. 多模块打包特征:
(window.webpackJsonp = window.webpackJsonp || []).push([[0], []]);
  1. 加载器实现特征:
!function(){
    function xx(n){
        return x[n].call(**.exports, ***, ***.exports, xx)
    }
}();
  1. 文件命名特征:如app.版本号.jschunk-libs.版本号.js

0x03 Webpack提取加密方法思路

3.1 定位加密方法

  • 通过搜索接口名和加密字段找到加密方法

3.2 提取加载器方法

  1. 查找形如n(字符串)的调用(模块引用)
  2. 断点跟进,识别加载器特征代码:
return c[n].call(u.exports,u,u.exports,d),u.l=!0,u.exports;
  1. 提取整个script标签中的JS代码
  2. 在Node.js环境中需定义var window = global;解决window对象缺失问题

3.3 提取加密实现模块

  1. 通过控制台输出模块数组
  2. 根据模块名(如"MuMZ")定位加密模块
  3. 复制加密模块到本地
  4. 使用require引用缺失的模块(如"xbrz")

3.4 调用加密模块执行输出

  1. 将立即执行函数改为可调用形式
  2. 导出加载器方法
  3. 调用加密模块并返回结果

0x04 总结

三种提取方法对比:

  1. 递进式补齐依赖:复杂,适合简单场景
  2. 自实现加密算法:需要深入理解加密逻辑
  3. 利用Webpack特性:最简单高效,只需复制加载器和加密模块代码

最佳实践:

  • 优先采用Webpack结构特性进行提取
  • 只需复制加载器和加密模块代码
  • 引用其他必要文件即可调用加密方法

关键点:

  1. 准确识别Webpack结构和加载器
  2. 正确提取和导出模块
  3. 处理Node.js与浏览器环境差异
  4. 模块依赖关系的完整保留
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 基本结构 两种常见形式: 数组形式: 字典形式: 模块较多时会打包成JS文件: 2.2 加载器基础知识 加载器处理逻辑: 检查模块是否有缓存,有则返回缓存模块的 exports 对象 新建模块 module 并放入缓存 执行文件路径对应的模块函数 标记模块为已加载 返回模块的 exports 对象 2.3 Webpack识别方法 多模块打包特征: 加载器实现特征: 文件命名特征:如 app.版本号.js 、 chunk-libs.版本号.js 等 0x03 Webpack提取加密方法思路 3.1 定位加密方法 通过搜索接口名和加密字段找到加密方法 3.2 提取加载器方法 查找形如 n(字符串) 的调用(模块引用) 断点跟进,识别加载器特征代码: 提取整个script标签中的JS代码 在Node.js环境中需定义 var window = global; 解决window对象缺失问题 3.3 提取加密实现模块 通过控制台输出模块数组 根据模块名(如"MuMZ")定位加密模块 复制加密模块到本地 使用 require 引用缺失的模块(如"xbrz") 3.4 调用加密模块执行输出 将立即执行函数改为可调用形式 导出加载器方法 调用加密模块并返回结果 0x04 总结 三种提取方法对比: 递进式补齐依赖 :复杂,适合简单场景 自实现加密算法 :需要深入理解加密逻辑 利用Webpack特性 :最简单高效,只需复制加载器和加密模块代码 最佳实践: 优先采用Webpack结构特性进行提取 只需复制加载器和加密模块代码 引用其他必要文件即可调用加密方法 关键点: 准确识别Webpack结构和加载器 正确提取和导出模块 处理Node.js与浏览器环境差异 模块依赖关系的完整保留