Lua程序逆向之Luac文件格式分析
作者:非蟲
預估稿費:600RMB
投稿方式:發送郵件至linwei#http://360.cn,或登陸網頁版在線投稿
簡介
Lua語言對於遊戲開發與相關逆向分析的人來說並不陌生。Lua語言憑藉其高效、簡潔與跨平台等多種特性,一直穩立於遊戲、移動APP等特定的開發領域中。
目前Lua主要有5.1、5.2、5.3共三個版本。5.1版本的Lua之所以目前仍然被廣泛使用的原因之一,是由於另一個流行的項目LuaJit採用了該版本Lua的內核。單純使用Lua來實現的項目中,5.2與5.3版本的Lua則更加流行。這裡主要以Lua版本5.2為例,通過分析它生成的Luac位元組碼文件,完成Lua程序的初步分析,為以後更深入的反彙編、位元組碼置換與重組等技能打下基礎。
Lua與Luac
Lua與Python一樣,可以被定義為腳本型的語言,與Python生成pyc位元組碼一樣,Lua程序也有自己的位元組碼格式luac。Lua程序在載入到內存中後,Lua虛擬機環境會將其編譯為Luac(下面文中Luac與luac含義相同)位元組碼,因此,載入本地的Luac位元組碼與Lua源程序一樣,在內存中都是編譯好的二進位結構。
為了探究Luac的內幕,我們需要找到合適的資料與工具來輔助分析Luac文件。最好的資料莫過於Lua的源碼,它包含了Lua相關知識的方方面面,閱讀並理解Luac的構造與Lua虛擬機載入位元組碼的過程,便可以通透的了解Luac的格式。但這裡並不打算這麼做,而採取閱讀第三方Lua反編譯工具的代碼。主要原因是:這類工具的代碼往往更具有針對性,代碼量也會少很多,分析與還原理解Luac位元組碼文件格式可以省掉不少的時間與精力。
luadec與unlua是最流行的Luac反彙編與反編譯工具,前者使用C++語言開發,後者使用Java語言,這兩個工具都能很好的還原與解釋Luac文件,但考慮到Lua本身採用C語言開發,並且接下來打算編寫010 Editor編輯器的Luac.bt文件格式模板,010 Editor的模板語法類似於C語言,為了在編碼時更加順利,這裡分析時主要針對luadec。
Luac文件格式
一個Luac文件包含兩部分:文件頭與函數體。文件頭格式定義如下:
typedef struct {char signature[4]; //".lua"uchar version;uchar format;uchar endian;uchar size_int;uchar size_size_t;uchar size_Instruction;uchar size_lua_Number;uchar lua_num_valid;uchar luac_tail[0x6];} GlobalHeader;
第一個欄位signature在lua.h頭文件中有定義,它是LUA_SIGNATURE,取值為「 33Lua",其中,