深入分析luait反编译之luajit-decomp

简介: #背景 Luajit在游戏中应用广泛,在逆向分析游戏过程中免不了与luajit打交道,那网上有非常多关于luajit反编译的资料,汇总起来常用的两种方案:https://github.com/zzwlpx/ljd 和 https://github.com/bobsayshilol/luajit-decomp, 第一种方案相对来说可读性好但兼容性差经常出现反编译异常崩溃。第二种方案反编译

背景

Luajit在游戏中应用广泛,在逆向分析游戏过程中免不了与luajit打交道,那网上有非常多关于luajit反编译的资料,汇总起来常用的两种方案:https://github.com/zzwlpx/ljd
https://github.com/bobsayshilol/luajit-decomp, 第一种方案相对来说可读性好但兼容性差经常出现反编译异常崩溃。第二种方案反编译更稳定但可读性稍差。在实践中稳定性是优先考虑的,所以这篇文章将深入分析第二种方案并解决开源代码相关问题。

使用

1.下载 https://github.com/bobsayshilol/luajit-decomp

  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 $IUBOUND
ENDFUNC

问题二:实际项目反编译会崩溃,因为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。如果想解决此问题,还是推倒重新实现吧。

目录
相关文章
|
存储 移动开发 数据安全/隐私保护
高效反编译luac文件
高效反编译luac文件
|
网络协议 Java 容器
Java实现聊天室
Java实现聊天室
473 0
|
3月前
|
IDE PHP 开发工具
PhpStorm 2025.1安装教程 Windows版:详细步骤+安装路径修改
PhpStorm 2025.1 是专为PHP开发打造的智能IDE,深度支持Laravel、Symfony等主流框架,集成智能补全、重构、远程调试及Composer/PHPUnit工具,安装激活教程详尽易操作。(239字)
|
存储 前端开发 开发工具
利用阿里云OSS(对象存储服务)快速搭建私人网盘
本文介绍了如何使用阿里云OSS搭建个人网盘的详细步骤。首先,注册阿里云账号并开通OSS服务,创建Bucket;接着,配置AccessKey和跨域访问(CORS)规则。然后,选择开源项目(如FileBrowser)或自定义前端,结合OSS SDK实现文件上传下载功能。最后,部署到服务器并绑定域名,确保安全与性能优化,如权限控制、数据备份及CDN加速。
4083 7
|
Java 开发工具 Android开发
OpenCV(一):Android studio jni配置OpenCV(亲测有效,保姆级)
OpenCV(一):Android studio jni配置OpenCV(亲测有效,保姆级)
2829 0
|
安全 Android开发
游戏封包,你会了吗?
游戏封包,你会了吗?
1496 1
游戏封包,你会了吗?
|
负载均衡 安全 Java
微服务 Gateway 使用详解
网关(Gateway)是连接不同网络并进行数据转发的关键组件。在互联网中,路由器常作为默认网关;在现代操作系统中,网关指本地网络上转发数据包的设备。Spring Cloud Gateway是一款基于Spring Framework的API网关,具备反向代理、高性能、负载均衡、安全控制、限流熔断、日志监控等功能。通过简单配置即可实现请求路由和转发,适用于微服务架构中的集中控制、解耦客户端与服务、自动服务发现等场景,提升系统安全性与可扩展性。
2285 4
|
开发工具
java.lang.unsatisfiedlinkerror解决方法
java.lang.unsatisfiedlinkerror解决方法
1711 1
|
Rust Shell 索引
使用阿里云镜像加速Rust与Cargo安装及更新
使用阿里云镜像加速Rust与Cargo安装及更新
14799 2
|
算法 编译器 程序员
深入理解C++编译模式:了解Debug和Release的区别
深入理解C++编译模式:了解Debug和Release的区别
2587 3

热门文章

最新文章