深入分析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 Linux
luajit简介
luajit简介
415 2
|
数据采集 机器学习/深度学习 数据格式
在使用 Core ML 时,有哪些注意事项?
在使用 Core ML 时,有哪些注意事项?
243 1
|
Java TensorFlow 算法框架/工具
Android 中集成 TensorFlow Lite图片识别
Android 中集成 TensorFlow Lite图片识别
223 0
|
3月前
|
安全 Java 编译器
JD-GUI,java反编译工具及原理: JavaDecompiler一个Java反编译器
Java Decompiler (JD-GUI) 是一款由 Pavel Kouznetsov 开发的图形化 Java 反编译工具,支持 Windows、Linux 和 Mac Os。它能将 `.class` 文件反编译为 Java 源代码,支持多文件标签浏览、高亮显示,并兼容 Java 5 及以上版本。JD-GUI 支持对整个 Jar 文件进行反编译,可跳转源码,适用于多种 JDK 和编译器。其原理基于将字节码转换为抽象语法树 (AST),再通过反编译生成代码。尽管程序可能带来安全风险,但可通过代码混淆降低可读性。最新版修复了多项识别错误并优化了内存管理。
1835 1
|
11月前
|
机器学习/深度学习 前端开发 JavaScript
WebAssembly:让前端性能突破极限的秘密武器
WebAssembly(简称 WASM)作为前端开发的性能加速器,能够让代码像 C++ 一样在浏览器中高速运行,突破了 JavaScript 的性能瓶颈。本文详细介绍了 WebAssembly 的概念、工作原理以及其在前端性能提升中的关键作用。通过与 JavaScript 的配合,WASM 让复杂运算如图像处理、3D 渲染、机器学习等在浏览器中流畅运行。文章还探讨了如何逐步集成 WASM,展示其在网页游戏、高计算任务中的实际应用。WebAssembly 为前端开发者提供了新的可能性,是提升网页性能、优化用户体验的关键工具。
5146 2
WebAssembly:让前端性能突破极限的秘密武器
|
JavaScript
cnpm 的安装与使用
本文介绍了npm和cnpm的概念、安装nodejs的步骤,以及cnpm的安装和使用方法,提供了通过配置npm使用中国镜像源来加速包下载的替代方案,并说明了如何恢复npm默认仓库地址。
cnpm 的安装与使用
|
安全 网络协议 前端开发
Windows下nmap命令及Zenmap工具的使用方法
【7月更文挑战第28天】zenmap是一个开放源代码的网络探测和安全审核的工具,它是nmap安全扫描工具的图形界面前端,它可以支持跨平台。使用zenmap工具可以快速地扫描大型网络或单个主机的信息。如扫描主机提供了哪些服务,使用的操作系统等。
1371 8
|
存储 关系型数据库 MySQL
阿里巴巴MYSQL 开发规范
阿里巴巴MYSQL 开发规范
1399 0