首页
论坛
课程
招聘
[原创]谈谈vmp的爆破
2018-2-23 08:34 16048

[原创]谈谈vmp的爆破

2018-2-23 08:34
16048

0x00 前言
玩vmp的笔记吧,祝大家新年快乐。先谈谈爆破,这个比起其他的方面的话,应该很多人喜欢,比较直截了当。当然,也会提一些vmp其他的东西。

0x10 需要的基础知识

平常我们爆破一个软件,有一种有常见的方法就是通过修改jcc跳转来达到爆破的目的。而vmp实现jcc,跳还是不跳,其实计算是eflags。

以jz为例,大家都知道jz跳不跳其实是看zf标志位的状态:

zf == 1 ---> 跳转

zf == 0 ---> 不跳转

那么我们看看vmp是怎么做的,先上个elflags reg图和给几个要用的数字以及一个handle:


数字:0x815     0x246    0x206    0x216    0x40

(如果有玩过vmp的,应该对这几个数字有熟悉)

handle大致样子,记为vm_p(a,b):

not a
not b
and a,b


下面我会一一解释。

先看看0x815的二进制:100000010101

好像看不出来什么所以然,那么这样呢?


这样就很直观了,其实等价于OF AF PF CF的mask。

同理大家可以看看其他的几个数字。

比如0x40,这里就直接用维基的图了:


明白了这几个数字的含义那么我们看看可以怎么得到zf为1的情况,之前已经说到了会用到eflag的值。是不是可以这样:

      ~zf  = and(0x40,not(eflags)) = 0                                                          (1)

        zf   = and(0x40,eflags) = 1                                                                 (2)

注意到这里的0和1都是所对应到eflags zf的数值

那么eflags又是怎么得到的,这里vmp通过加法和0x815实现

      eflags = and( eflags1, 0x815) + and( eflags2, not(0x815))                 (3)

而vmp中的not,and运算都可以用vm_p来实现,比如我们将式(1)转换后,如下:

       ~zf = vm_p(not(0x40),eflags) = 0

至于eflags1,eflags2我们可以并不关心他怎么运算的,因为我们只需要修改最终的eflags即可达到爆破的目的。

不过接触过vmp的人应该明白eflags1,eflags2的数值是通过vm_p(sn,sn)+?这样的式子得到的。

相信vmp为什么会选择0x40这个数字来计算zf大家也明白了(还有一点,大家注意一下af)。


0x02 实战

明白了原理之后,我们找个东西进行一番实践。

这里我选择的是EverEdit,因为官方刚好有两个vmp版本

使用的是官方下的32位的绿色版

你可以输入了随意输入sn后(不过注意,everedit的sn太短不行,233)通过暂停法然后再单步找到vmp调用handle的地方(也就是dispather),也可以通过那块保存sn的堆空间找到(因为是malloc的),当然方法很多。

   

使用trace into记录到文件中。


接下来我们只需要找到vm_p这条handle,然后在记录的文件之中搜索(记得倒着,从下向上)就ok。

而怎么找handle,如果你对vmp有了解的话,应该知道其实就4套handler。

这里我用一种我的方法,先分析是如何jmp到handle的。

0052474C    8B1485 00D05B00   mov edx,dword ptr ds:[eax*4+0x5BD000]    ; <== handler调用
00524753  ^\E9 EA9BFAFF       jmp EverEdit.004CE342
004CE342    4A                dec edx                                  ; EverEdit.00524F92


然后我们在看看0x5BD000这个数组:


如果有人再仔细一些会发现,这个地址刚好是vmp0的区段的开始。

对了,可以提一提,这个数组大小是0x100 * 4。但其实vmp加密的时候第一次扫了186次,第二次随机扫剩下的,再把地址填进去。

至于为什么是186次:

1).186个匹配规则

2).186个handle

然后我把这些地址记录下来,修改后打印出来:


具体代码就不帖了。

很幸运的是,od看了看第一个handle对应的就是vm_p,如下:

0041742D    66:D3C2           rol dx,cl
00417430    8B45 00           mov eax,dword ptr ss:[ebp]
00417433    66:89F2           mov dx,si
00417436    8B55 04           mov edx,dword ptr ss:[ebp+0x4]
00417439    66:0FBAE3 01      bt bx,0x1
0041743E    F7D0              not eax
00417440    66:0FBAE4 01      bt sp,0x1
00417445    60                pushad
00417446    F7D2              not edx
00417448    F8                clc
00417449    66:85E4           test sp,sp
0041744C    F5                cmc
0041744D    21D0              and eax,edx
0041744F    9C                pushfd
00417450    890C24            mov dword ptr ss:[esp],ecx               ; EverEdit.005BA174

not eax
not edx
and eax,edx

这时候根据前面的知识,我们只需要搜索trace记录的log,比如搜索eax=40或者edx=40或者not(40)等

   

搜索三次后达到找到这个地方:

00417430 Main     mov eax,dword ptr ss:[ebp]                ; EAX=FFFFFFBF
00417436 Main     mov edx,dword ptr ss:[ebp+0x4]            ; EDX=00000246
0041743E Main     not eax                                   ; EAX=00000040
00417446 Main     not edx                                   ; EDX=FFFFFDB9
0041744D Main     and eax,edx                               ; FL=PZ, EAX=00000000
vm_p(not(40),eflags) ------>  and( 40, not(eflags))

很明显这里就是取0x40与eflags进行运算了,然后相信怎么修改大家也有明确了。

比如这里eax得到0,注册码不成立,那么正确的应该是这样vm_p(not(0x40),0x216) = 0x40,也就是eax的值是0x40成立。后面还有vm_shr之类的运算,不过那是确定zf的。

(这里想吐槽下EverEdit的作者,把sn一个一个读取的过程也vm了,跑了这么多行指令也是醉了)

然后我们可以根据寄存器的情况,写个小脚本或者做补丁了。比如这样的:

bp 41744d
start:
run
cmp eax,00000040
jnz start
cmp edx,FFFFFDB9
jnz start
cmp esp,0012E4E4
jnz start

end:
bc 41744d
ret
当然这里 取esp不太好,取esi,edi之类的更好。(可以思考一下)

停下来的时候修改寄存器的数值即可达到爆破的目的。
 

这里我直接修改edx为not(206)即可。然后这个软件好像是个重启验证,恩,有兴趣的可以下断之后,研究研究。应该多改一次就可以了,估计不止一个jcc。


0x03 结束语

接着说下vmp3.x的爆破,其实差不多,不过vmp3.x比起之前的来说区别还是很多

比如把handle更分散,用jmp等方法连接,然后还有一些检测。不过大家了解了vmp对于eflag的使用,那么应该没啥问题。

这里给个最新版的点,以便于大家理解。trace into之后的对比前16w行即可

00423F89    8A45 0B         mov al,byte ptr ss:[ebp+0xB]
00423F8C    8BE5            mov esp,ebp
00423F8E    5D              pop ebp                                  ; EverEdit.00423ED3
00423F8F    C2 0800         retn 0x8

最后说下vmp。在未了解之前,就一直说听过。在了解了之后,才发现这个东西设计得多么细腻,从反汇编引擎到加壳的过程可以说是一个很顺畅的流程。当然vmp3.x重写了反汇编引擎(有点怪异..),然后想看怎么加壳发现流程被vm了。


[公告]请完善个人简历信息,招聘企业等你来!

最后于 2019-2-1 18:24 被admin编辑 ,原因:
收藏
点赞1
打赏
分享
最新回复 (29)
雪    币: 4564
活跃值: 活跃值 (121)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xie风腾 活跃值 2018-2-23 10:19
2
0

楼主,介是要上天呀
雪    币: 208
活跃值: 活跃值 (67)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
superdos 活跃值 2018-2-23 10:33
3
0
顶。。。。。。。。。。。。。。
雪    币: 3
活跃值: 活跃值 (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_盛兰政 活跃值 2018-2-23 11:03
4
0
楼主,TMD+WL+SDK可以脱壳吗
雪    币: 315
活跃值: 活跃值 (39)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
lhglhg 活跃值 1 2018-2-23 12:46
5
0
谢谢分享!!学习了!!!
雪    币: 455
活跃值: 活跃值 (97)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
ssarg 活跃值 2018-2-23 14:09
6
0
了解一下,谢谢。
雪    币: 89
活跃值: 活跃值 (84)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
baichisi 活跃值 2018-2-23 17:58
7
0
学习了!!!
雪    币: 2025
活跃值: 活跃值 (15)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
sessiondiy 活跃值 4 2018-2-25 00:17
8
0
抱歉,个人认为您需要注重的应该是 vmp 如何实现 cmp 指令,
cmp 是 VMP 的一个非常重要的过程, 而非 jcc

附上我4年前的笔记(虽然我现在也看不太懂了)
希望有所助益, 若有错也请指正

最后于 2018-2-25 00:18 被sessiondiy编辑 ,原因:
上传的附件:
  • 3.PNG (176.55kb,17次下载)
雪    币: 2473
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
PYGame 活跃值 2018-2-25 06:55
9
0
了解sub就能还原vmp了
雪    币: 651
活跃值: 活跃值 (253)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
waiWH 活跃值 3 2018-2-25 08:42
10
0
sessiondiy 抱歉,个人认为您需要注重的应该是 vmp 如何实现 cmp 指令,cmp 是 VMP 的一个非常重要的过程, 而非 jcc附上我4年前的笔记(虽然我现在也看不太懂了)希望有所助益, 若有错也请指正
看了看您的笔记,其实就是等价于算eflags的过程
帖子中,我也有有所提到:
eflags = and( eflags1, 0x815) + and( eflags2, not(0x815))
.....
而对于爆破,举个例子:
cmp eax,0x233
jnz success
在 cmp的时候修改eax的数值效果 等同于 jnz的时候修改标志位
最后于 2018-2-25 08:45 被waiWH编辑 ,原因:
雪    币: 113
活跃值: 活跃值 (20)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
lpcdma 活跃值 2018-2-26 10:23
11
0
了解sub是什么意思?
雪    币: 245
活跃值: 活跃值 (54)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
好像很神奇 活跃值 2018-2-27 09:06
12
0
楼主666
雪    币: 4294
活跃值: 活跃值 (176)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jgs 活跃值 2018-3-2 22:03
13
0
lpcdma 了解sub是什么意思?
个人理解,所有的比较归根到底就是一个减法,然后根据标志寄存器值决定下一步流程
雪    币: 7366
活跃值: 活跃值 (95)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
聖blue 活跃值 2018-3-2 23:08
14
0
雪    币: 10
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
khaless 活跃值 2018-3-4 15:59
15
0
真心  谢谢楼主    谢谢  666666
雪    币: 7
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_时间 活跃值 2018-3-5 15:04
16
0
加密你可以爆破么
雪    币: 9
活跃值: 活跃值 (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ZwTrojan 活跃值 2018-3-7 09:13
17
0
如果软件每次启动都进行验证,是否需要制作补丁?
雪    币: 223
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
imbalilang 活跃值 2018-3-22 17:01
18
0
希望楼主能够撰写更多介绍VMP相关破解的知识
雪    币: 1208
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yunyu 活跃值 2018-3-25 11:18
19
0
还看不懂,先留着,迟早弄明白。哈哈
雪    币: 6684
活跃值: 活跃值 (150)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
HadesW 活跃值 1 2018-4-20 09:18
20
0
好强啊!
雪    币: 216
活跃值: 活跃值 (19)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
nig 活跃值 4 2018-4-22 07:29
21
1
有耐心,有时间,有毅力,高!
雪    币: 5241
活跃值: 活跃值 (235)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
kabeor 活跃值 2018-4-24 12:14
22
1
感谢666
雪    币: 1269
活跃值: 活跃值 (30)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
AsmDebuger 活跃值 1 2018-11-21 18:25
23
1
sessiondiy 抱歉,个人认为您需要注重的应该是 vmp 如何实现 cmp 指令,cmp 是 VMP 的一个非常重要的过程, 而非 jcc附上我4年前的笔记(虽然我现在也看不太懂了)希望有所助益, 若有错也请指正
终于看到S大了!十年了哦.
雪    币: 1269
活跃值: 活跃值 (30)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
AsmDebuger 活跃值 1 2018-11-21 18:28
24
1
sessiondiy 抱歉,个人认为您需要注重的应该是 vmp 如何实现 cmp 指令,cmp 是 VMP 的一个非常重要的过程, 而非 jcc附上我4年前的笔记(虽然我现在也看不太懂了)希望有所助益, 若有错也请指正
VMP的思想可以应用到各种平台.
雪    币: 646
活跃值: 活跃值 (116)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
fatcateatrat 活跃值 2020-6-11 15:09
25
0
感觉被吊打了,vmp也太难了吧。
雪    币: 256
活跃值: 活跃值 (152)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ZwCopyAll 活跃值 2020-6-11 16:18
26
0
mark
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_edqzstyl 活跃值 2020-6-14 18:31
27
0
可不可以帮我破解一个pc的软件??有偿
雪    币: 131
活跃值: 活跃值 (30)
能力值: (RANK:0 )
在线值:
发帖
回帖
粉丝
看穿了说不得 活跃值 2020-6-15 07:55
28
0
所以啊,作者一变,你们又得跟着变.你们把心得一讲,作者就来看一看,哦,加强加强.改变改变.
你们又要折腾一番.你们在明,作者在暗.你们看起来是攻方.实际上是守方啊.
所以啊,不折腾,才是最好.折腾个毛线.最后双方都累.
双输.
雪    币: 6203
活跃值: 活跃值 (170)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tDasm 活跃值 2020-6-15 09:24
29
0
vmp代码没有效验吗?如果有效验你就不能随便patch
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
wx_逸锋 活跃值 2020-6-21 06:07
30
0
10770870 有偿求逆向工程师
游客
登录 | 注册 方可回帖
返回