zoukankan      html  css  js  c++  java
  • 理解vmp

    原文作者: 海风月影_百度空间

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

    实在太难了,完全搞不定啊

  • 相关阅读:
    数据库设计规则
    了解何时使用 Override 和 New 关键字(C# 编程指南)
    Why we use stored procedure than Sql statement?
    HTML条件注释和javascript条件注释
    <%# %> 和 <% %> 有什么区别?
    short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
    如何实现 Visual Studio 2005 中远程调试
    认识延迟时间为0的setTimeout(转)
    Web应用程序中(VS2005+SP1)添加App_Code
    AWStats 一个不错的Web/Mail/FTP日志分析工具
  • 原文地址:https://www.cnblogs.com/huhu0013/p/4835378.html
Copyright © 2011-2022 走看看