chrome的base库中求最接近n的2的多少次幂,也就是k=log2(n); 求k的算法

本文介绍了一个实用的位操作工具库,其中包括两个核心函数:Log2Floor和Log2Ceiling。Log2Floor函数返回不大于输入整数的最大2的幂次方的指数,而Log2Ceiling则返回不小于输入整数的最小2的幂次方的指数。

// Copyright (c) 2009 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// This file defines some bit utilities.

#ifndef BASE_BITS_H_
#define BASE_BITS_H_

#include "base/basictypes.h"
#include "base/logging.h"

namespace base
{

namespace bits
 {

// Returns the integer i such as 2^i <= n < 2^(i+1)
inline int Log2Floor(uint32 n)
{
  if (n == 0)
    return -1;
 
  int log = 0;
  uint32 value = n;
 
  for (int i = 4; i >= 0; --i)
  {
    int shift = (1 << i);
 
    uint32 x = value >> shift;
 
    if (x != 0)
 {
      value = x;
      log += shift;
    }
  }
  DCHECK_EQ(value, 1u);
  return log;
}

// Returns the integer i such as 2^(i-1) < n <= 2^i
inline int Log2Ceiling(uint32 n)
{
  if (n == 0)
  {
    return -1;
  }
  else
  {
    // Log2Floor returns -1 for 0, so the following works correctly for n=1.
    return 1 + Log2Floor(n - 1);
  }
}

}  // namespace bits
}  // namespace base

#endif  // BASE_BITS_H_

<think>我们正在处理一个Web渗透测试场景,目标是提取Webpack打包的代码并还原其中的加解密算法。以下步骤将结合引用内容中提到的工具和技术(如AST反混淆、Webpack解包等)进行。 ### 1. **获取Webpack打包代码** - **浏览器开发者工具**: 在渗透测试中,首先通过浏览器(如Chrome)的开发者工具(`Sources`面板)获取Webpack打包后的JavaScript文件。通常,这些文件被压缩成一行,需要格式化。 - 右键点击代码 → 选择"Format"(或{}图标)进行美化。 - **网络抓取**: 使用Burp Suite或浏览器Network面板捕获页面加载时请的JS文件,保存到本地分析。 ### 2. **解包Webpack模块** Webpack将模块封装在闭包中,结构为: ```javascript (function(modules) { // Webpack运行时逻辑 __webpack_require__(0); // 入口模块 })({ "./src/encrypt.js": function(module, exports) { // 加解密算法逻辑 } }); ``` - **解包工具**: 使用`webpack-unpack`工具提取模块: ```bash npm install -g webpack-unpack webpack-unpack bundle.js > unpacked.json ``` 生成JSON文件,包含所有模块的路径和代码。 ### 3. **定位加解密模块** - **关键词搜索**: 在解包后的模块中搜索关键词: - 算法名:`AES`、`DES`、`RSA`、`crypto`、`encrypt`、`decrypt`。 - 字符串特征:如`encrypt(`、`decrypt(`、`Cipher`、`createCipheriv`。 - **依赖追踪**: 从入口模块(通常为`0`或`./src/index.js`)开始,通过`__webpack_require__`调用关系追踪到加解密模块。 ### 4. **反混淆处理(关键步骤)** 引用[2]提到:92%的网站使用混淆技术,需通过AST(抽象语法树)还原代码。 - **反混淆工具**: - **de4js**(在线工具):处理字符串加密、控制流扁平化。 - **Babel AST**(编程处理):使用JavaScript编写脚本还原变量名和逻辑。 ```javascript // 示例:使用Babel解析AST并还原字符串加密 const parser = require("@babel/parser"); const traverse = require("@babel/traverse").default; const generate = require("@babel/generator").default; const code = `const key = atob("U2VjcmV0S2V5");`; const ast = parser.parse(code); traverse(ast, { CallExpression(path) { if (path.node.callee.name === "atob") { const value = path.node.arguments[0].value; const decoded = Buffer.from(value, "base64").toString(); path.replaceWithSourceString(`"${decoded}"`); // 替换为明文 } } }); console.log(generate(ast).code); // 输出: const key = "SecretKey"; ``` - **控制流还原**: 针对控制流扁平化(如`switch-case`跳转),使用工具如**JStillery**自动重构分支逻辑。 ### 5. **动态调试验证** - **浏览器断点调试**: 在Chrome DevTools中: 1. 定位到加解密函数。 2. 设置断点,触发加解密操作(如提交表单)。 3. 观察输入输出、密钥、IV等参数。 - **Hook关键函数**: 注入脚本Hook加密函数,记录参数: ```javascript // 覆盖原函数,打印调用参数 const originalEncrypt = window.crypto.subtle.encrypt; window.crypto.subtle.encrypt = function(algo, key, data) { console.log("Encrypt called:", algo, key, data); return originalEncrypt.apply(this, arguments); }; ``` ### 6. **提取算法并移植** - **独立模块提取**: 将反混淆后的加解密函数及其依赖(如密钥生成、填充函数)提取为独立JS文件。 - **环境适配**: 若算法依赖浏览器环境(如`Web Crypto API`),需替换为Node.js的`crypto`模块: ```javascript // 浏览器代码(原始) async function encrypt(data, key) { return await crypto.subtle.encrypt({ name: "AES-GCM" }, key, data); } // Node.js适配 const crypto = require("crypto"); function encrypt(data, key) { const cipher = crypto.createCipheriv("aes-256-gcm", key, iv); return Buffer.concat([cipher.update(data), cipher.final()]); } ``` - **测试验证**: 使用已知明文和密钥验证移植后算法的正确性。 ### 7. **自动化工具辅助** - **红队平台整合**: 引用[1]提到的工具如**Viper**(图形化红队平台)可集成自定义脚本,自动化解包和反混淆流程。 - **SQL注入辅助**: 引用[3]中的SQLMap技巧可用于探测Webpack配置文件的路径(如`/static/webpack.config.js`),获取源码结构信息。 ### 注意事项 - **法律合规**:仅测试授权目标,避免侵权。 - **混淆对抗**:开发者可能使用Webpack的`eval`模式(如`eval-source-map`),此时需结合SourceMap文件还原源码。 --- ### 相关问题 1. **如何区分Webpack打包代码中的第三方加密和自定义加密模块?** 2. **反混淆后如何重构被扁平化控制流的加密函数?** 3. **Webpack的`eval-source-map`配置对反编译有何影响?如何利用?** 4. **提取的算法如何在非浏览器环境(如Python)中实现?** [^1]: 横向移动工具如impacket、wmiexec-Pro等可用于渗透测试中的横向移动。 [^2]: AST反混淆技术是还原混淆代码的关键,涉及控制流还原、变量反命名、字符串解密等。 [^3]: SQLMap等工具在Web渗透中用于探测SQL注入漏洞。</think>### Web渗透测试中提取Webpack代码并还原加解密算法的完整流程 #### 1. **获取Webpack打包代码** [^1] - **浏览器开发者工具提取**: 1. 访问目标网站,按`F12`打开开发者工具 2. 在`Sources`面板定位Webpack入口文件(通常为`main.[hash].js`或`app.[hash].js`) 3. 格式化代码(点击`{}`图标) 4. 保存完整JS文件 - **网络流量捕获**: ```bash # 使用Burp Suite或Mitmproxy捕获JS文件 mitmdump -w traffic.mitm # 捕获所有流量 grep "webpack" traffic.mitm # 过滤Webpack文件 ``` #### 2. **解包Webpack模块结构** [^2] Webpack典型结构: ```javascript /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ /***/ "./src/encrypt.js": (() => { // 加解密算法在这里 /***/ }), /***/ 0: (() => { // 入口模块 __webpack_require__("./src/encrypt.js"); /***/ }) /******/ }); /******/ })(); ``` **解包工具**: | 工具 | 命令/用法 | 用途 | |------|-----------|------| | **webpack-unpack** | `npx webpack-unpack bundle.js > modules.json` | 提取所有模块 | | **AST Explorer** | 在线工具:https://astexplorer.net | 可视化分析代码结构 | | **Babel Parser** | `parser.parse(code, {sourceType: 'module'})` | 编程式解析AST | #### 3. **定位加解密模块** - **特征搜索**: ```bash grep -E 'encrypt|decrypt|crypto|Cipher|AES|RSA' modules/* ``` - **动态调试**: 1. 在Chrome DevTools中对以下API设断点: - `crypto.subtle.encrypt/decrypt` - `CryptoJS.AES.encrypt` - `window.atob/btoa` 2. 触发加解密操作(如表单提交) 3. 通过调用栈回溯到Webpack模块 #### 4. **反混淆处理** [^2] **常见混淆技术及解决方案**: ```mermaid graph LR A[混淆类型] --> B[字符串加密] A --> C[控制流扁平化] A --> D[变量名混淆] B --> E[AST解析自动解密] C --> F[控制流重构] D --> G[变量重命名] ``` **AST反混淆示例**(处理字符串加密): ```javascript // 原始混淆代码 const key = _0x12ab('0x12f'); // AST转换后 const key = "SecretKey123"; ``` **推荐工具**: - **de4js**:https://lelinhtinh.github.io/de4js/(在线解混淆) - **Babel AST**:编程式还原代码结构 - **JStillery**:处理高级控制流混淆 #### 5. **算法还原与移植** - **提取独立模块**: ```javascript // 提取后的加解密模块 const CryptoUtils = { encrypt(data, key) { // 还原后的加密逻辑 return crypto.subtle.encrypt({name: "AES-GCM"}, key, data); }, decrypt(encrypted, key) { // 还原后的解密逻辑 return crypto.subtle.decrypt({name: "AES-GCM"}, key, encrypted); } } ``` - **环境适配**: ```javascript // 浏览器环境 -> Node.js适配 if (typeof window === 'undefined') { const crypto = require('crypto'); // 重写浏览器特定API } ``` #### 6. **渗透测试应用场景** 1. **解密敏感数据**:还原客户端加密的认证令牌 2. **参数篡改**:绕过前端校验直接构造加密请 3. **漏洞利用**:识别弱加密实现(如固定IV、弱密钥) 4. **协议分析**:逆向私有API通信协议 **示例攻击流程**: ```mermaid sequenceDiagram participant A as 攻击者 participant W as Web应用 A->>W: 捕获Webpack代码 A->>A: 反混淆提取算法 A->>W: 构造加密请 W->>A: 返回敏感数据 ``` #### 7. **注意事项** 1. **法律合规**:仅测试授权目标 2. **混淆对抗**:使用新AST解析应对新型混淆 3. **环境差异**:处理浏览器特有API(如Web Crypto API) 4. **完整性验证**:使用测试向量验证算法正确性 --- ### 相关问题 1. **如何区分Webpack打包代码中的第三方加密和自定义加密模块?** 2. **反混淆后如何重构被扁平化控制流的加密函数?** 3. **Webpack的`eval-source-map`配置对反编译有何影响?如何利用?** 4. **提取的算法如何在Python中实现以集成到渗透测试工具链?** [^1]: 横向移动工具如impacket、wmiexec-Pro等可用于渗透测试中的横向移动。 [^2]: AST反混淆技术是还原混淆代码的关键,涉及控制流还原、变量反命名、字符串解密等。 [^3]: SQLMap等工具在Web渗透中用于探测SQL注入漏洞。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值