在二进制代码保护领域,特别是对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一键加密平台
Comments | NOTHING