深入了解JS 加密技术及JSVMP保护原理分析

发布于 2023-03-21  1.55k 次阅读


JSVMP(Virtual Machine based code Protection for JavaScript)的核心是在JavaScript代码保护过程中引入代码虚拟化思想,通过JS 加密实现源代码的虚拟化过程,将目标代码JS加密转换成自定义的字节码,这些字节码只有特殊的解释器才能识别,隐藏目标代码的关键逻辑。

往期回顾: JS代码虚拟化(JSVMP)保护原理分析

通过JS加密进一步利用WebAssembly技术实现特殊的虚拟解释器,然后通过编译隐藏解释器的执行逻辑。JavaScript代码虚拟化保护框架如图所示。

针对不同类型的目标代码,JSVMP实施不同的虚拟化策略,主要研究过程描述如下:
(1)JavaScript代码的虚拟化方法设计。
基于抽象语法树,对目标代码进行指令拆分,将原有高级语法表达拆分成模拟本地执行环境的原子操作形式。一般的JavaScript代码,含有DOM(Document Object Model,文档对象模型)对象操作,在指令拆分的基础上,将其中的属性名以及字符串用数组元素替换,进行字符转移操作,提取中间代码。设计一套自定义的虚拟指令集,将中间代码映射为虚拟指令,依据相应的编码规则编码虚拟指令得到字节码程序。
(2)基于WebAssembly的虚拟解释器设计。
依据前面虚拟指令集的设计,设计实现相应的解释程序Hnadler集合和组成虚拟解释器的其他重要组件。模拟本地执行的寄存器和堆栈环境和本地调度过程设计虚拟调度结构。由于对象等操作的特殊性,采用在C代码中内联JavaScript代码的方式实现相应的Handler操作。最后将实现的虚拟解释器代码逻辑经过编译得到完整虚拟解释器模块。
(3)计算密集型目标代码的虚拟化保护过程设计。
对于少数的计算密集型的目标代码,直接通过抽象语法树进行指令拆分提取出原子操作并完成代码虚拟化过程。且由于不需要处理对象操作,虚拟解释器的Handler组件可以完全由C实现,将虚拟解释器最终编译到一个完整的WASM模块,消除与JavaScript交互带来的性能消耗和额外胶接代码带来的空间开销。

JS代码的虚拟化

传统代码虚拟化保护的目标代码是本地指令,天然的具有基础操作的特点。和传统的编译型程序不同,JavaScript应用程序是带有语法属性的文本代码,天然的不具有本地操作指令的原子特性,难以像传统的二进制代码一样容易对其进行虚拟化。因此,虚拟化保护JavaScript代码的关键挑战在于需要先对目标代码进行特殊的拆分转化,破坏可读的语法属性,提取具有原子操作特性的中间代码,然后才能设计相应的虚拟指令和处理函数,并最终进行指令编码完成虚拟化的操作。下图给出了一个简单的目标代码虚拟化过程示例,具体的处理过程将在下面详细描述。

在下一章我们会了解到指令虚拟化的细节,敬请期待~

JS一键VMP加密 jsvmp.com


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