博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入分析luait反编译之luajit-decomp
阅读量:7241 次
发布时间:2019-06-29

本文共 1667 字,大约阅读时间需要 5 分钟。

背景

Luajit在游戏中应用广泛,在逆向分析游戏过程中免不了与luajit打交道,那网上有非常多关于luajit反编译的资料,汇总起来常用的两种方案: 和

第一种方案相对来说可读性好但兼容性差经常出现反编译异常崩溃。第二种方案反编译更稳定但可读性稍差。在实践中稳定性是优先考虑的,所以这篇文章将深入分析第二种方案并解决开源代码相关问题。

使用

1.下载

  1. 确定luajit版本(如何确定不是本文重点),下载对应版本
  2. 编译luajit然后将生成的luajit.exe、lua51.dll和jit文件夹覆盖到lua-decomp
  3. 复制要反编译的文件到luajit-decomp
  4. 将反编译文件重命名为test.lua
  5. 运行decoder_new.exe
  6. 最终生成test.asm out.lua out2.lua,out2.lua就是我们要的文件

源码分析

源码Decoder.au3编写采用的是basic语言,具体编译环境安装看,花了些时间熟悉了basic语法然后分析源码,其流程见下图:

image.png

Test.asm->Out.lua->Out2.lua内容变化见下图:

image.png

核心代码逻辑见下图:

image.png

问题

问题一: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/

你可能感兴趣的文章
lsof -ntP -i:端口取出 动行程序的PID 然后xargs kill -9 这个进程
查看>>
论文笔记之:Conditional Generative Adversarial Nets
查看>>
转】从源代码剖析Mahout推荐引擎
查看>>
SPOJ GSS3 Can you answer these queries III[线段树]
查看>>
Linux软件安装
查看>>
怎么使用jquery判断一个元素是否含有一个指定的类(class)
查看>>
samba 最简单配置 共享
查看>>
看完这篇让你对各种前端build工具不再懵逼!
查看>>
围绕央行系统升级所产生的常见问题
查看>>
Ubuntu 配置有线网 IP
查看>>
SDWebImage源码解读之SDWebImageCache(上)
查看>>
ubuntu中查看各种设备和资源的命令汇总
查看>>
MyBatis学习(二)、SQL语句映射文件(1)resultMap
查看>>
xcache的使用与配置
查看>>
【转】Windows平台下的Subversion安装配置新手指南
查看>>
js-权威指南学习笔记7
查看>>
2017年要学习的三个CSS新特性
查看>>
说说JSON和JSONP,也许你会豁然开朗
查看>>
Docker学习笔记 - Docker的简介
查看>>
不可信的视觉
查看>>