首页
论坛
专栏
课程

[虚拟机保护] [原创]破解vmp程序的关键点

2009-2-23 09:23 94760

[虚拟机保护] [原创]破解vmp程序的关键点

2009-2-23 09:23
94760
内容:

PART I:
vmp里面有很多handle,有一种handle很特殊,有几份copy,大致运算是:

not A
not B
and A , B

这个好像叫什么xx门的,它是计算jcc指令的关键点,一般爆破都是找jcc指令,因此,这条指令是破解的关键点


PART II:
11楼说的东西是基础,在这里:
http://hi.baidu.com/depteicn/blog/item/4941f6b73c8036f331add189.html

14楼也是基础的电路图


建议把这两个看懂,再向下看



PART III:

vmp里面有唯一的跳转指令,handle大概是这样的

mov e?x,[ebp]
add ebp,4
mov esi, e?x

这条handle是跳转指令,jmp,唯一的跳转,那么如何实现条件跳转呢?就要用到上面的那条唯一的逻辑运算handle


PART IV:

看到这里,大家应该明白了,vmp实现跳转,是先用上面的xx门,把eflag计算好,是跳还是不跳,然后决定选择哪一个地址,再用PART III里面的指令跳过去


PART V:

所以说要破解vmp要找到关键的jmphandle,确定这个handle是关键跳转,必须利用前面的xx门的计算来确定




资料:

看懂上面的就可以看下面回帖中的高级教程了,虽然离破解有点远,但是离还原有点近


感谢发哥,感谢B哥,感谢ccfer,感谢bughoho,感谢所有观众,纪念刘和珍君

[公告]看雪20周年会 | 感恩有你,一路同行

最新回复 (91)
Bughoho 8 2009-2-23 09:46
9
0
无花风月,我来推波助澜
PART I
vmp里面只有1个逻辑运算指令 not_not_and 设这条指令为P
P(a,b) = ~a & ~b

这条指令的神奇之处就是能模拟 not and or xor 4条常规的逻辑运算指令
怕忘记了,直接给出公式,后面的数字指需要几次P运算

not(a) = P(a,a) 1
and(a,b) = P(P(a,a),P(b,b)) 3
or(a,b) = P(P(a,b),P(a,b)) 2
xor(a,b) = P(P(P(a,a),P(b,b)),P(a,b)) 5

上面的次数应该是最少需要的次数了,当然也可以展开,那样就更加复杂了
vmp用1条指令模拟了4条指令,因此逆向起来比较复杂,如果中间夹杂垃圾运算,那么工程量非同小可
下面来证明一下上面4条等式

not(a) = ~a = ~a & ~a = P(a,a)
and(a,b) = a & b = ~(~a) & ~(~b) = P(not(a),not(b)) = P(P(a,a),P(b,b))
or(a,b) = a | b = ~(~(a|b)) = ~(~a & ~b) = ~P(a,b) = P(P(a,b),P(a,b))
xor(a,b) = ~a & b | a & ~b = ~(~(~a & b | a & ~b)) = ~(~(~a & b) & ~(a & ~b)) = ~((a | ~b) & (~a | b)) = ~(1 | 1 | a & b | ~a & ~b) = ~(a & b) & ~(~a & ~b) = P(and(a,b),P(a,b)) = P(P(P(a,a),P(b,b)),P(a,b))

上面的xor是最复杂的,不过简化后也只需要5次运算就可以实现了

至于eflag,eflag是根据结果来定的,由于都是逻辑运算,所以最后取一下eflag即可

在某修改版的vm中,还可以看到另一个强大的指令 not_not_or 设这条指令为Q
Q(a,b) = ~a | ~b

同样,这一条指令可以模拟4条常规的逻辑运算指令
怕忘记了,直接给出公式,后面数字表示需要几次Q运算

not(a) = Q(a,a) 1
and(a,b) = Q(Q(a,b),Q(a,b)) 2
or(a,b) = Q(Q(a,a),Q(b,b)) 3
xor(a,b) = Q(Q(Q(a,a),b),Q(a,Q(b,b))) 5

基本和上面P指令相同,效率没什么变化
只对最复杂的xor证明一下,以防忘记

xor(a,b) = ~a & b | a & ~b = ~(~(~a & b | a & ~b)) = ~(~(~a & b) & ~(a & ~b)) = ~((~(~a) | ~b) & (~a | ~(~b))) = ~(~(~a) | ~b) | ~(~a | ~(~b)) = Q(Q(not(a),b),Q(a,not(b))) = Q(Q(Q(a,a),b),Q(a,Q(b,b)))

实在太难了,完全搞不定啊
sessiondiy 4 2009-2-23 09:50
12
0
逻辑闸电子学的东西
以前熟到不行, 现在低能到不行.
职业学生肯定懂.
forgot 26 2009-2-23 09:57
14
0
xor用真值表可以直接证明,另外还有一种非常好记的方法

L = ~(A&B) = A和B不都为1的位
R = ~(A|B) = A和B不都为0的位
L & R = A和B不都为1且不都为0的位 = 不同为1相同为0 = XOR

至于~等于或非/NOR自身
sessiondiy 4 2009-2-23 09:59
15
0
PDF 文件:
http://u4.ksu.edu.tw/gallery/458/98_01.pdf

NAND ' NOR 称为万用逻辑闸
因为我们可以单纯使用NAND或NOR来组成基本逻辑闸
因此NAND与NOR可以实现所有的布林函数

上传的附件:
forgot 26 2009-2-23 10:01
16
0
最难的是减法实现对CPAO和ZS整合,太fuck了,期待牛人爆料
Bughoho 8 2009-2-23 10:01
17
0
BINARY GAMES

BINARY GAMES

forgot

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

I. SWAP_XOR(x, y)

x = A
y = B

1) x ^= y

x = A ^ B // NOTE: A != B

2) y ^= x

y = B ^ x = B ^ A ^ B = A

3) x ^= y

x = A ^ B ^ y = A ^ B ^ A = B

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

II. SWAP_ADDSUB(x, y)

x = A
y = B

1) x += y

x = A + B

2) y -= x

y = B - (A + B) = -A

3) x += y // subtration is slower, change y sign next step

x = A + B - A = B

4) y = ~y + 1

y = A

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

III. NEG(x)

We assume x + y = 0

x + y - 1 = -1 = 11111111...111111111b

x = ~(y - 1)

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

IV. XOR(x, y)

x = A
y = B

m = x | y
n = x & y

m - n = x ^ y

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

V. ALIGN(x, k)

k = pow(2, n) = 00...........10000000000000000.........0

We should make a mask to remove last bits of X

V. ALIGN(x, k)

k = pow(2, n) = 00...........10000000000000000.........0

We should make a mask to remove last bits of X

NEG(k) = ~k + 1
e.g. 000010000 -> 111101111 -> 111110000 -> mask

m = x + k - 1 // do nothing if x is aligned
n = ~k + 1

ALIGN(x, k) = m & n
Isaiah 10 2009-2-23 10:06
20
0
CPAOZS?是指标志寄存器吗?
VMP是让真CPU来完成的。

完全模拟标志寄存器得实现半加法器才行
forgot 26 2009-2-23 10:08
22
0
只说对了一半
海风月影 17 2009-2-23 10:09
23
0
减法看这里,不在帖子里面讨论了

http://hi.baidu.com/depteicn/blog/item/52649d332fa06845ad4b5f9b.html
forgot 26 2009-2-23 10:10
25
0
[quote=海风月影;582573]减法看这里,不在帖子里面讨论了

http://hi.baidu.com/depteicn/blog/item/52649d332fa06845ad4b5f9b.html[/quote]
暂无文章。?
天线宝宝 2009-2-23 10:10
26
0
not ((not x) + y) === x-y
海风月影 17 2009-2-23 10:11
27
0
好友才能看,你登陆一下
海风月影 17 2009-2-23 10:12
28
0
减法难在eflag

否则可以 x + ( neg y)
forgot 26 2009-2-23 10:12
29
0
不理解
+的CPAO + ~的ZS 为什么等于 -的CPAZSO
forgot 26 2009-2-23 10:14
33
0
~(~A+B)=~(~A+1-1+B)=~(-A-1+B)=~((B-A)-1)=A-B
海风月影 17 2009-2-23 10:15
35
0
找回密码即可:

http://hi.baidu.com/bughoho
Bughoho 8 2009-2-23 10:19
36
0
xadd(xchg,add)(xor eax,ebx xor ebx,eax)
xchg(xor eax,ebx xor ebx,eax xor eax,ebx)
----
mov(mov eax,ebx = push ebx,pop eax)
movs
movsx
movzx
-----
add
inc(add eax,1)
-----
sub(不能变换为add,因为标志位会不同)
ok dec(sub eax,1)
ok cmp(cmp=sub)
-----
adc
sbb
-----
ok test(test=and)
and
-----
not(neg eax = not eax,add eax,1)
neg
-----
or
xor
mul
div
imul
idiv
----
shl(same)
sal
----
shr(same not)
sar
----
rcl
rcr
-----
rol(和ror不能合用,因为标志位不一致)
ror
bswap(bswap eax = ror ax,8,ror eax,10h,ror ax,8)


好久以前记的流水账,减法一直没想到,等牛人爆料
Bughoho 8 2009-2-23 10:21
37
0
感谢发哥的好片,
天线宝宝 2009-2-23 10:22
38
0
请教怎么证明发哥的片子的eflag等价
forgot 26 2009-2-23 10:23
39
0
看到了,表示失望
Bughoho 8 2009-2-23 10:24
40
0
我无法证明.求证明过程.
forgot 26 2009-2-23 10:26
41
0
这就是我发片的原因
ccfer 13 2009-2-23 10:31
42
0
穷举证明法是最可信的
海风月影 17 2009-2-23 10:32
43
0
忘记感谢ccfer了,我去编辑帖子
Nooby 5 2009-2-23 10:34
44
0
模拟EFL的X86指令模拟
原贴点我
Bughoho 8 2009-2-23 10:34
45
0
结果保留ZST 加上 CPAO,风月还有没有其他办法啊
forgot 26 2009-2-23 10:35
46
0
忘记密码了,直觉觉得此模拟非彼模拟
Nooby 5 2009-2-23 10:36
47
0
适用于穷举证明法。
游客
登录 | 注册 方可回帖
返回