首页
社区
课程
招聘
[原创] VmProtect.3.0.0beta分析之虚拟机流程
发表于: 2025-10-1 23:50 14651

[原创] VmProtect.3.0.0beta分析之虚拟机流程

2025-10-1 23:50
14651

qq群: 387430043

个人空间 8abK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6K6M7r3q4U0k6g2)9J5k6h3u0A6L8r3W2T1K9h3I4A6i4K6u0W2j5$3!0E0i4K6u0r3x3K6f1@1y4U0V1#2y4U0j5$3y4o6p5@1y4U0j5H3x3b7`.`.

终于可以开始分析VmProtect3.x,以上的版本了,从刚开始接触vmp,那时是从0.7开始的,算是最早的版本了吧,那时候对虚拟机,一点概念都没有,什么虚拟寄存器,什么伪代码,为什么虚拟机里面没有寄存器的概念等等,慢慢的从了解其基本执行流程,到了解其混淆,一步步的学习,到开始分析3.x版本,还是蛮有成就感的,又可以接触新的东西了,而且是很多,从3.x版本开始,代码进行了重构,编写语言改用了C++,界面用上了QT变得更好看了,加密后的文件的大小也越来越大,也是因为计算机性能的大幅度提升,不用再考虑太多的性能方面的东西,上一篇文章,我讲的是2.12.3版本的,加密前是3kb,加密后才12kb,然后这篇的例子,由于这个版本的主程序,还是有点问题的,我在win10运行不了,于是我放xp虚拟机上跑,给程序加壳的时候也是状况百出,但是经过一顿测试,拿了一堆程序,又改来改去加密的代码,终于弄出一个较为满意的例子。然后这个程序加壳前,大小179kb,加壳后590kb。大小直接增加400多kb,秉承着,柿子专挑乱的捏,选择了VmProtect.3.0.0beta,这个beta是测试版的意思。 这次给大家的附件没有虚拟机主程序,你们去论坛下载就可以了,然后我说下,设置啥的,首先加密的是入口点后面的的下面两行代码,

也是吸取上一篇文章的教训了,给六个寄存器都赋值,加密的是0040A5C6和0040A5CB这两条代码,然后选项那边,把是都改成否,英文版的,yes全改no,最后Compilation Type(编译类型),这边选择Virtualization(虚拟化)。我们把编译成功的123.vmp.exe拖到OD上

0040A5C6这边的代码被替换成了jmp指令,0040A5CB这边的代码可能是被替换成某个handler了吧。我们接着往下单步

到这里还是和我们前面分析的vmp1.6一样,push,call组合。我们接着往下单步

这边因为虚拟机大小和之前变得大很多,我贴代码不能像以前一样全部贴出来,太占用篇幅了,关键的留住,其他的用省略表示,然后这一大段代码,我们分析的时候可以翻开之前我分析的1.64版本的那个例子,我也放在附件里面了,这边我们执行到004527CD的时候可以看到,这里和1.64版本的区别是少了那个重复的寄存器。004527CD这边的代码执行完,这时候这个esi是加密了的,00452811这条代码执行完esi,才解密出来,前面的那些对其他寄存器的操作统统都是垃圾指令我们只看esi就行,00452811这条代码我们也可以在1.64版本找到他的位置,0045281C这条代码等价于sub esp,0xC0。0045283B这条代码等价于mov edi,0045283B,这边在我们前面分析过的vmp里面从来没见过了,这个edi不是handler的基地址,只能说用于计算handler的地址,我们再往下单步,00452841这条指令是从esi读取4字节,以前分析的都是读取1字节,0045284A这条指令和00452863的指令是成对出现的,在我以前分析过1.2版本伪代码解密的时候,有详细分析过,就是用伪代码作为密钥,但是执行一次伪代码就变一次,分析的时候还觉得挺复杂,那时候有三种可能,xor对xor,add对add,sub对sub。不一样的是这边是4字节,分析到这边总结一下变化,果然重构之后很强大,这里作者已经把handler隐藏了,这里面所有的改动就一个目的隐藏handler,以前那种 eax*4+基地址 = handler地址,类似c++虚函数的时代已经过去了,esp存放虚拟寄存的基地址,之前版本是edi,那么现在edi干什么呢?之前他作为虚拟寄存器基地址默默无闻,现在可牛逼了,现在成了存放handler地址的寄存器,配合push和retn去执行各个handler,遵循一个公式,edi = 解密(伪代码) + edi,所以说我们要算出所有handler的地址,上一条执行的handler的地址。核心思路还是一样,只不过实现起来和以前发生了很大的改变。作者的目的就一个,怕我们像以前版本一样知道所有handler的地址,然后把所有伪代码都翻译成正常指令。

我们执行到00452869的代码接着单步,就来到了第一条handler

上面这条handler虽然和以前分析的一样,是填充虚拟寄存器用的,但是也有很大的变化,上一篇我们分析的那个2.12.3版本,虚拟寄存器的偏移直接在伪代码上可以看出来,但是这边采用了双重加密,关于双重加密,我出的课程《VMProtect虚拟机逆向入门》 有对主程序的逆向分析,其中对这个双重加密有详细的分析。这边我简单说一下,这个加密方式早在我分析1.2版的时候就有了,首先双重加密第一次就是用譬如not,inc,bswap等一些算术指令的组合进行加密,第二次就是利用伪代码地址作为密钥使用xor,add,sub其中一个加密,这个伪代码地址也会加密生成新的密钥,所以解密的时候正好反过来,先用伪代码地址作为密钥使用xor,add,sub其中一个解密,接着再用譬如not,inc,bswap等一些算术指令的组合进行解密,这才解密完成,然后就是再算出新的密钥。大概就是这个意思了,然后这个伪代码地址加密的长度可以是4字节2字节和1字节,如果是2个字节和1个字节那就更新到ebx对应的bx或bl位置,这个解密伪代码地址用ebx存放,第一次加密或者解密的时候就esi的值。其实这个我们大致了解一下就可以了,反正都是加密了,这边还有很多无关紧要的垃圾指令,其实我们了解他的行为之后,那些垃圾指令一眼就看出来了。前两篇文章我们分析的时候没有考虑到的一个问题,现在还是要考虑一下,就是用vm_+寄存器名,来指代对应的虚拟寄存器,这个虚拟寄存器没什么深奥的,一句话就是用来存放真是寄存器的,仅此而已。eax对应的虚拟寄存器就是vm_eax,这样子我打字起来不会那么费劲,004476D8这句代码的注释,Vm_Relocation就是指存放重定位的虚拟寄存器了,这个重定位一直都是0,在堆栈上占坑用的,前面我们说过esp存放是虚拟寄存器基地址的,004476D8上的这条指令看到了吧,填充好对应的虚拟寄存器之后,就又去伪代码上读取4字节值,解密后与这条handler的地址相加计算出下一条handler的地址了,然后去执行。这与我们以前分析的handler区别就是以前执行完,跳回一个固定的地址解密出下一条handler地址去执行,不断的循环,而这里的每一条handler由两部分构成,第一部分实现handler的功能,第二部分,计算下一条handler地址并执行。我感觉为啥,文件会突然间变得那么大,就好比以前电脑是稀罕物的时候大家没电脑的时候去网吧上网,全世界的所有电脑总和就好比文件大小,现在普及了,几乎每个人都买的起电脑,那么全世界电脑总数就突然间变得非常大了,一个道理。

我们接着看下一条handler,同样是填充虚拟寄存的handler,虽然不是同一条handler但是和上一条功能一样,这里把esi的值填充到偏移为0x30的虚拟寄存器中,那么这个虚拟寄存器就命名为vm_esi。上面一个handler忘记记录了,这边记录一下是偏移为0x2c的虚拟寄存器,填充重定位值0,那么偏移为0x2c的虚拟寄存器记为vm_relocation。

我们接着看下一条handler,这里把ebp的值填充到偏移为0x24的虚拟寄存器中,那么这个虚拟寄存器就命名为vm_ebp。

我们接着看下一条handler,这里把ebx的值填充到偏移为0x4的虚拟寄存器中,那么这个虚拟寄存器就命名为vm_ebx。

我们接着看下一条handler,这里把eax的值填充到偏移为0x34的虚拟寄存器中,那么这个虚拟寄存器就命名为vm_eax。

我们接着看下一条handler,这里把edi的值填充到偏移为0x18的虚拟寄存器中,那么这个虚拟寄存器就命名为vm_edi。

我们接着看下一条handler,这里把ecx的值填充到偏移为0x0的虚拟寄存器中,那么这个虚拟寄存器就命名为vm_ecx。

我们接着看下一条handler,这里把edx的值填充到偏移为0x1c的虚拟寄存器中,那么这个虚拟寄存器就命名为vm_edx。

我们接着看下一条handler,这里把eflags的值填充到偏移为0x3c的虚拟寄存器中,那么这个虚拟寄存器就命名为vm_eflags。

我们接着看下一条handler,这里把地址为0x49689c的call的返回值填充到偏移为0x20的虚拟寄存器中,那么这个虚拟寄存器就命名为vm_retaddr。

我们接着看下一条handler,这里把地址为0x496897的push的值填充到偏移为0x28的虚拟寄存器中,那么这个虚拟寄存器就命名为vm_push。

到这里我们制作一个虚拟寄存器分布表,这个虚拟寄存器总的大小是0x40,和我之前分析的文章所讲的版本一样,我分析1.2版本的时候就这样,可以存放16个寄存器,每个大小4字节,但是真正需要的不用这么多,所以多出来的可以用来计算,和用来搞混淆。0019FE88 vm_ecx vm_ebx 空闲 空闲0019FE98 空闲 空闲 vm_edi vm_edx0019FEA8 vm_retaddr vm_ebp vm_push vm_relocation0019FEB8 vm_esi vm_eax 空闲 vm_eflags

我们接着看下一条handler,这里从伪代码取出4字节数,然后解密出地址00415035,然后存放到[0019FF70]里面,接着又从伪代码中取出4字节数,解密出下一条handler地址。

上面这个代码,在我讲上一篇文章混淆的时候提到过,就是固定跳转的。

我们接着看下一条handler,我们对照上面的虚拟寄存器分布表很容易看出来是,取出vm_eflags的值,然后存放到[0019FF6C]里面。


[培训]《冰与火的战歌:Windows内核攻防实战》!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。

最后于 4天前 被阿强编辑 ,原因:
上传的附件:
收藏
免费 65
支持
分享
最新回复 (37)
雪    币: 7
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2025-10-2 09:47
0
雪    币: 10
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
55
2025-10-2 10:02
0
雪    币: 2263
活跃值: (7922)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢分享
2025-10-2 10:49
0
雪    币: 6378
活跃值: (6838)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
感谢分享,学习下。
2025-10-2 21:45
0
雪    币: 221
活跃值: (3246)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
感谢分享,学习下。 
2025-10-4 13:39
0
雪    币: 9992
活跃值: (6231)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
感谢分享
2025-10-4 19:14
0
雪    币: 130
活跃值: (1201)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
感谢分享,学习下。
2025-10-5 12:50
0
雪    币: 396
活跃值: (3603)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
感谢分享
2025-10-9 11:34
0
雪    币: 337
活跃值: (5090)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
感谢分享,学习下
2025-10-9 15:24
0
雪    币: 2
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
感谢分享
2025-10-11 10:29
0
雪    币: 224
活跃值: (10)
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
12
感谢分享   有兼职挖洞的大神吗   qq  28114822
2025-10-11 11:53
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
13
谢谢分享
2025-10-13 16:35
0
雪    币: 1
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
14
谢谢分享
2025-10-14 09:51
0
雪    币: 542
活跃值: (3181)
能力值: ( LV4,RANK:42 )
在线值:
发帖
回帖
粉丝
15
谢谢分享
2025-10-16 00:23
0
雪    币: 622
活跃值: (1852)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
666666666
2025-10-16 10:47
0
雪    币: 4
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
nxc
17
太牛了大佬,如何联系?
2025-10-29 21:49
0
雪    币: 2231
活跃值: (2800)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
18
nxc 太牛了大佬,如何联系?
在Vmprotect1.6x分析之虚拟机流程文末
2025-10-30 11:07
0
雪    币: 7963
活跃值: (5351)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
支持一下
2025-10-30 11:52
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
20
mark
2025-11-3 17:09
0
雪    币: 2790
活跃值: (6191)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
21
感谢分享
2025-11-20 18:08
0
雪    币: 20
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
22
学习学习
2025-11-21 11:59
0
雪    币: 2
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
23
学习学习
2025-11-25 17:36
0
雪    币: 254
活跃值: (133)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
学习学习
2025-12-11 13:20
0
雪    币: 11
活跃值: (348)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
学习学习
2026-1-1 16:40
0
游客
登录 | 注册 方可回帖
返回