代码虚拟化保护原理分析

发布于 2023-03-17  1.25k 次阅读


JS虚拟化 在二进制代码保护领域特别是对PE(PortableExecutable)文件的保护,代码虚拟化保护已经是一个成熟可靠的技术,有大量的成熟应用,下面将详细介绍代码虚拟化JS混淆的基本原理。

往期文章:JS混淆和JS压缩的前端代码攻防机制分析

JS虚拟化 基本保护过程,JS虚拟化保护通常以二进制可执行程序为保护目标,其核心是用自定义的虚拟指令模拟替换目标程序指令,并编码成特殊的字节码和特殊的虚拟解释器嵌入到目标文件中,在运行时虚拟解释器调度特殊的解释程序,才能解释自定义字节码并最终还原源码的功能。由于虚拟化保护在带来高强度的保护效果的同时也会带来较大的性能开销,所以通常JS虚拟化主要用于保护关键代码段。

二进制代码虚拟化保护的基本步骤

JS虚拟化保护的重要结构是虚拟指令集和虚拟解释器,保护时虚拟指令最终被编码成特殊的字节码(Bytecodes),而虚拟解释器主要由以下这些结构组成:VMContext(VirtualMachineContext,虚拟执行上下文或虚拟环境)、VMInit(虚拟环境初始化模块)、VMExit(退出虚拟机模块)、Dispatcher(调度器)以及Handler(字节码解释程序)。由于虚拟指令属于中间语言,中间过程并不影响真实的本地环境,包括通用寄存器和标志寄存器的值,因此需要建立一个虚拟环境VMContex来记录执行的过程,其内部包含了一组对应本地寄存器的虚拟寄存器。在进入虚拟机的时候会由VMInit模块负责初始化,将本地环境映射到虚拟环境中。在退出虚拟机的时候,VMExit模块则会将虚拟环境中的寄存器信息映射到本地真实环境,恢复本地执行的上下文。执行时虚拟解释器的调度核心Dispatcher会循环读取Bytecodes,并调度相应的处理程序Handler去解释字节码中包含的语义还原目标功能。

基于WebAssembly实现JavaScriptJS虚拟化 的可行性分析:目前,Chrome、Firefox、Edge和Safari等主流浏览器相继参与和推动并支持使用WebAssembly,其最大的优点在于可大幅提升JavaScript的性能,因此在业界,浏览器、游戏开发者以及一些需要提升性能的大型网页应用或者在线工具都在积极的应用WebAssembly。

例如,Figma[48]是一款多人实时协作UI设计工具,它以浏览器为基础环境,因此读取速度以及性能对其非常重要。之前Figma主要使用Asm.js[49]技术提升文件读取速度,而WebAssembly技术的应用使其运行速度提升了3倍。EgretEngine[50]是一款知名的2D、3D游戏引擎,有着极强的跨平台运行能力。EgretEngine5.0版本开始支持WebAssembly,将游戏运行性能提升了300%。Web-DSP[51]是一个即时多媒体影音处理函数库,主要以C++编写。通过编译成WebAssembly执行,让JavaScript开发用户也能在浏览器上使用处理多媒体影音文件。同样的,Google开始支持在Firefox浏览器上运行GoogleEarth,最主要的原因是使用了WebAssembly技术。通过上述内容,我们可以发现,WebAssembly已经可以稳定的应用在实际需求中。

现有的JavaScript保护方案效果有限的主要的原因在于,源码传输的JavaScript代码带有语法属性且具有可读的语义,攻击者很容易通过调试分析去除关键的保护逻辑,还原目标代码。而JS虚拟化 保护将目标代码换成自定义的字节码,可以破坏文本的语法属性,隐藏关键逻辑,并且其通过虚拟解释器在执行时动态还原逻辑,所以无法像应对反调试或者加密手段一样去除关键结构来绕过保护,因为一旦去除解释器,原函数的功能也会因无法还原而丢失。如一种采用模拟器混淆保护JavaScript代码的方法[52],其在传统变量替换代码重构基础上进一步将目标代码转化为“字节码”,使用JavaScript自身实现的模拟器解释编码结果来还原代码逻辑。然而,虽然其抽取隐藏了源码结构,但是模拟器和关键数据仍然在脚本中,攻击者可以据此提取还原的中间过程和结果。同样对于虚拟化保护,解释器模块的安全性也至关重要,若是核心的解释逻辑和关键数据轻易暴露,攻击者则可以通过跟踪调试提取关键的映射规则。因此,进一步对于关键结构虚拟解释器,设计采用C/C++实现核心逻辑,通过运用Emscripten[29]框架将其编译成WebAssembly的二进制格式加载到目标应用中,使得在浏览器中无法直接读取源码。尽管在理论上,处于客户端的内容都是不安全的,通过逆向工程总能在一定程度上分析还原部分逻辑,但是与所有代码逻辑都直接暴露给用户相比,这种特殊的虚拟化保护可以大大改善JavaScript目标代码的安全性。

综上所述,从可用性和安全性来看,本文提出的基于WebAssembly实现JavaScriptJS虚拟化 保护方法是可行的。

JS一键VMP加密 jsvmp.com


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