History of changes
Version 3.0
[*] PE: Added support for exceptions in x64 code
[*] Mach-O: Added support for SDK functions
[*] Ultimate: Added support for licensing functions for drivers and applications written on VB6
[*] Ultimate: Functionality of DLL Box has been enhanced. Now the protected application can envelope any files including ActiveX servers with optional automatic registration in the virtual registry.
[*] Virtual Box detection has been improved
[*] Script engine changed to LUA
[*] New VM architecture
[+] A new function VMProtectIsProtected is added to the SDK
样本的架构是不是官方所提的新架构我这里得不到更好的印证,
且不管是否为官方所提,样例发现的VM架构与以前版本的架构有很大不同,
想必能引起新一轮逆向技术的跟进,盾与矛的衍化。
随着时间推移,各种传统的vm已经司空见惯,vm也触动不了逆向工程师们太多的波澜。
传统vmp的架构采用的是虚拟代码表的方式
如
HHHso [原创]看雪 2016 CTF 第十八题 D-ASM-VM
https://bbs.pediy.com/thread-214473.htm
所提,
vmp的早期版本也是类似其所提的VM,
按问世先后和功能指令集的齐全方面,vmp都可以作为典型的老大。
这种VM架构典型的特征之一就是指令表,如HHHso 文章内容 所提
VMHandler = {
0x00:["vm_reg_dtor_leave","4022CE"],#
0x01:["vm_b_mov_R0_imm8","402101"],#
0x02:["vm_b_mov_R1_imm8","40212D"],#
0x03:["vm_b_mov_R2_imm8","40215A"],#
0x04:["vm_b_mov_R0_R1","402187"],# }
对这种传统架构的VM,外功主要用混淆的清除、和虚拟指令表的逆向上;
得到虚拟指令表功能后,就可以直接反编译为最初级的vm指令代码;
内功主要庸才对初级vm指令代码到高级代码的进一步逆向优化转变。
可见,如果要全面彻底攻击这种vm的防护(这里我们定义全面彻底攻击为全面逆向的角度;诚然,实际攻击根据所达到的目标不同而可以选择不同攻击维度和深度,手段不一),首要任务是拿下虚拟指令表,也就基本可以开展后续逆向攻击了。这时传统vm架构的攻击。
想对比,vmp的新架构没有了上述所提的虚拟指令表,
虚拟指令代码全部内联,且虚拟指令代码之间级联相关(下一虚拟指令代码的地址由运行时计算得到,不再是索引虚拟代码表得到,而是直接硬编码在虚拟代指令流中)
虚拟代码内联
在传统vmp架构中,如
vm_b_mov_R0_imm8对应着唯一的虚拟指令实现代码片段( 起始地址402101
)
0x01:["vm_b_mov_R0_imm8","402101"],#
即同一功能虚拟指令总会执行同一实现代码片段(前提:在同一虚拟机内)
在vmp的新架构中,同一功能虚拟指令都对应着不同的实现代码片段;
这类似于代码内联(内联出现多少处,就有多少份同样的代码),只不过
vmp同一虚拟指令功能的不同处的代码片段只在功能上一样,在实现代码(混淆)上并不完全一样。
正因如此,新架构vm过后,防护样例大小膨胀率比较可观,几百K的可以达到十几到几十M的体积。
对于这种没有存放虚拟指令表的vm新架构,虚拟指令的功能定性都无法像传统方式那样一劳永逸,
这将促进新一轮半自动或全自动逆向分析技术的跟进,引领更高层次的逆向技术发展。