gxxxx0888 发表于 2014-7-29 01:53

VMP的认识

理解vmpvmp里面只有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)))实在太难了,完全搞不定啊

kevinjian 发表于 2014-7-29 02:16

这个的话头都要爆!完全没理解哦。头痛中··

SaberMason 发表于 2014-7-29 11:19

表示太复杂了

iamprole 发表于 2014-7-29 11:47

看得我眼都晕了。

798880914 发表于 2014-7-30 13:56

搞vmp壳还不如搞其他壳。。来的实在

永遠 发表于 2014-7-30 21:24

题目打错了 楼主

aishen 发表于 2014-7-30 23:43

好高深的感觉……

鸿运 发表于 2014-7-31 00:24

弱弱的问下,有多少壳是强壳

sndncel 发表于 2014-7-31 13:41

{:301_983:}终于发现,学习逆向工程真的要有耐心呀。。。。。。。。。。
页: [1]
查看完整版本: VMP的认识