首页
社区
课程
招聘
[原创]谈谈vmp的爆破
发表于: 2018-2-23 08:34 28774

[原创]谈谈vmp的爆破

2018-2-23 08:34
28774

平常我们爆破一个软件,有一种有常见的方法就是通过修改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):

下面我会一一解释。

先看看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的。


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

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

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

至于为什么是186次:

1).186个匹配规则


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2019-2-1 18:24 被admin编辑 ,原因:
收藏
免费 4
支持
分享
最新回复 (31)
雪    币: 12322
活跃值: (5083)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2

楼主,介是要上天呀
2018-2-23 10:19
0
雪    币: 2058
活跃值: (2521)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
顶。。。。。。。。。。。。。。
2018-2-23 10:33
0
雪    币: 3
活跃值: (57)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
楼主,TMD+WL+SDK可以脱壳吗
2018-2-23 11:03
0
雪    币: 221
活跃值: (2311)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
谢谢分享!!学习了!!!
2018-2-23 12:46
0
雪    币: 465
活跃值: (667)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
6
了解一下,谢谢。
2018-2-23 14:09
0
雪    币: 33
活跃值: (784)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
学习了!!!
2018-2-23 17:58
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
8
抱歉,个人认为您需要注重的应该是 vmp 如何实现 cmp 指令,
cmp 是 VMP 的一个非常重要的过程, 而非 jcc

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

最后于 2018-2-25 00:18 被sessiondiy编辑 ,原因:
上传的附件:
  • 3.PNG (176.55kb,25次下载)
2018-2-25 00:17
0
雪    币: 2473
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
了解sub就能还原vmp了
2018-2-25 06:55
0
雪    币: 911
活跃值: (1358)
能力值: ( LV12,RANK:280 )
在线值:
发帖
回帖
粉丝
10
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编辑 ,原因:
2018-2-25 08:42
0
雪    币: 116
活跃值: (295)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
11
了解sub是什么意思?
2018-2-26 10:23
0
雪    币: 94
活跃值: (228)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
楼主666
2018-2-27 09:06
0
雪    币: 8895
活跃值: (5116)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jgs
13
lpcdma 了解sub是什么意思?
个人理解,所有的比较归根到底就是一个减法,然后根据标志寄存器值决定下一步流程
2018-3-2 22:03
0
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
2018-3-2 23:08
0
雪    币: 10
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
真心  谢谢楼主    谢谢  666666
2018-3-4 15:59
0
雪    币: 94
活跃值: (333)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
16
加密你可以爆破么
2018-3-5 15:04
0
雪    币: 4
活跃值: (346)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
如果软件每次启动都进行验证,是否需要制作补丁?
2018-3-7 09:13
0
雪    币: 23
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
希望楼主能够撰写更多介绍VMP相关破解的知识
2018-3-22 17:01
0
雪    币: 1208
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
还看不懂,先留着,迟早弄明白。哈哈
2018-3-25 11:18
0
雪    币: 9217
活跃值: (1886)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
20
好强啊!
2018-4-20 09:18
0
雪    币: 413
活跃值: (637)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
21
有耐心,有时间,有毅力,高!
2018-4-22 07:29
1
雪    币: 6086
活跃值: (1117)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
22
感谢666
2018-4-24 12:14
1
雪    币: 1270
活跃值: (109)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
23
sessiondiy 抱歉,个人认为您需要注重的应该是 vmp 如何实现 cmp 指令,cmp 是 VMP 的一个非常重要的过程, 而非 jcc附上我4年前的笔记(虽然我现在也看不太懂了)希望有所助益, 若有错也请指正
终于看到S大了!十年了哦.
2018-11-21 18:25
1
雪    币: 1270
活跃值: (109)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
24
sessiondiy 抱歉,个人认为您需要注重的应该是 vmp 如何实现 cmp 指令,cmp 是 VMP 的一个非常重要的过程, 而非 jcc附上我4年前的笔记(虽然我现在也看不太懂了)希望有所助益, 若有错也请指正
VMP的思想可以应用到各种平台.
2018-11-21 18:28
1
雪    币: 341
活跃值: (1005)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
25
感觉被吊打了,vmp也太难了吧。
2020-6-11 15:09
0
游客
登录 | 注册 方可回帖
返回
//