-
-
LuaJIT ByteCode 初探
-
发表于:
2015-8-1 06:07
19570
-
最近接触到了一个LUA脚本, 但是发现有些许不同, 百度之, 发现是叫做 JIT. 据说,不可还原.
下载一份,回来仔细研究了下代码, 发现挺好玩的.
LuaJIT 自带的,DUMP出来的伪码, 只是一份简单的逆向. 如TABLE,是完全不可见的. 那么,有没有方法可以看到呢? 答案是, 有!
ByteCode 格式
一个文件头, 后面跟着一个又一个的函数体
函数体包含了编译后的伪码,和函数使用的数据.
有意思的地方来了, 每一条伪指令, 均只有4字节.
如 : 37020102
0x37 查表是 TGETS
A,B,C 分别是 2,2,1
其中,1 对应 GC索引中的字符串. (索引建立的时候, 序号采用倒序)
在实际解析中, 发现, LuaJIT 的 ByteCode 是存在还原的可能的, 不过也和IDA 的 F5 类似了.
打算写个解析引擎出来, 尝试还原出可读性更强的工具来. 有没有有兴趣一起的?
资料1: JIT 格式
' /* -- Bytecode dump format ------------------------------------------------ */
' /*
' ** dump = header proto+ 0U
' ** header = ESC 'L' 'J' versionB flagsU [namelenU nameB*]
' ** proto = lengthU pdata
' ** pdata = phead bcinsW* uvdataH* kgc* knum* [debugB*]
' ** phead = flagsB numparamsB framesizeB numuvB numkgcU numknU numbcU
' ** [debuglenU [firstlineU numlineU]]
' ** kgc = kgctypeU { ktab | (loU hiU) | (rloU rhiU iloU ihiU) | strB* }
' ** knum = intU0 | (loU1 hiU)
' ** ktab = narrayU nhashU karray* khash*
' ** karray = ktabk
' ** khash = ktabk ktabk
' ** ktabk = ktabtypeU { intU | (loU hiU) | strB* }
' **
' ** B = 8 bit, H = 16 bit, W = 32 bit, U = ULEB128 of W, U0/U1 = ULEB128 of W+1
资料2: Lua LuaJit 指令表(整理)
http://blog.csdn.net/zzz3265/article/details/41146569
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!