吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 45667|回复: 92
收起左侧

[原创] VMP的破解

  [复制链接]
zeif 发表于 2013-7-17 17:23
由于某些原因,写了一个vm的破解文章


在网上随便找了一个VMPcm,



这个程序是ximo写的,



运行之后是下面的鸟样子



001.jpg




Od加载


002.jpg



到达WinMain函数



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



003.jpg



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


.
004.jpg




然后搜索,自定义注释


005.jpg



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



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



Cmp xxx,xxx
Jnz xxxxx


形式,



或者是


test xxx,xxx
jnz xxxxxxxx



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



再来看VM里的VM_Handle



006.jpg




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



vma-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




那么我们来看看,
NoraddVM中是什么样子的

Nor32:

0040D125   10CC            adc ah,cl                                ; nor32
0040D127   66:0D DC76      or ax,76DC
0040D12B   8B45 00         mov eax,dword ptrss:[ebp]
0040D12E   66:0FABF2       bts dx,si
0040D132   8B55 04         mov edx,dword ptrss:[ebp+4]
0040D135   66:0FBAE4 08    bt sp,8
0040D13A  ^ E9 EAFDFFFF     jmp fkvmp_vm.0040CF29


0040CF29    F8              clc
0040CF2A    F7D0            not eax
0040CF2C    38E4            cmp ah,ah
0040CF2E   60              pushad
0040CF2F    F7D2            not edx
0040CF31   66:0FBAE1 0E    bt cx,0E
0040CF36   21D0            and eax,edx
0040CF38   66:C74424 04 DB>mov word ptr ss:[esp+4],2ADB
0040CF3F    E8 7A080000     call fkvmp_vm.0040D7BE

0040D7BE ^\E9 52F3FFFF     jmp fkvmp_vm.0040CB15

0040CB15   8945 04         mov dword ptrss:[ebp+4],eax
0040CB18   9C              pushfd
0040CB19 ^ E9 85F7FFFF     jmp fkvmp_vm.0040C2A3




整理下,关键代码为
0040D12B   8B45 00         mov eax,dword ptrss:[ebp]
0040D132   8B55 04         mov edx,dword ptrss:[ebp+4]
0040CF2A    F7D0            not eax
0040CF2F    F7D2            not edx
0040CF36   21D0            and eax,edx




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


add32:

0040D74B   F9              stc                                      ; add32
0040D74C    8B45 00         mov eax,dword ptr ss:[ebp]
0040D74F    60              pushad
0040D750   886C24 04       mov byte ptr ss:[esp+4],ch
0040D754    F9              stc
0040D755 ^ E9 38EEFFFF     jmp fkvmp_vm.0040C592

0040C592    0145 04         add dword ptr ss:[ebp+4],eax
0040C595    E8 AE000000     call fkvmp_vm.0040C648



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




所以如果在下面两个地址下断点,我就能观察到所有的信息

0040C592   add dword ptrss:[ebp+4],eax
0040D135  bt sp,8



根据上诉,我写一个脚本

var tmp
mov tmp,0

var tmpadd
mov tmpadd,0

var tmpb
mov tmpb,0

test_start:
run



cmp eip,0040D135


jnz nor32_end
cmp edx,eax
jnz nor32_end
log "nor32"
log eax
log edx
mov tmp,eax
mov tmpb,edx
not tmp
not tmpb
and tmp,tmpb
log tmp
cmp eax,tmpadd
jnz nor32_end
log"----------------------------"
nor32_end:



cmp eip,0040C592
jnz add32_end

cmp eax,tmp
jz add32_log


mov tmpb,[ebp+4]
cmp tmpb,tmp
jz add32_log


jmp add32_end
add32_log:
log "add32"

log [ebp+4]
log eax

mov tmpadd,[ebp+4]
add tmpadd,eax
log tmpadd
add32_end:




jmp test_start
ret




,先让目标跑起来,挂上脚本

下断点0040C592,0040D135



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



007.jpg




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



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



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



var tmp
mov tmp,0

var tmpadd
mov tmpadd,0

var tmpb
mov tmpb,0

test_start:
run



cmp eip,0040D135


jnz nor32_end
cmp edx,eax
jnz nor32_end
log "nor32"
log eax
log edx
mov tmp,eax
mov tmpb,edx
not tmp
not tmpb
and tmp,tmpb
log tmp
cmp eax,tmpadd
jnz nor32_end
log"----------------------------"
cmp tmp,FFFFFC7D
jnz nor32_end
ret
nor32_end:



cmp eip,0040C592
jnz add32_end

cmp eax,tmp
jz add32_log


mov tmpb,[ebp+4]
cmp tmpb,tmp
jz add32_log


jmp add32_end
add32_log:
log "add32"

log [ebp+4]
log eax

mov tmpadd,[ebp+4]
add tmpadd,eax
log tmpadd
add32_end:




jmp test_start
ret



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



同样下断点0040C592,0040D135



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



008.jpg




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



修改Eaxedx0



009.jpg



运行后破解成功



010.jpg



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



0040D135  断点位于fkvmp_vm.0040D135
          nor32
          eax: 00000457
          edx: 00000457
          tmp: FFFFFBA8
0040C592   断点位于 fkvmp_vm.0040C592
          add32
          [ebp+4]: 000007DA
          eax: FFFFFBA8
          tmpadd: 00000382
0040D135  断点位于fkvmp_vm.0040D135
          nor32
          eax: 00000382
          edx: 00000382
          tmp: FFFFFC7D
          ----------------------------

你会发现00000457其实是111116进制,,


然后我们看到紧跟着的add32

0040C592   断点位于 fkvmp_vm.0040C592
          add32
          [ebp+4]: 000007DA
          eax: FFFFFBA8
          tmpadd: 00000382

有一个000007DA,这个是什么呢?其实他的10进制是2010
所以正确的注册码我猜测是2010



输入2010,果然是正确的



011.jpg



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


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

破解VMP.zip (70.98 KB, 下载次数: 360)



免费评分

参与人数 5热心值 +5 收起 理由
a784502165 + 1 谢谢@Thanks!
Koevas_炫烁 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩.
xu2611 + 1 谢谢@Thanks!
圣母皇太后 + 1 贼小子……
小雨细无声 + 1 感谢分享技巧。

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

追风之音 发表于 2015-1-23 12:15
谢谢楼主分享 学习一下 可是看不懂啊= =~   努力学
1354669803 发表于 2013-7-17 17:25
混小子 发表于 2013-7-17 17:34
五菱 发表于 2013-7-17 17:39
粗略看了一下,没看明白,收藏了,找个时间慢慢学习
ywywywx 发表于 2013-7-17 17:48
没看懂。。。
小雨细无声 发表于 2013-7-17 17:51
看得很吃力,还是不明白。
555...
Hmily 发表于 2013-7-17 18:04
思路不错,加精鼓励,代码要是用代码框就更好了。

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

免费评分

参与人数 1热心值 +1 收起 理由
zeif + 1 被发现了,害羞~

查看全部评分

K?☆mㄚì天 发表于 2013-7-17 18:12
哎 看不懂啊= =~
圣母皇太后 发表于 2013-7-17 18:29
终于看到贼小子大师的杰作了!
逍遥枷锁 发表于 2013-7-17 18:30
过来学习的,谢谢,膜拜
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-17 21:50

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表