Code Virtualizer 是一款用于混淆代码的保护工具,主要面向软件开发者,用来守护程序里那些关键且敏感的代码段,让逆向工程难以得手,同时对系统资源的占用控制在很低水平。它的做法是把源代码中的 Intel x86 指令转换为虚拟指令,这些指令只有其内置的虚拟机器才能解读。针对每一个受保护的程序,生成的虚拟指令与虚拟机器都各自不同,从而避免他人对 Code Virtualizer 发起大范围攻击。该工具支持在任意 x32 或 x64 原生 PE 文件中保护重要代码区域,涵盖可执行文件(EXEs)、系统服务、DLLs、OCXs、ActiveX 控件、屏幕保护程序以及设备驱动程序等类型。

借助多台虚拟终端完成混淆处理
每个需要防护的程序都会获得专属的保护方案
可对各类 x32 与 x64 程序及驱动程序提供防护
先进的变异引擎
通过代码重组机制对动态链接库与驱动程序加以保护
在专门构建的虚拟环境中,任意 Intel x86 指令都能得到仿真运行。
每个受保护的程序内部都包含一组专属的虚拟码。
兼容各类压缩工具与软件保护机制。
由指令列加载 的保护
1、逆向工程的基本原理
程序创建完成后,编译器先把源代码转换成若干包含机器语言代码的对象文件,随后这些对象文件被链接整合,最终生成可执行文件。
破解者面对已编译的程序时,通常会借助反编译工具把机器语言代码转换为更便于理解的代码形式,比如汇编语言或较高级别的程序语言,再对转换所得的语言展开分析研究。
当破解者对目标程序有较深入的掌握时,就能通过修改已编译的程序来改变其运行方式。举例来说,破解者可以跳过程序中用于检测试用期的例程,让软件一直运行下去。更严重的情况是,破解者还能让程序表现出已经完成注册的状态。
2、代码虚拟化与逆向工程的对比
代码虚拟化的核心思路,是把一组二进制代码转换为只有另一种机器才能读懂的二进制代码。换一种说法,就是让某一特定机器的指令改写成另一台机器的指令。下图所呈现的内容,正是一组 Intel x86 指令被转换为另一台机器指令的过程,而这台目标机器采用的是 32 位精简指令集架构。
Code Virtualizer 能够为不同的指令集分别生成对应的虚拟执行环境。也就是说,同一组 Intel x86 指令会被转换成多种彼此不同的指令集形态,并分别运行在各自独立的虚拟机中,使破解者难以从生成的虚拟代码里找出可供辨识的规律。下图呈现的正是同一组 Intel x86 指令如何被转换为由不同种类虚拟机所模拟的虚拟代码。
当破解者试图反编译经 Code Virtualizer 保护的代码时,他找不到原本的 x86 指令,看到的只是一套连他自己或别的反编译工具都完全陌生的新指令集。破解者不得不耗费大量精力逐行揣摩代码含义,并逐个研究受保护程序内虚拟机的运作机制。Code Virtualizer 把虚拟码的运行方式以及各虚拟机的学习过程彻底打乱,令任何人设法弄清其中虚拟码如何运作的尝试都难以推进。
3、日常场景中的代码虚拟化
Code Virtualizer 能够直接集成到 Win32、Win64 程序或驱动程序中。使用时,只需在源代码中指定希望由 Code Virtualizer 保护的代码区域即可。以下示例演示了在 C 程序里保护某段特定代码的具体做法。
VIRTUALIZER_START/VIRTUALIZER_END 这两个宏本身并不参与实际运算,程序原有的执行流程不会因为它们的存在而发生任何改变。它们的作用仅在于标记:当受保护的程序进入被保护的运行区间后,Code Virtualizer 能够识别出这些被标记的代码区域,并将其转换为虚拟机能够理解的虚拟代码。
下图呈现的是一个原本已编译完成的程序(尚未受到保护时)与经 Code Virtualizer 保护之后所发生的变化对比。
从示意图可以看到,Code Virtualizer 会把生成的虚拟机器嵌入到受保护程序的尾部,这样程序运行时就能对这些虚拟代码进行模拟执行。虚拟机器体积约在 10 Kb 到 30 Kb 之间,具体取决于所选复杂程度,对最终生成的受保护程序体积影响并不明显。
(您的评论需要经过审核才能显示)
0条评论