上期文章:JS代码指令拆分
经过指令拆分,已经将包括“document”在内的所有变量和属性都转换成字符串常量。这类常量和代码中本身就存在字符串常量一同作为加载指令的参数出现在当前的中间代码中。但是,这些字符串常量参数由于难以转化成字节码形式,无法在接下来的保护过程中完成虚拟映射并最终编码成字节码存储。因此,需要寻找新的参数加载方式。
传统的二进制程序中,指令的参数除了立即数,其他的参数都是存储在特定存储单元中,并通过相应的寻址方式来获取。参考这一过程,本文设计在中间代码映射到虚拟指令之前,将指令中的字符串常量全部提取出来,单独存储到一个字符串数组“VMA[]”中,原字符串常量的位置用所对应的数组元素“VMA[i]”来置换,最终可以得到图8中第三个模块中的代码形式。此时得到一个新的中间代码和一个字符串数组,我们称这一个过程为字符转移过程。字符串数组承担了一个存储空间的功能,而数组的索引则对应了特殊的寻址方式,只需要设计一个相应的虚拟指令就可模拟这一操作。同时,由于属性名等信息全部转移到了数组中,为了在解释执行时还原代码功能,这个字符串数组将作为重要的关键数据和最终编码得到的字节码程序一起保存在虚拟解释器中。