本文共 1667 字,大约阅读时间需要 5 分钟。
Luajit在游戏中应用广泛,在逆向分析游戏过程中免不了与luajit打交道,那网上有非常多关于luajit反编译的资料,汇总起来常用的两种方案: 和
第一种方案相对来说可读性好但兼容性差经常出现反编译异常崩溃。第二种方案反编译更稳定但可读性稍差。在实践中稳定性是优先考虑的,所以这篇文章将深入分析第二种方案并解决开源代码相关问题。1.下载
源码Decoder.au3编写采用的是basic语言,具体编译环境安装看,花了些时间熟悉了basic语法然后分析源码,其流程见下图:
Test.asm->Out.lua->Out2.lua内容变化见下图:
核心代码逻辑见下图:
问题一:decoder.au3编译报错,作者隐藏了_ArrayAdd函数的自定义实现。
解决:将_ArrayAdd替换为__ARRAYADD,__ARRAYADD定义如下:FUNC __ARRAYADD(BYREF $AVARRAY, $VVALUE) IF NOT ISARRAY($AVARRAY) THEN RETURN SETERROR(0x00000001, 0x00000000, -0x00000001) IF UBOUND($AVARRAY, 0x00000000) <> 0x00000001 THEN RETURN SETERROR(0x00000002, 0x00000000, -0x00000001) LOCAL $IUBOUND = UBOUND($AVARRAY) REDIM $AVARRAY [$IUBOUND + 0x00000001 ] $AVARRAY [$IUBOUND ]= $VVALUE RETURN $IUBOUNDENDFUNC
问题二:实际项目反编译会崩溃,因为lua的定义函数个数超过了定义数组的大小
解决:将$filo数组扩容ElseIf $f = "FNEW" Then If $p1 >= UBound($filo) then ReDim $filo[UBound($filo)+50] EndIf $filo[$p1] = "randomFunction" & $randomFunctionNo If $c = "" Then FileWriteLine($out,"local randomFunction" & $randomFunctionNo & " = function() end -- unknown location") Else FileWriteLine($out,"local randomFunction" & $randomFunctionNo & " = function() end -- starts at " & $c) EndIf $randomFunctionNo = $randomFunctionNo + 1
问题三:可读性差,笔者曾尝试在out2.lua基础上做优化,但发现本质原因是指令翻译这一步本身就有问题,譬如:if repeat until else end 顺序被打乱成 if repeat else until end,Function if end end 残缺为function if end。如果想解决此问题,还是推倒重新实现吧。
转载地址:http://vpfbm.baihongyu.com/