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
谢谢楼主分享 学习一下 可是看不懂啊= =~ 努力学 表示完全伤不起VM 听说有vmp的源码,不知道哪里有 粗略看了一下,没看明白,收藏了,找个时间慢慢学习 没看懂。。。 看得很吃力,还是不明白。
555... 思路不错,加精鼓励,代码要是用代码框就更好了。
ps:最后那个是广告吧。。。 哎 看不懂啊= =~ 终于看到贼小子大师的杰作了! 过来学习的,谢谢,膜拜