【技术入门】LuaJIT分析技巧

admin 2022年8月28日09:55:10评论77 views字数 3478阅读11分35秒阅读模式

LuaJIT是采用C语言写的Lua代码的解释器,它试图保留Lua的精髓--轻量级、高效和可扩展,但所有的函数缺省会被JIT(即时编译器)编译到本地机器码,以提高执行效率。当前,LuaJIT已经在多个领域广泛应用,特别是在游戏领域,更是在很多地方替代了以前的lua源码或者luac字节码。

虽然LuaJIT在一定程度上带来了效率的提高,但对于逆向工程师来说,其逆向难度也大大增加,暂时还没办法将其转化为可读性强的lua源码。

而对于LuaJIT,我们可以这样分析,首先我们利用IDA的字符串参考可以看到确实使用了LuaJIT(如果程序有加壳,则需要脱壳后再试)。且版本分别为Lua 5.1和LuaJIT 2.1.0-bata3。【技术入门】LuaJIT分析技巧

OD动态加载后,通过识别LuaJIT文件头{0x1b,0x4c,0x4a}提取出该文件。

【技术入门】LuaJIT分析技巧

接下来Google找到luajit-decomp项目源码和LuaJIT 2.1.0-beta3源码,编译LuaJIT,替换luajit-decomp中的对应文件,利用luajit-decomp对提取出的LuaJIT反编译。


【技术入门】LuaJIT分析技巧

得到如下结果。

function randomFunctionby (INPUT_VAR_0_,INPUT_VAR_1_)

var_0_4 = INPUT_VAR_0_

var_0_5 = INPUT_VAR_1_

var_0_6 = INPUT_VAR_1_

string.byte( string.sub(var_0_4, var_0_5, var_0_6) )

end

 

function randomFunctionmain (INPUT_VAR_0_)

var_1_2 = INPUT_VAR_0_

var_1_1 = string.len(var_1_2)

if var_1_1 ~= 0 then

--jump to 0009 (if previous if statement is false) --0009 JMP-JMP

var_1_1 = 0 --var_1_1 NUMBER-NUMBER

return var_1_1

end

var_1_3 = INPUT_VAR_0_

var_1_4 = 1 --var_1_4 NUMBER-NUMBER

var_1_2 = by(var_1_3, var_1_4) key[1]

var_1_3 = 112 --var_1_3 NUMBER-NUMBER  

var_1_1 = bit.bxor(var_1_2, var_1_3)key[1] XOR 112

var_1_4 = INPUT_VAR_0_

var_1_5 = 2 --var_1_5 NUMBER-NUMBER

var_1_3 = by(var_1_4, var_1_5)key[2]

var_1_4 = 101 --var_1_4 NUMBER-NUMBER

var_1_2 = bit.bxor(var_1_3, var_1_4)key[2] XOR 101

var_1_5 = INPUT_VAR_0_

var_1_6 = 3 --var_1_6 NUMBER-NUMBER

var_1_4 = by(var_1_5, var_1_6)key[3]

var_1_5 = 100 --var_1_5 NUMBER-NUMBER

var_1_3 = bit.bxor(var_1_4, var_1_5)key[3] XOR 100

var_1_6 = INPUT_VAR_0_

var_1_7 = 4 --var_1_7 NUMBER-NUMBER

var_1_5 = by(var_1_6, var_1_7)key[4]

var_1_6 = 105 --var_1_6 NUMBER-NUMBER

var_1_4 = bit.bxor(var_1_5, var_1_6)key[4] XOR 105

var_1_7 = INPUT_VAR_0_

var_1_8 = 5 --var_1_8 NUMBER-NUMBER

var_1_6 = by(var_1_7, var_1_8)key[5]

var_1_7 = 121 --var_1_7 NUMBER-NUMBER

var_1_5 = bit.bxor(var_1_6, var_1_7)key[5] XOR 121

var_1_8 = INPUT_VAR_0_

var_1_9 = 6 --var_1_9 NUMBER-NUMBER

var_1_7 = by(var_1_8, var_1_9)key[6]

var_1_8 = 49 --var_1_8 NUMBER-NUMBER

var_1_6 = bit.bxor(var_1_7, var_1_8)key[6] XOR 49

var_1_9 = INPUT_VAR_0_

var_1_10 = 7 --var_1_10 NUMBER-NUMBER

var_1_8 = by(var_1_9, var_1_10)key[7]

var_1_9 = 50 --var_1_9 NUMBER-NUMBER

var_1_7 = bit.bxor(var_1_8, var_1_9)key[7] XOR 50

var_1_10 = INPUT_VAR_0_

var_1_11 = 8 --var_1_11 NUMBER-NUMBER

var_1_9 = by(var_1_10, var_1_11)key[8]

var_1_10 = 51 --var_1_10 NUMBER-NUMBER

var_1_8 = bit.bxor(var_1_9, var_1_10)key[8] XOR 51

var_1_11 = INPUT_VAR_0_

var_1_12 = 9 --var_1_12 NUMBER-NUMBER

var_1_10 = by(var_1_11, var_1_12)key[9]

var_1_11 = 52 --var_1_11 NUMBER-NUMBER

var_1_9 = bit.bxor(var_1_10, var_1_11)key[9] XOR 52

var_1_12 = INPUT_VAR_0_

var_1_13 = 10 --var_1_13 NUMBER-NUMBER

var_1_11 = by(var_1_12, var_1_13)key[10]

var_1_12 = 53 --var_1_12 NUMBER-NUMBER

var_1_10 = bit.bxor(var_1_11, var_1_12)key[10] XOR 53

var_1_13 = INPUT_VAR_0_

var_1_14 = 11 --var_1_14 NUMBER-NUMBER

var_1_12 = by(var_1_13, var_1_14)key[11]

var_1_13 = 54 --var_1_13 NUMBER-NUMBER

var_1_11 = bit.bxor(var_1_12, var_1_13)key[11] XOR 54

var_1_14 = INPUT_VAR_0_

var_1_15 = 12 --var_1_15 NUMBER-NUMBER

var_1_13 = by(var_1_14, var_1_15)key[12]

var_1_14 = 55 --var_1_14 NUMBER-NUMBER

var_1_12 = bit.bxor(var_1_13, var_1_14)key[12] XOR 55

var_1_13 = var_1_1

var_1_14 = var_1_2

var_1_15 = var_1_3

var_1_16 = var_1_4

var_1_17 = var_1_5

var_1_18 = var_1_6

var_1_19 = var_1_7

var_1_20 = var_1_8

var_1_21 = var_1_9

var_1_22 = var_1_10

var_1_23 = var_1_11

var_1_24 = var_1_12

return var_1_13, var_1_14, var_1_15, var_1_16, var_1_17, var_1_18, var_1_19, var_1_20, var_1_21, var_1_22, var_1_23, var_1_24    返回的结果(数组)

end

 

function someFunc2()

require("bit")

local randomFunction0 = function() end -- starts at  test.lua:0

by = randomFunction0

local randomFunction1 = function() end -- starts at  test.lua:0

main = randomFunction1

return

end

虽然反编译的结果和Lua源码有差别,可读性没那么强,但是已经可以知道主要算法流程,下一步分析也将有据可循。




来源:loudy-投稿

*转载请注明来自游戏安全实验室(GSLAB.QQ.COM)【技术入门】LuaJIT分析技巧


原文始发于微信公众号(游戏安全实验室):【技术入门】LuaJIT分析技巧

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年8月28日09:55:10
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【技术入门】LuaJIT分析技巧https://cn-sec.com/archives/1066278.html

发表评论

匿名网友 填写信息