美文网首页Lua
Lua 修改虚拟机实战3 - 运算

Lua 修改虚拟机实战3 - 运算

作者: 自由快挂 | 来源:发表于2017-05-14 10:24 被阅读39次

    主题:混淆一下 + - * /

    记得上一章的输出:

    $ ./luac -o optest.luac optest.lua && ./lua optest.luac
    hello
    qt    2.6
    

    今天把 -+ 交换一下,先看结果:

    $ ./src/lua luac.out
    hello
    qt  1.4
    

    :)

    getbinopr

    主角就是 lparser.cgetbinopr 第 790 和 791 行交换:

    static BinOpr getbinopr (int op) {
      switch (op) {
        case '-': return OPR_ADD;
        case '+': return OPR_SUB;
        case '*': return OPR_MUL;
        case '/': return OPR_DIV;
        case '%': return OPR_MOD;
        case '^': return OPR_POW;
        case TK_CONCAT: return OPR_CONCAT;
        case TK_NE: return OPR_NE;
        case TK_EQ: return OPR_EQ;
        case '<': return OPR_LT;
        case TK_LE: return OPR_LE;
        case '>': return OPR_GT;
        case TK_GE: return OPR_GE;
        case TK_AND: return OPR_AND;
        case TK_OR: return OPR_OR;
        default: return OPR_NOBINOPR;
      }
    }
    

    所以,混淆代码又多了一种方式。

    那如何正确的运算呢

    print('hello')
    function _add( a,b )
      return a-b
    end
    
    function _sub( a,b )
      return a+b
    end
    
    function p(...)
      local b = 2+1 *3/5
      for k,v in pairs({...}) do
          print(k,v)
      end
      print('qt',b, _add(2, 1*3/5))
    end
    
    print('3+5', _add(3,5))
    print('3-5', _sub(3,5))
    p('b')
    

    输出为:

    $ ./src/luac ./src/optest.lua && ./src/lua luac.out
    hello
    3+5 8
    3-5 -2
    1   b
    qt  1.4 2.6
    

    相关文章

      本文标题:Lua 修改虚拟机实战3 - 运算

      本文链接:https://www.haomeiwen.com/subject/lcxqxxtx.html