krakes-dev/KrakVm

GitHub: krakes-dev/KrakVm

KrakVM 是一个高级多态 JavaScript 虚拟机,用于保护代码免受逆向工程和静态分析。

Stars: 41 | Forks: 0

🛡️ KrakVM

用于代码保护的高级多态JavaScript虚拟机

[![Node.js 版本](https://img.shields.io/badge/Node-14%2B-green.svg)](https://nodejs.org/) [![MIT 许可证](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT) [![欢迎 PR](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](http://makeapullrequest.com)
**KrakVM** 是一个高度先进的多态 JavaScript 虚拟机框架,旨在保护源代码免受逆向工程和静态分析。通过将标准 JavaScript 翻译为自定义字节码格式,KrakVM 借助动态执行管线、随机化的指令集、深度结构混淆和主动防篡改防御来保护您的知识产权。 ## ✨ 核心安全特性 虽然基于前导码的动态操作码是一个独特亮点,但 KrakVM 实现了一个多层安全架构,旨在挫败离线分析、内存转储和动态调试。 ### 🔐 1. 端到端字节码加密 (LCG) 编译后的字节码永远不会以明文形式存在于内存中。 KrakVM 使用自定义的线性同余生成器 (LCG) 密码加密整个指令流编译过程。在运行时,虚拟机引擎按字节伪随机地"即时"解密指令(`readByte`,`readInt32`),动态更新其内部密钥状态(`xk`)。即使攻击者提取了 base64 载荷,执行流程在数学上仍被掩盖。 ### 🧬 2. 多态虚拟机生成 每次载荷生成都会构建一个完全独特的虚拟机执行环境: - **随机化操作码:** 指令的字节映射(例如,`0x1A` 表示 `ADD` 还是 `CALL`)在每次构建中都是伪随机且唯一的。 - **布局洗牌:** 注入到虚拟机引擎中的静态函数(处理程序)在编译器生成期间使用 Fisher-Yates 算法进行洗牌,确保没有两个虚拟机构建共享相同的变量序列、数组赋值或执行签名。 - **寄存器随机化:** 临时的编译器寄存器以不可预测的方式分配,以阻止对底层代码变量映射的静态模式识别。 ### 🧨 3. 主动防篡改与执行完整性 KrakVM 主动监控自身是否被未经授权修改或调试器单步执行: - **内存与签名哈希:** 虚拟机初始化序列对其内部内存占用和函数指针签名数组进行哈希处理。在执行前及关键点,`_ver()` 在数学上检查当前状态与预期哈希值的匹配情况。 - **激进内存擦除:** 如果检测到篡改,虚拟机不会仅仅报错退出。它会主动转储并擦除整个上下文:`ctx.mem = null`,`ctx.reg.fill(0)`,`ctx.stack.length = 0`。关键状态被立即销毁,以防止研究人员检查运行时崩溃。 - **诱饵异常:** 当虚拟机崩溃或检测到篡改时,它会通过从数组中随机选择,抛出随机的诱饵错误字符串,如 `Segmentation fault` 或 `Out of memory`,向攻击者完全隐藏失败的真正原因。 ### 🧩 4. 动态基于前导码的操作码 传统的虚拟机附带一个静态的操作码定义块(例如,`ops[0x42] = function add() {...}`)。这种静态映射使得底层执行引擎可预测。 KrakVM 原生地**在生成的虚拟机内存中保留 30% 到 50% 的核心指令**。缺失的操作码通过唯一生成的 `EVAL` 指令,在编译后的字节码本身*即时*注入到虚拟机状态中。虚拟机在物理上缺乏执行其程序的能力,直到字节码载荷在执行过程中原生地修复引擎。 ### 🍝 5. "面条式" 初始化链 为了防止从字节码前导码中提取基本字符串,缺失的动态操作码配置(`EVAL` 定义)并非按顺序聚集。 编译器将设置逻辑分解为分散的块,不可预测地编织在整个字节码 AST 中。执行开始时,通过 `JMP` 跳转到一个隐蔽的初始化节点,评估缺失环境的子集,然后在深埋于代码布局中的相互桥接标签之间跳跃,最终才启动实际的主执行序列。 ### 🛡️ 6. 深度结构多态性 为了击败 AST 指纹识别和基于签名的检测,KrakVM 在每次编译时都完全改变其内部 JavaScript 代码库结构: - **AST 变形:** 通用的逻辑屏障和循环(如 `while` 语句或严格的按位边界)会被程序化地转换成功能上等效但语法上不同的结构(例如 `for` 循环或像 `~(~a ^ b)` 这样的链式否定)。 - **数学掩码:** 硬编码的限制和初始化变量(如 `MAX_STACK`、`MAX_FRAMES` 或错误矩阵)会被动态替换为随机生成的数学多项式(例如在运行时计算 `(45000 - X + X)`)。 - **上下文属性扰乱:** 整个虚拟机属性命名空间(寄存器、内存布局、指令指针如 `ip` 和 `xk`)在每次构建中都被激进地随机化为唯一的 6 位十六进制标识符。 ### 🌪️ 7. 真正多态的反沙盒编解码器 字符串和敏感的字节码配置不仅仅是常规加密;它们受到一个自定义的、自合成的 AST 引擎保护: - **算法合成:** KrakVM 并非使用静态字符串密码,而是为每次构建从头合成一个全新的数学解码算法(`ADD`、`XOR`、`NOT` 等)。然后唯一地构建解码器的 AST 以在功能上反转这个特定的数学链。 - **分散的状态依赖:** 解码机制在开箱时是有意设计为有缺陷的。它依赖于在脚本全局范围内随机、不连续位置注入的加密变量(字母表片段和流密码种子)。如果分析人员尝试提取解码器函数在沙盒中运行,它会立即因缺少上下文而崩溃。 - **原生压缩:** 载荷生成会自动通过内部同步的 `uglify-js` 编译器步骤进行管道处理,永久删除空白、压缩操作,并将原始虚拟机执行内存占用减少超过 35%。 ## 🚀 安装 克隆仓库并运行设置(需要 Node.js): ``` git clone https://github.com/krakes-dev/KrakVm.git cd KrakVm npm install ``` ## 🛠️ 使用方法 您可以通过将标准 JavaScript 文件传递给构建系统来本地测试 KrakVM。 1. 创建您的目标 JavaScript 文件(例如 `input.js`)。 2. 通过索引框架运行构建管线: ``` const { build } = require('./src/index.js'); // Compile input.js into a protected virtual machine script build('input.js', 'output.protected.js'); ``` 3. 原生执行受保护的脚本: ``` node output.protected.js ``` ## 🏗️ 内部架构 - ⚙️ `src/vm/core.js` - 通用虚拟机引擎框架、执行循环、主动完整性检查和 LCG 内存处理程序。 - 🔧 `src/vm/handlers.js` - 用于通用操作码的各个 JavaScript 函数处理程序(生成期间被切片)。 - 🧬 `src/compiler/generator.js` - 将 `handlers` 逻辑切片、洗牌并伪随机化为唯一的虚拟机定义。 - 🧠 `src/compiler/compiler.js` - 解析 JavaScript AST(通过 `acorn`),生成自定义加密字节码,并用动态的 `EVAL` 面条式前导码配置包装它。 ## 🧪 测试 运行包含的基准测试套件,以确保虚拟机正确验证执行状态并验证多态布局序列: ``` npm test ``` ## 🛡️ 最佳安全实践 虽然 KrakVM 提供了高级动态代码执行,以极大地减缓、迷惑和阻止静态逆向工程分析(如 AST 提升和模式匹配),但在浏览器/Node 环境中,没有任何 JavaScript 保护在数学上是绝对的。KrakVM 最好在最终生成的包装器上结合补充的外部混淆(例如控制流平坦化、字符串隐藏),以实现最大的鲁棒性。 ## 📞 联系方式 如有咨询、讨论或**付费项目/自由职业工作**: **Telegram:** [@azulax1](https://t.me/azulax1) **Discord:** dch002 ## 📄 许可证 本项目根据 MIT 许可证授权。
标签:MITM代理, 数据可视化, 自定义脚本