zeif 发表于 2013-7-17 17:23

VMP的破解

由于某些原因,写了一个vm的破解文章


在网上随便找了一个VMP的cm,


这个程序是ximo写的,


运行之后是下面的鸟样子






Od加载




到达WinMain函数


发现了一坨VM代码,,用FKVMP Fuck了这一坨





然后在WinMain函数里F7跟几步,来到下图这里

.



然后搜索,自定义注释




下面,我们只能靠经验了,,,


一个程序的验证方法,无非就是


Cmp xxx,xxxJnz xxxxx

形式,


或者是

test xxx,xxxjnz xxxxxxxx


这里只说形式,不说具体情况,大家不要抬杠叫真哈


再来看VM里的VM_Handle






Cmp的话就是影响状态寄存器的减法


在vm里a-b就是temp= add(a, nor(b,b))nor (temp, temp)

所以调用VM_Handle的顺序应该是
Nor(X1,X2)à add(Y1,Y2)à nor(Z1,Z2)àseteip
其中X1==X2,Z1==Z2



那么我们来看看,Nor和add在VM中是什么样子的
Nor32:
0040D125   10CC            adc ah,cl                              ; nor320040D127   66:0D DC76      or ax,76DC0040D12B   8B45 00         mov eax,dword ptrss:0040D12E   66:0FABF2       bts dx,si0040D132   8B55 04         mov edx,dword ptrss:0040D135   66:0FBAE4 08    bt sp,80040D13A^ E9 EAFDFFFF   jmp fkvmp_vm.0040CF29

0040CF29    F8            clc0040CF2A    F7D0            not eax0040CF2C    38E4            cmp ah,ah0040CF2E   60            pushad0040CF2F    F7D2            not edx0040CF31   66:0FBAE1 0E    bt cx,0E0040CF36   21D0            and eax,edx0040CF38   66:C74424 04 DB>mov word ptr ss:,2ADB0040CF3F    E8 7A080000   call fkvmp_vm.0040D7BE
0040D7BE ^\E9 52F3FFFF   jmp fkvmp_vm.0040CB15
0040CB15   8945 04         mov dword ptrss:,eax0040CB18   9C            pushfd0040CB19 ^ E9 85F7FFFF   jmp fkvmp_vm.0040C2A3



整理下,关键代码为0040D12B   8B45 00         mov eax,dword ptrss:0040D132   8B55 04         mov edx,dword ptrss:0040CF2A    F7D0            not eax0040CF2F    F7D2            not edx0040CF36   21D0            and eax,edx



--------------------

add32:
0040D74B   F9            stc                                    ; add320040D74C    8B45 00         mov eax,dword ptr ss:0040D74F    60            pushad0040D750   886C24 04       mov byte ptr ss:,ch0040D754    F9            stc0040D755 ^ E9 38EEFFFF   jmp fkvmp_vm.0040C592
0040C592    0145 04         add dword ptr ss:,eax0040C595    E8 AE000000   call fkvmp_vm.0040C648


整理关键代码:0040D74C    8B45 00         mov eax,dword ptr ss:0040C592    0145 04         add dword ptr ss:,eax



所以如果在下面两个地址下断点,我就能观察到所有的信息
0040C592   add dword ptrss:,eax0040D135bt sp,8


根据上诉,我写一个脚本
var tmpmov tmp,0
var tmpaddmov tmpadd,0
var tmpbmov tmpb,0
test_start:run


cmp eip,0040D135

jnz nor32_endcmp edx,eaxjnz nor32_endlog "nor32"log eaxlog edxmov tmp,eaxmov tmpb,edxnot tmpnot tmpband tmp,tmpblog tmpcmp eax,tmpaddjnz nor32_endlog"----------------------------"nor32_end:


cmp eip,0040C592jnz add32_end
cmp eax,tmpjz add32_log

mov tmpb,cmp tmpb,tmpjz add32_log

jmp add32_endadd32_log:log "add32"
log log eax
mov tmpadd,add tmpadd,eaxlog tmpaddadd32_end:



jmp test_startret



,先让目标跑起来,挂上脚本
下断点0040C592,0040D135


在程序中,输入1111,按下回车,等待执行结束打印出的结果是下面:






在log中只有一次"----------------------------"


0040D135断点位于fkvmp_vm.0040D135          nor32          eax: 00000382          edx: 00000382          tmp: FFFFFC7D          ----------------------------


所以我把脚本改成下面的样子


var tmpmov tmp,0
var tmpaddmov tmpadd,0
var tmpbmov tmpb,0
test_start:run


cmp eip,0040D135

jnz nor32_endcmp edx,eaxjnz nor32_endlog "nor32"log eaxlog edxmov tmp,eaxmov tmpb,edxnot tmpnot tmpband tmp,tmpblog tmpcmp eax,tmpaddjnz nor32_endlog"----------------------------"cmp tmp,FFFFFC7Djnz nor32_endretnor32_end:


cmp eip,0040C592jnz add32_end
cmp eax,tmpjz add32_log

mov tmpb,cmp tmpb,tmpjz add32_log

jmp add32_endadd32_log:log "add32"
log log eax
mov tmpadd,add tmpadd,eaxlog tmpaddadd32_end:



jmp test_startret


目标跑起来, 再次挂上脚本,


同样下断点0040C592,0040D135


在程序中,输入1111,按下回车,等待执行停下






然后F7单步到0040CF36   21D0            and eax,edx


修改Eax和edx为0





运行后破解成功





其实如果仔细观察打印出的log


0040D135断点位于fkvmp_vm.0040D135          nor32          eax: 00000457          edx: 00000457          tmp: FFFFFBA80040C592   断点位于 fkvmp_vm.0040C592          add32          : 000007DA          eax: FFFFFBA8          tmpadd: 000003820040D135断点位于fkvmp_vm.0040D135          nor32          eax: 00000382          edx: 00000382          tmp: FFFFFC7D          ----------------------------
你会发现00000457其实是1111的16进制,,

然后我们看到紧跟着的add32
0040C592   断点位于 fkvmp_vm.0040C592          add32          : 000007DA          eax: FFFFFBA8          tmpadd: 00000382
有一个000007DA,这个是什么呢?其实他的10进制是2010所以正确的注册码我猜测是2010


输入2010,果然是正确的





分享两个VMP找OEP的教程,吾等菜鸟的福音

http://www.hxfans.net/forum.php?mod=viewthread&tid=100http://www.hxfans.net/forum.php?mod=viewthread&tid=107





追风之音 发表于 2015-1-23 12:15

谢谢楼主分享 学习一下 可是看不懂啊= =~   努力学

1354669803 发表于 2013-7-17 17:25

表示完全伤不起VM

混小子 发表于 2013-7-17 17:34

听说有vmp的源码,不知道哪里有

五菱 发表于 2013-7-17 17:39

粗略看了一下,没看明白,收藏了,找个时间慢慢学习

ywywywx 发表于 2013-7-17 17:48

没看懂。。。

小雨细无声 发表于 2013-7-17 17:51

看得很吃力,还是不明白。
555...

Hmily 发表于 2013-7-17 18:04

思路不错,加精鼓励,代码要是用代码框就更好了。

ps:最后那个是广告吧。。。

K?☆mㄚì天 发表于 2013-7-17 18:12

哎 看不懂啊= =~

圣母皇太后 发表于 2013-7-17 18:29

终于看到贼小子大师的杰作了!

逍遥枷锁 发表于 2013-7-17 18:30

过来学习的,谢谢,膜拜
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: VMP的破解