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

主题:混淆一下 + - * /

记得上一章的输出:

$ ./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 - 运算)