上期文章:指令编码
上几篇描述了JavaScript代码虚拟化过程,并且给出了虚拟指令设计和JavaScript实现的解释程序示例。代码虚拟化保护在运行时需要特殊的虚拟解释器解释字节码程序来还原目标代码的功能。一般情况下,为了虚拟机保护模块能够正常在浏览器端执行,可以完全采用JavaScript实现虚拟解释器,但是这种情况下,虚拟解释器的逻辑会完全暴露在用户面前,其执行逻辑是不安全的。
WebAssembly也在JavaScript虚拟机中运行,但是其具有更接近原生代码的性能表现,可以与JavaScript自由交互且互不排斥。并且WebAssembly是一种二进制格式,再加上编译的过程可以添加优化操作,因此很难通过逆向工程还原业务逻辑,所以更加的安全。因此,本文采用WebAssembly技术实现JavaScript代码虚拟化保护框架中的虚拟解释器模块。目前有多种语言支持编译到WebAssembly,C语言是最常用的一种,所以本文采用C语言来实现目标结构代码的编写,并通过Emscripten编译器将其编译成WASM模块。
然而JavaScript代码中含有大量的目前WebAssembly不支持的DOM对象和属性等操作,导致无法直接使用C定义实现所有关键的数据结构。本文在设计中使用JavaScript代码参与实现这些相关的数据结构,如Handler和VMcontext。主要依据Emscripten允许C/C++代码与JavaScript通信的设定,通过下表中的宏我们可以实现在C中内联JavaScript代码,实现相关的操作。下面的将详细介绍虚拟解释器的核心组件设计、编译及其调用过程。
JS一键VMP加密 jsvmp.com