JavaScript代码虚拟化保护原理深度分析

发布于 4 小时前  0 次阅读


在二进制代码保护领域,特别是对PE(Portable Executable)文件的保护,代码虚拟化保护已经是一个成熟可靠的技术。JS虚拟化保护通常以二进制可执行程序为保护目标,其核心是用自定义的虚拟指令模拟替换目标程序指令,并编码成特殊的字节码和特殊的虚拟解释器嵌入到目标文件中,在运行时虚拟解释器调度特殊的解释程序,才能解释自定义字节码并最终还原源码的功能。

虚拟化保护的基本结构

JS虚拟化保护的重要结构是虚拟指令集和虚拟解释器。保护时虚拟指令最终被编码成特殊的字节码(Bytecodes),而虚拟解释器主要由以下结构组成:

  • VMContext(虚拟执行上下文或虚拟环境)
  • VMInit(虚拟环境初始化模块)
  • VMExit(退出虚拟机模块)
  • Dispatcher(调度器)
  • Handler(字节码解释程序)

为什么选择WebAssembly?

目前,Chrome、Firefox、Edge和Safari等主流浏览器都支持WebAssembly。与传统JavaScript相比,WebAssembly可大幅提升执行性能。例如:

  • Figma使用WebAssembly后运行速度提升了3倍
  • Egret Engine 5.0支持WebAssembly后游戏运行性能提升了300%
  • Google Earth在Firefox上运行也使用了WebAssembly技术

虚拟化保护的安全性优势

现有JavaScript保护方案效果有限的主要原因是源码传输的JavaScript代码带有语法属性且具有可读的语义,攻击者很容易通过调试分析去除关键的保护逻辑。而JS虚拟化保护将目标代码换成自定义的字节码,可以破坏文本的语法属性,隐藏关键逻辑,并且其通过虚拟解释器在执行时动态还原逻辑,所以无法像应对反调试或者加密手段一样去除关键结构来绕过保护。

通过C/C++实现核心逻辑并编译成WebAssembly的二进制格式加载到目标应用中,使得在浏览器中无法直接读取源码。与所有代码逻辑都直接暴露给用户相比,这种特殊的虚拟化保护可以大大改善JavaScript目标代码的安全性。

来源:JSVMP一键加密平台


点击体验一键VMP加密 |下滑查看JSVMP相关文章