首页
社区
课程
招聘
[原创]破解vmp程序的关键点
2009-2-23 09:23 101014

[原创]破解vmp程序的关键点

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

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,感谢所有观众,纪念刘和珍君

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞7
打赏
分享
最新回复 (91)
雪    币: 1946
活跃值: (238)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
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)))

实在太难了,完全搞不定啊
雪    币: 2071
活跃值: (77)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
sessiondiy 4 2009-2-23 09:50
12
0
逻辑闸电子学的东西
以前熟到不行, 现在低能到不行.
职业学生肯定懂.
雪    币: 6073
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
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自身
雪    币: 2071
活跃值: (77)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
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可以实现所有的布林函数

上传的附件:
雪    币: 6073
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
forgot 26 2009-2-23 10:01
16
0
最难的是减法实现对CPAO和ZS整合,太fuck了,期待牛人爆料
雪    币: 1946
活跃值: (238)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
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
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
Isaiah 10 2009-2-23 10:06
20
0
CPAOZS?是指标志寄存器吗?
VMP是让真CPU来完成的。

完全模拟标志寄存器得实现半加法器才行
雪    币: 6073
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
forgot 26 2009-2-23 10:08
22
0
只说对了一半
雪    币: 7300
活跃值: (3758)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
海风月影 22 2009-2-23 10:09
23
0
减法看这里,不在帖子里面讨论了

http://hi.baidu.com/depteicn/blog/item/52649d332fa06845ad4b5f9b.html
雪    币: 6073
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
forgot 26 2009-2-23 10:10
25
0
[quote=海风月影;582573]减法看这里,不在帖子里面讨论了

http://hi.baidu.com/depteicn/blog/item/52649d332fa06845ad4b5f9b.html[/quote]
暂无文章。?
游客
登录 | 注册 方可回帖
返回