Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
egodeath — 基于密码学不可区分混淆技术的JavaScript混淆器 | Kitploit
工具/GitHubGitHub/nstarke/egodeath
静态分析代码分析逆向工程论文与研究学习与教育
GitHubnstarke/egodeath

egodeath

基于密码学不可区分混淆技术的JavaScript混淆器

查看仓库
5351个月前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

egodeath

该项目并未实现不可区分性混淆。您不应使用此产品来保护秘密。它的存在是为了阻止逆向工程,而非防止逆向工程。

Tests

截图 一个 JavaScript 混淆器,旨在使代码对人类和大型语言模型(LLM)都极难阅读和分析。使用 TypeScript 编写。实现了来自同行评审的密码学混淆研究中的技术。

安装

root@kitploit:~
npm install
npm run build

CLI 使用

root@kitploit:~
# 基本使用
node dist/index.js input.js > output.js

# 指定目标 token 预算(默认:2,000,000)
node dist/index.js --target-tokens 500000 input.js > output.js

# 最小混淆(小输出)
node dist/index.js --target-tokens 10000 input.js > output.js

# 最大膨胀(10M tokens)
node dist/index.js --target-tokens 10000000 input.js > output.js

# 使用环境变量
INPUT_FILE=input.js node dist/index.js > output.js

# 帮助
node dist/index.js --help

选项

选项默认描述
--target-tokens <n>2000000目标输出大小(以 token 计)。小输入会膨胀至该上限。大输入会减少膨胀以保持预算。
--help, -h显示帮助信息

npm 脚本

root@kitploit:~
npm run build              # 编译 TypeScript 到 dist/
npm run start              # 运行混淆器(读取 input.js)
npm run test               # 运行测试套件
npm run obfuscate-package  # 对 npm 包运行兼容性测试

编程接口

root@kitploit:~
const { obfuscate } = require('./dist/obfuscator');

const code = 'function add(a, b) { return a + b; }';
const obfuscated = obfuscate(code);

// 带选项
const obfuscated = obfuscate(code, { targetTokens: 500000 });

变换管道

混淆器在四个阶段中应用 20 个变换。每个阶段建立在前一个阶段之上。

阶段 1:安全与反分析预处理变换

阶段 2:结构预处理变换

阶段 3:标识符传递

阶段 4:后处理变换

死代码注入

死代码在多个点注入,使用两种生成策略:

策略来源描述
基于模板transforms/deadCodeInjection.ts9 种模板类型:循环累加、数组构建、对象操作、字符串拼接、嵌套条件、try/catch、while 倒计时、switch 计算、位运算链。模板引用真实作用域变量。

死代码注入点:

  • CFF 死 switch case(每个函数大约增加 30%,根据预算缩放)
  • 不透明谓词 else 分支
  • 非 CFF 函数中的独立死代码块(预算控制)

研究论文参考文献

多个变换受同行评审的密码学混淆研究启发:

验证工具

两个验证工具测量混淆质量,位于 src/verification/:

空电路测试(verification/nullCircuitTest.ts)

混淆一个真实函数和一个“空”函数(相同形状,执行无操作),然后比较 14 个结构指标以评分它们的可区分程度。相似度越高 = 混淆越好。

root@kitploit:~
import { runNullCircuitTest } from './verification/nullCircuitTest';
const result = runNullCircuitTest(realCode, paramCount, stmtCount, threshold, targetTokens);
console.log('相似度:', result.similarity); // 0.0-1.0

不可混淆函数测试(verification/unobfuscatableTests.ts)

来自论文 1 不可能证明的 7 个测试用例,试图从混淆代码中提取秘密:

root@kitploit:~
import { runAllTests, printSummary } from './verification/unobfuscatableTests';
console.log(printSummary(runAllTests(10000)));

测试:点函数(密码)、魔法数字、金丝雀字符串、嵌入密钥、URL、正则表达式模式、控制流签名。

输出大小预算

--target-tokens 选项通过膨胀预算控制输出大小,该预算缩放死代码注入(主要体积杠杆)。预算门控变换:

预算比率启用的变换
> 3反调试、触发器、CFF、不透明谓词、逗号合并
> 5代理函数、属性键编码、噪声注入、自完整性
> 8上下文窗口耗尽
> 10全局变量编码

死代码乘数从 1x(比率 30)到 150x(比率 1500+),控制死 switch case 和不透明谓词分支的数量和大小。

项目结构

root@kitploit:~
src/
  index.ts             CLI 入口点
  obfuscator.ts        主管道编排器(20 个变换)
  options.ts           预算系统和选项
  types.ts             AST 类型定义
  random.ts            随机 Unicode 名称生成(6-16 字符,16 个脚本范围)
  ast.ts               AST 节点工厂函数
  keywords.ts          动态关键字发现(globalThis + window 包)
  globals.ts           全局状态管理(空原型映射)
  substitute.ts        标识符替换工具
  declarations.d.ts    模块类型声明
  passes/
    firstPass.ts       标识符编目
    secondPass.ts      标识符替换 + 字符串编码
    thirdPass.ts       虚拟参数注入
  transforms/
    antiDebug.ts        eval("debugger") 陷阱 + setInterval 循环
    tripwires.ts        穿刺程序秘密输入检查 [论文 4]
    noiseInjection.ts   LPN 启发算术噪声 [论文 7]
    controlFlowFlattening.ts  while/switch + 模算术调度 [论文 3]
    opaquePredicates.ts       15 个始终为 true/false 的数学谓词
    proxyFunctions.ts         调用图平坦化分发器
    contextExhaustion.ts      用于 LLM 上下文填充的三目/void 噪声
    commaExpressions.ts       通过逗号运算符合并语句
    globalVariableEncoding.ts 使用 eval+replace 处理全局变量
    propertyKeyEncoding.ts    带每作用域注册表的计算属性访问
    numberEncoding.ts         11 种位/算术编码策略
    selfIntegrity.ts          反篡改运行时检查 [论文 10]
    stringArrayExtraction.ts  链式 XOR + 稀疏位置错误 [论文 2, 9]
    deadCodeInjection.ts      基于模板 + 变异的死代码 [论文 3]
  verification/
    nullCircuitTest.ts        死代码质量评分 [论文 10]
    unobfuscatableTests.ts    秘密提取测试用例 [论文 1]
  __tests__/                  超过 300 个单元测试,分布在 21 个套件中
tools/
  obfuscate-package.ts  基于 webpack 的 npm 包兼容性测试
tests/
  input*.js             原始测试输入文件

测试

root@kitploit:~
# 运行所有测试
npm test

# 运行特定测试套件
npx jest controlFlowFlattening
npx jest tripwires
npx jest noiseInjection

# 针对 npm 包测试(克隆仓库,webpack 打包,混淆,运行测试)
npm run obfuscate-package                    # 所有 10 个包
npm run obfuscate-package -- minimist semver # 指定包

兼容性测试工具

tools/obfuscate-package.ts 工具针对真实的 npm 包测试混淆器:

  1. 克隆包的 git 仓库
  2. 安装所有依赖(包括用于测试的 devDependencies)
  3. 如果包有构建脚本,则构建包
  4. 使用 webpack 将库的主入口点打包成一个 CommonJS 文件
  5. 对打包后的文件运行混淆器
  6. 将库的主入口替换为混淆后的包
  7. 针对混淆后的版本运行库自身的测试套件

输出位置

路径内容
dist/obfuscated/<package>/bundle.js每个包的混淆后 webpack 包
dist/obfuscated/report.json完整的 JSON 报告,包含包大小、混淆状态、测试输出

许可证

MIT - 版权所有 2026 Nicholas Starke

下载工具
顺序变换文件描述
1反调试陷阱transforms/antiDebug.ts注入 eval("debugger") 语句和 10-20 个带有素数间隔(5 秒 - 600 秒)的 setInterval 循环,反复触发调试器断点。每个实例使用唯一的编码字符串。
2穿刺程序触发器transforms/tripwires.ts嵌入隐藏检查,将参数哈希与秘密值进行比较。5 种哈希模式(位指纹、模运算、charCodeAt、数字哈希、typeof+length)。对秘密输入触发静默状态损坏、忙循环或抛出异常。[论文 4]
3LPN 噪声注入transforms/noiseInjection.ts通过算术计算中的拆分路径添加和取消随机噪声。6 种模式:加/减、XOR、乘/除、拆分双变量、计算哈希链、位旋转。中间值在没有追踪完整取消过程的情况下是无意义的。[论文 7]
顺序变换文件描述
4控制流平坦化transforms/controlFlowFlattening.ts将函数体转换为 while(true) { switch((_s * P) % M) { ... } } 状态机,使用 模算术调度——case 值通过 (stateId * multiplier) % modulus 编码,使用随机素数参数。[论文 3]
5不透明谓词transforms/opaquePredicates.ts注入总是评估为 true 或 false 但在数学上难以证明的 if 条件(例如 (x*x+x)%2===0)。涵盖模算术、位运算和类型检查类别的 15 个谓词公式。
6代理函数transforms/proxyFunctions.ts将所有函数调用路由至两个分发器:_fc(fn, ...args) 用于简单调用,_mc(obj, prop, ...args) 用于方法调用。使用捕获在局部变量中的 Function.prototype.apply 以增强弹性。
7上下文窗口耗尽transforms/contextExhaustion.ts将表达式包裹在深度嵌套的三目运算符中,包含不透明条件和 void 表达式链以及条件 void 填充。迫使 LLM 将上下文窗口 token 浪费在噪声上。
8逗号表达式合并transforms/commaExpressions.ts将连续的表达式语句合并为单个逗号表达式:a(); b(); return c() 变为 return a(), b(), c()。
顺序传递文件描述
9第一遍:编目passes/firstPass.ts遍历 AST 并对每个标识符进行编目,构建一个全局映射,为每个标识符分配一个随机的 6-16 字符 Unicode 名称,这些名称从 16 个脚本范围(中日韩、谚文、希腊、西里尔、天城文、泰文、阿拉伯、片假名等)中选择。
10第二遍:替换passes/secondPass.ts将所有标识符名称替换为其混淆的 Unicode 等效名称。将 require() 参数编码为 String.fromCharCode(...)。将静态 import/export 源编码为 Unicode 转义字符串字面量。替换类 superClass 引用、模板字面量表达式和解构模式。
11第三遍:虚拟参数passes/thirdPass.ts向每个函数声明和表达式注入 0-15 个随机未使用的参数。跳过带有 rest 参数的函数。移除所有注释。
顺序变换文件描述
12全局变量编码transforms/globalVariableEncoding.ts将全局变量引用(从 globalThis + window 包动态发现)替换为 eval("Name<suffix>".replace(new RegExp("<suffix>$"), ""))。两个字符串均通过字符串数组流转。
13属性键编码transforms/propertyKeyEncoding.ts将点访问转换为计算访问,使用每作用域注册表。跨作用域访问有效,因为所有后缀在运行时通过 .replace() 解析为相同的属性名。
14数字编码transforms/numberEncoding.ts11 种编码策略:移位+加、XOR 恒等、补码、除法、嵌套移位、双重 NOT、模运算等。每个实例唯一生成。跳过属性键和 switch case 值。
15自完整性验证transforms/selfIntegrity.ts注入 2-4 个运行时检查:eval 原生代码验证、Function.prototype.toString 完整性、时间异常检测、代码结构验证。反篡改响应:忙等待、抛出异常、静默损坏。[论文 10]
16字符串数组提取transforms/stringArrayExtraction.ts将所有字符串收集到单个数组中,使用 链式 XOR 解密(条目 N 的密钥依赖于条目 N-1 的解码内容)和 稀疏位置相关错误模式(每个字符使用不同的 XOR 密钥,在选定位置带有 LPN 启发的稀疏错误)。[论文 2, 9]
17Console 存根obfuscator.ts动态发现所有 console 方法并将其设置为无操作函数。
18Terser 压缩obfuscator.ts通过 terser 去除空白/格式(mangle: false,compress: false)。如果 terser 无法解析输出,则回退到基于正则表达式的去除。
基于变异transforms/deadCodeInjection.ts克隆 真实 语句并进行变异:在等价组内交换运算符、扰动常量、重命名标识符。生成在 AST 结构上与真实代码无法区分的死代码。[论文 3]
论文作者实现的技术
[论文 1] 论程序混淆的(不)可能性Barak, Goldreich, Impagliazzo, Rudich, Sahai, Vadhan, Yang不可混淆函数测试用例——验证工具,测试秘密是否在混淆后存活
[论文 2] 所有电路的候选 iO 和功能性加密Garg, Gentry, Halevi, Raykova, Sahai, Waters链式字符串解密——Kilian 风格随机化,每个条目的密钥依赖于前一个解码字符串
[论文 3] 基于多线性子群消除假设的 iOGentry, Lewko, Sahai, Waters基于变异的死代码(结构上与真实代码相同);CFF 中的模算术状态转换
[论文 4] 如何使用 iO:可否认加密及其他Sahai, Waters穿刺程序触发器——对秘密输入触发的隐藏检查
[论文 7] 基于良好基础假设的 iOJain, Lin, Sahai数字计算中的 LPN 启发噪声注入
[论文 9] 基于双线性映射和 LPN 变体的 iORagavan, Vafa, Vaikuntanathan具有位置相关错误模式的稀疏 XOR 编码
[论文 10] 零量子电路的 iO 及其应用Bartusek, Malavolta用于死代码质量验证的空电路测试;自完整性验证(双模式)