由于某些原因,写了一个vm的
破解文章
在网上随便找了一个VMP的cm,
这个程序是ximo写的,
运行之后是下面的鸟样子
Od加载
到达WinMain函数
发现了一坨VM代码,,用FKVMP Fuck了这一坨
然后在WinMain函数里F7跟几步,来到下图这里
.
然后搜索,自定义注释
下面,我们只能靠经验了,,,
一个程序的验证方法,无非就是
Cmp xxx,xxx
Jnz xxxxx
形式,
或者是
test xxx,xxx
jnz 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 ; 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,按下回车,等待执行结束
打印出的结果是下面:
在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,按下回车,等待执行停下
然后F7单步到
0040CF36 21D0 and eax,edx
修改Eax和edx为0
运行后破解成功
其实如果仔细观察打印出的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其实是1111的16进制,,
然后我们看到紧跟着的add32
0040C592 断点位于 fkvmp_vm.0040C592
add32
[ebp+4]: 000007DA
eax: FFFFFBA8
tmpadd: 00000382
有一个000007DA,这个是什么呢?其实他的10进制是2010
所以正确的注册码我猜测是2010
输入2010,果然是正确的
分享两个VMP找OEP的教程,吾等菜鸟的福音