webpack的js加密代码该怎么扣

发布时间:2021-10-09 16:31:28 作者:柒染
来源:亿速云 阅读:517
# Webpack的JS加密代码该怎么扣

## 前言

在现代前端开发中,Webpack已经成为不可或缺的模块打包工具。随着网站安全意识的提高,许多开发者会对Webpack打包后的代码进行加密处理,这给逆向分析带来了挑战。本文将详细介绍如何分析和还原Webpack打包的加密JavaScript代码。

## 一、Webpack打包代码的基本结构

典型的Webpack打包后代码通常包含以下核心部分:

```javascript
// 模块加载器
(function(modules) {
  // webpackBootstrap
  // 模块缓存
  var installedModules = {};
  
  // require函数定义
  function __webpack_require__(moduleId) {
    // ...
  }
  
  // 加载入口模块
  return __webpack_require__(0);
})([
  /* 模块数组 */
  function(module, exports, __webpack_require__) {
    // 模块0代码
  },
  function(module, exports, __webpack_require__) {
    // 模块1代码
  }
]);

二、识别加密的Webpack代码

常见的Webpack加密手段包括:

  1. 标识符混淆:变量名替换为短字符
  2. 字符串加密:重要字符串进行加密存储
  3. 控制流平坦化:打乱代码执行流程
  4. 自执行函数封装:多层嵌套的IIFE

加密后的典型特征: - 大量十六进制字符串(如0x12ab) - 频繁的数组操作(如_0x12ab[0x1]) - 异常的控制结构(如while-switch嵌套)

三、扣取加密代码的步骤

3.1 环境准备

推荐工具: - Chrome开发者工具 - AST解析工具(Babel、esprima) - 代码美化工具(Prettier) - Node.js调试环境

3.2 基础还原流程

  1. 格式化代码

    prettier --write encrypted.js
    
  2. 识别入口模块: 查找__webpack_require__(0)调用

  3. 提取模块依赖图

    // 打印模块依赖关系
    for(let id in modules) {
     console.log(`模块${id}依赖:`, modules[id].toString());
    }
    

3.3 处理常见加密手段

案例1:字符串加密还原

原始加密代码:

function _0x12ab() {
  return ['hello', 'world'][0x1];
}

还原方法: 1. 定位字符串数组 2. 替换引用处为实际值 3. 使用AST工具批量替换

案例2:控制流平坦化

加密代码特征:

while(!![]) {
  switch(_0x12ab++) {
    case 0x1: console.log(1); break;
    case 0x2: console.log(2); break;
    // ...
  }
}

解决方案: 1. 提取控制流变量 2. 重建正常执行顺序 3. 使用Babel插件自动化处理

3.4 模块系统还原

典型问题:模块导出被封装

// 加密导出
exports[_0x12ab(0x123)] = function() {...}

// 还原后
exports['getUserInfo'] = function() {...}

处理步骤: 1. 分析导出对象的所有key 2. 建立原始名称映射表 3. 批量重命名导出标识符

四、实战案例分析

4.1 案例背景

某网站登录密码加密逻辑采用Webpack打包,核心特征: - 包含crypto-js模块 - 存在RSA公钥加密 - 关键函数名称为_0xabc123

4.2 分析过程

  1. 定位加密入口

    // 搜索password相关操作
    document.querySelector('#loginBtn')
     .addEventListener('click', _0x12ab);
    
  2. 跟踪调用栈

    function _0x12ab() {
     var pwd = _0x34cd(_0x56ef());
     _0x78gh(pwd);
    }
    
  3. 还原加密流程

    // 原始加密流程
    function encrypt(pwd) {
     return RSA.encrypt(
       AES.encrypt(pwd, 'key'),
       'pubKey'
     );
    }
    

4.3 完整扣取代码

最终还原的核心逻辑:

function getEncryptedPassword(rawPwd) {
  const aesKey = '2e35f242a46d67eeb74aabc37d5e5d05';
  const rsaKey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDD...';
  
  const aesEncrypted = CryptoJS.AES.encrypt(
    CryptoJS.enc.Utf8.parse(rawPwd),
    CryptoJS.enc.Hex.parse(aesKey)
  ).toString();
  
  return new JSEncrypt()
    .setPublicKey(rsaKey)
    .encrypt(aesEncrypted);
}

五、注意事项

  1. 法律风险:仅限学习研究,勿用于非法用途
  2. 环境依赖:注意检测代码中的环境判断
    
    if(typeof window === 'undefined') {
     // 可能包含Node.js特定逻辑
    }
    
  3. 动态加载:处理import()等异步加载逻辑

六、进阶技巧

  1. 使用Source Map:如果存在.map文件可极大简化还原
    
    //# sourceMappingURL=bundle.js.map
    
  2. Hook关键函数
    
    const _orig = __webpack_require__;
    __webpack_require__ = function(id) {
     console.log('Require module:', id);
     return _orig(id);
    };
    
  3. AST自动化:编写Babel插件处理特定模式

结语

Webpack加密代码的还原需要耐心和系统的方法,通过理解模块系统原理、掌握常见加密模式、配合适当的工具链,可以有效分析和还原加密逻辑。建议在实践中多积累模式识别经验,并关注Webpack新版本的特性变化。

注意:本文所有技术仅限安全研究,请遵守相关法律法规。 “`

这篇文章共计约1500字,采用Markdown格式编写,包含代码块、列表、强调等标准语法元素,内容覆盖了Webpack加密代码分析的完整流程和实用技巧。

推荐阅读:
  1. 加密代码的编写
  2. PHP 代码加密

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

javascript webpack

上一篇:如何使用Python映射和过滤以及缩减函数

下一篇:如何在Excel中直接调用Python代码

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》