首页
社区
课程
招聘
[原创]VMP分析插件应用实例:一个简单的CrackMe
发表于: 2013-2-21 22:43 109599

[原创]VMP分析插件应用实例:一个简单的CrackMe

2013-2-21 22:43
109599
收藏
免费 9
支持
分享
最新回复 (155)
雪    币: 81
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
76
膜拜。。。
2013-8-30 20:36
0
雪    币: 558
活跃值: (117)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
77
感谢两位的解答,
2013-8-30 20:37
0
雪    币: 1270
活跃值: (230)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
78
因为插入指令会生成一些转移,和VMP的转移目标计算方法不一样,插件不知道目标,所以无法继续分析,最好先分析虚拟程序,插入后就不要再分析了。新版的vPushReg4和vPopReg4有变化,可以试试把特征中的AND AL,3C去掉,指令数据改为寄存器(不是原来的操作码包含寄存器),如果还不行的话就自己看看指令是怎么实现的,也许是我没遇到过的版本。
2013-8-30 21:00
0
雪    币: 514
活跃值: (723)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
79
牛精强啊牛精强,膜拜~!感觉这是俺懂上看雪以来最最最最详细的分析文章了,继续膜拜下。。
2013-8-30 21:16
0
雪    币: 81
活跃值: (115)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
80
但是指令名字不能改吧?比如vPushReg4不能改为vPushReg4a,否则分析的时候就不识别了。这样的话在未来如果vmp出现新指令还能扩展吗?

特征是能够识别的出vPushReg4和vPopReg4的只是后面的操作寄存器识别不出。我自己分析出来了以后怎么告诉插件呢?
2013-8-30 21:54
0
雪    币: 1270
活跃值: (230)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
81
部分重要指令插件硬编码了名字,不能修改,修改不重要的指令名字或添加新指令是没问题的,一般VMP中不会出现多个相同功能的指令,所以可以用原来的名字,修改指令信息。识别不出寄存器是什么情况,寄存器不正确?这个怀疑是指令信息中的指令数据没有填写正确,你在菜单里选打开虚拟指令窗口找到那个指令,看看怎么实现的,旧版本是
005C0388  /SUB AL,0EC                      ; vPopReg4
005C0398  |NOT AL
005C039F  |NEG AL
005C03A7  |AND AL,3C
005C03AF  |MOV EDX,DWORD PTR SS:[EBP]
005C03C3  |ADD EBP,4
005C03C7  \MOV DWORD PTR DS:[EAX+EDI],EDX
其中解密部分可能不同,这是直接从操作码中取出寄存器索引,所以指令信息中的指令数据应该选操作码包含寄存器,新版变成了从数据中取寄存器索引,像这样
005B4227  /MOVZX EAX,BYTE PTR DS:[ESI-1]  ; vPopReg4
005B4230  |XOR AL,BL
005B4237  |NEG AL
005B423E  |SUB AL,86
005B4243  |ROR AL,5
005B4250  |XOR BL,AL
005B4259  |MOV EDX,DWORD PTR SS:[EBP]
005B425E  |ADD EBP,4
005B4960  |DEC ESI
005B4962  \MOV DWORD PTR DS:[EAX+EDI],EDX
指令信息中的指令数据要选寄存器,数据长度选BYTE。
2013-8-30 22:28
0
雪    币: 81
活跃值: (115)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
82
指令数据有改成寄存器,部分vPopReg4和vPushReg4能够识别,但是分析虚拟程序的时候在log里看到xx地址算法分析失败,我就直接跳过去,发现失败的地方存在一些vPopReg4 ??,所以推断是因为vPopReg4寄存器未识别出导致的算法分析失败,等我回去了看看具体怎么寄存器解密的再来汇报,谢谢zdhysd耐心回答

另外插件在原版od和ollyice里虚拟机调试单步每次都会闪一下,并且退出最大化,在另一个终结者版本运行良好,原因不明。。
2013-8-31 10:41
0
雪    币: 1270
活跃值: (230)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
83
那就不知道怎么回事了,你看看指令怎么实现的吧,也许是不同版本的VMP。我用原版od不会闪啊,由于中断时od会自动设置焦点到cpu窗口,插件拦截了od的setcpu函数禁止设置焦点,可能有些版本没处理好。
2013-8-31 11:26
0
雪    币: 81
活跃值: (115)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
84
是的,闪就是因为会自动切换焦点到反汇编窗口,然后再切回来,难道和其他插件冲突了导致的吗,我去试试

找到原因了。和Olly Advanced的Flexible Breakpoints选项冲突了
2013-8-31 12:11
0
雪    币: 623
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
85
make
2013-8-31 12:32
0
雪    币: 199
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
86
强劲啊,作者!
2013-8-31 17:27
0
雪    币: 21
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
87
膜拜,忍着头晕还是看完了
2013-9-3 05:15
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
88
太厉害了,拜师了
2013-9-3 21:03
0
雪    币: 12
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
89
mark一下,学习crack
2013-9-10 16:54
0
雪    币: 21
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
90
mark,慢慢看
2013-9-10 22:00
0
雪    币: 81
活跃值: (112)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
91
膜拜下,慢慢看
2013-9-12 12:16
0
雪    币: 1044
活跃值: (1380)
能力值: ( LV3,RANK:35 )
在线值:
发帖
回帖
粉丝
92
非常感谢大牛分享软件给小菜学习!
2013-9-20 09:30
0
雪    币: 680
活跃值: (68)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
93
2013-9-20 09:47
0
雪    币: 81
活跃值: (115)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
94
想请教一下后续版本增加的真实ESP寄存器代表什么?有什么相关功能?我看和非虚拟机中的esp并不相等
2013-9-23 16:08
0
雪    币: 1270
活跃值: (230)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
95
是加密前的ESP,但是分析不一定完全正确,因为真实ESP在虚拟机中已经没有用了,一般应该差不多,如果中间有调用而且分析提示没填正确的话肯定是错的,虚拟+变形时也是错的,因为变形插入的垃圾指令会改变ESP,其他情况应该基本正确。
2013-9-23 19:30
0
雪    币: 81
活跃值: (115)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
96
也就是说这个ESP寄存器没有实际用途喽?还想请教一下我看分析的时候比如说有一个最终表达式为v22 = 0fffffff8 ,而实际上v22代表的是18ff98,是一个堆栈中的临时变量,用于接收多个返回值api。这是分析有误,还是代表相对于某个地址堆栈的相对偏移?如果是有误的话我应该填写怎样的分析提示呢?
2013-9-23 20:42
0
雪    币: 1270
活跃值: (230)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
97
真实ESP在虚拟机中用处不大,仅作参考,比如看看函数参数的位置之类的,不一定完全准确。你那个18ff98是一个堆栈中的地址吧,看看v22的数据类型是不是vESP,由于每次进入函数时ESP可能不同,插件使用偏移来表示堆栈中的地址,函数开始时vESP为0,0fffffff8表示开始时的vESP-8。
2013-9-23 21:15
0
雪    币: 81
活跃值: (115)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
98
v22的数据类型确实是vEsp,进入函数Esp加上偏移就是18ff98,明白啦,谢谢
2013-9-24 16:16
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
99
请教一下,有个地方不太懂:

大部分寄存器都和虚拟程序开始时相同,没有被改变,先拿EAX计算一下,EAX被写入堆栈的地址是-0C4,vJmp执行前vESP是-0E8,执行后会把栈顶的转移目标弹出,变成-0E4,这就是被调用函数执行时的vESP,-0C4 - -0E4 = 20,说明EAX在初始堆栈中的位置是20,添加提示initReg(eax,20),其他寄存器按相同方法计算。

全部提示为/*initReg(eax,20);initReg(ecx,28);initReg(edx,8);initReg(ebx,1C);initReg(ebp,10);initReg(edi,14);initReg(esi,18)*/

这句应该添加到哪里??
是在004C3918  |.  83           vJmp_00425E0A
还是004B77D0  /$  A2  vPopReg4 vR10  ;  /*esp(8); arg(1); regModify(eax)*/
还是initReg(eax,20)逐个添加到004C3929  |.  8C           vPushReg4 vR3        堆栈-0C4:(寄存器)EAX

都尝试过添加..再分析..但后面的entryVMxxx仍然存在..
2013-9-24 17:32
0
雪    币: 1270
活跃值: (230)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
100
填到被调用函数第一条指令,就是4B77D0,填完后再重新分析就只有entryVMEfl_4D6C58和entryVMEax_4D6C58了。efl是标志不用管它,eax因为被改变了(被调用函数设了regModify(eax)),但是不知道改变值,所以也是未知的,可以给它设一个已知的值,比如regModify(eax, "发现调试器"),后面就不会再这样显示了。
2013-9-24 19:30
0
游客
登录 | 注册 方可回帖
返回