Lua 修改虚拟机实战3 - 运算
2017-05-14 本文已影响39人
自由快挂
主题:混淆一下 + - * /
记得上一章的输出:
$ ./luac -o optest.luac optest.lua && ./lua optest.luac
hello
qt 2.6
今天把 -
和 +
交换一下,先看结果:
$ ./src/lua luac.out
hello
qt 1.4
:)
getbinopr
主角就是 lparser.c
的 getbinopr
第 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