Code Virtualizer java代码混淆助手是一款非常实用的程序代码混淆软件。有什么好用的源代码混淆工具?Code Virtualizer(java代码混淆助手)的优秀有目共睹。专门为帮助开发人员保护代码区域免受逆向工程而开发的小型软件,软件能够对代码数据进行加密并将其转换成其他用户无法读取和解释的格式,欢迎下载。
1、通过多个虚拟机进行混淆。
2、每个受保护的应用程序的独特保护。
3、保护任何x32和x64应用程序和设备驱动程序。
4、高级突变引擎。
5、代码重定位以保护DLL和设备驱动程序。
6、在独特的虚拟机内仿真任何Intel x86操作码。
7、每个受保护的应用程序的唯一虚拟操作码。
8、完全兼容任何压缩机/保护器。
9、命令行保护。
先把Code Virtualizer的虚拟机简单说一下,这里把我们自己的程序运行空间叫做宿主吧。cv虚拟机的所有运算的操作都在宿主的堆栈中完成。
cv自己的存放宿主程序的寄存器及解析例程的结构叫vm_context,所有操作的都是由一个叫vm_data数据块来驱动的。这里面的数据会指示cv的虚拟机如何取指令计算出新的数据。
程序运行进入cv虚拟机后,edi的值始终不变,一直指向vm_context(在Ryosuke的里面叫VM_BLOCK都是一个意思)的首地址。
从偏移0 ~ 0x1c 存放的是宿主的寄存器,但每次都会变,这个是按某种顺序的变化的。
esi指向vm_data结构,每执行一个dispatch,esi不断的增加。
eax的用处就是从esi中读取数据,进行运算,获得解析例程的dispatch号码。或者是vm_context的某个相对偏移地址(cv里面为了操作某个结构)
ebx就是参与计算用的,和vm_data中的数据运算,用来获得有效的eax
edx是个临时的变量,cv在宿主堆栈的运算中,常用edx做临时变量来存放数据
ebp,esp 基本没有太大用处,参与一些混淆代码的计算。
struct vm_context
{
DWORD vm_off_00; +0
DWORD vm_off_04; +4
DWORD vm_off_08; +8
DWORD vm_off_0c; +0c
DWORD vm_off_10; +10
DWORD vm_off_14; +14
DWORD vm_off_18; +18
DWORD vm_off_1c; +1c
DWORD vm_off_20;
DWORD VM_off_24;
DWORD VM_ecx_value;
DWORD VM_off_2c;
DWORD VM_busy_flag;
DWORD VM_off_34;
DWORD VM_off_38;
DWORD VM_off_3c;
DWORD VM_off_40;
DWORD VM_off_44;
DWORD VM_off_48;
DWORD vm_context_xxx1;
DWORD VM_dispatch_xxx2;
DWORD VM_dispatch_xxx3;
...
}
下面就测试这么一个例子:
.data
t_buff db 100 dup(090h)
t_txt db "test",0
t_title db "codevirtualizer",0
.code
START:
mov eax,offset t_buff
call VirtualizerStart
mov dword ptr[eax],01234567h ; 既然小窥,先只测试这一条语句吧,对cv的分析可以在里加入不同的语句一点一点分析
call VirtualizerEnd
invoke MessageBox,0,offset t_txt,offset t_title,0
invoke ExitProcess,0
end START
分别在Protection Options中选择这两种个加一次
Virtual Opcodes Obfuscation :Low ,Highest
Virtual Machine Complexity :Low ,Highest
Opcodes Mutation :Low ,Highest
分析后可以发现再混淆方面差别并不是太大。
进入VM之前先保存程序最初的环境
EAX 00403000
ECX 0013FFB0
EDX 7C92E514
EBX 7FFDE000
ESP 0013FFC0
EBP 0013FFF0
ESI 00000068
EDI 0013B790
EIP 004034EC CV_TES~3.004034EC
EFL 00000246 (NO,NB,E,BE,NS,PE,GE,LE)
软后先压入VM_DATA
00407083 68 1A704000 push CV_TES~3.0040701A -----VM_DATA
00407088 ^ E9 5FC4FFFF jmp CV_TES~3.004034EC
VM_DATA 内容每次加壳后都变化
0040701A 3F 1E E1 D0 F8 5F A0 8F B7 A4 5B 4A 72 E4 1B 0A ?嵝鴂爮筏[Jr?.
0040702A 32 2A D5 C4 5F D9 C0 9C 63 52 7A DE 21 10 38 21 2*漳_倮渃Rz?8!
0040703A DE CD F5 65 9A 89 11 74 22 9F 40 20 7A DD 43 EF 尥鮡殙t"烜 z軨
0040704A 45 05 C3 7B DD 74 54 43 A9 25 6B BD 85 1A EF 01 E脅輙TC?k絽?
0040705A 00 00 00 FB 59 04 FB 59 C7 93 6C CA 38 21 DE 3C ...鸜鸜菗l?!?
0040706A AA AE 51 AF 1D 3F C0 1E 8C D0 2F 8D FB 5B A4 02 Q???屝/嶜[?
0040707A 70 EB 14 72 E0 77 88 E6 B8 68 1A 70 40 00 E9 5F p?r鄔堟竓p@.開
0040708A C4 FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 ?�.............
通过重定位获得自身数据及处理例程的偏移,设置重定位标志,如果是dll还要重新定位。
004034EF E8 00000000 call CV_TES~3.004034F4 ; 重定位自身
004034F4 5F pop edi
004034F5 81EF F4344000 sub edi,CV_TES~3.004034F4
004034FB 8BC7 mov eax,edi
004034FD 81C7 00324000 add edi,offset <CV_TES~3.vm_dispatch> ;定位edi为vm_context
00403503 3B47 2C cmp eax,dword ptr ds:[edi+2C]
00403556 AC lods byte ptr ds:[esi] ;此处进入虚拟机,知道遇到vm_exit,才退出。
00403557 04 81 add al,81
00403559 04 90 add al,90
0040355B 00D8 add al,bl
0040355D 2C 90 sub al,90
0040355F E9 080A0000 jmp CV_TES~3.00403F6C
140.5M / 09-05
76.4M / 03-25
55M / 06-05
237.9M / 04-13
900.9M / 03-02
96.2M / 07-06
311.2M / 07-06
335M / 07-06
200M / 07-06
413.8M / 07-06
484.7M / 09-27
165.4M / 09-05
353.9M / 06-05
131.8M / 04-13
195.6M / 03-03
45.6M / 09-08
665.2M / 07-06
2.84G / 07-06
93M / 07-06
338.3M / 07-06
1.38G / 07-26
488.3M / 07-16
109.8M / 06-03
142M / 01-08
1.2M / 11-23
548.8M / 04-13
1.6M / 04-13
1.48G / 03-18
646.6M / 03-03
133.7M / 03-03
110.5M / 09-05
33.4M / 09-05
325.8M / 08-12
60M / 04-29
254M / 04-25
659M / 04-23
1M / 12-26
253.4M / 12-08
253M / 12-08
1.19G / 11-16
369M / 09-22
181.5M / 09-22
201.2M / 09-05
488.3M / 07-16
248.9M / 12-08
248.9M / 12-08
100.6M / 03-06
148.9M / 03-06
1.12G / 07-06
1.25G / 07-06
126.7M / 02-04
1.76G / 09-22
1.92G / 04-17
201.5M / 04-13
7.31G / 07-01
94.3M / 07-06
2.48G / 07-06
7.63G / 07-06
1M / 07-06
778.1M / 07-06
561.8M / 07-11
72M / 07-06
548.7M / 07-06
1.00G / 07-06
9.13G / 07-06
126.2M / 07-06
72M / 07-06
105.1M / 07-06
132M / 07-06
132M / 07-06