Lua学习(一):luac、luajit编译与反编译

最近开始学习对于lua代码的保护,先对基本的概念加以理解并进行记录;

一、编译lua

1.1 lua源码编译

这些在Linux下的支持比较好,直接make就可以;

第一种:下载mingw

在Windows下面可以通过下载mingw,通过mingw软件,我们可以在windows上模拟出linux的环境;

第二种:通过VS

 

lualib工程:1)添加除了lua.c 和 luac.c 之外的所有“.c”文件。2)在属性中设置头文件的路径,也就是include文件夹的路径。3)在属性中设置“配置类型”->“静态库(.lib)”。工程的编译结果为:lualib.lib。

lua工程:1)添加lua.c。2)在属性中包含include的路径以及lualib.lib的路径。3)在属性的“连接器”->“输入”中写入lualib.lib。4)在“解决方案”的属性中,设置项目项目依赖关系lua依赖于lualib。编译的结果为:lua.exe

luac工程:1)添加luac.c。后面的设置和lua工程相同。编译的结果为:luac.exe

这下就可以对一个lua文件进行编译了:

lua是一个脚本语言,像python一样,这里lua.exe可以对其进行解释执行,同时也可以使用luac.exe对lua进行编译为luac字节码。

接下来实验一下:

 luac.exe -o HelloWorld.out HelloWorld.lua

对luac文件进行简单的分析一下:通过使用非虫大大的bt脚本对lua格式进行了解一下:

虫大这个已经写的很详细了,可以参考了解:https://zhuanlan.zhihu.com/p/30094117

1.2 luaJIT源码编译

在了解luaJIT之前对产生的背景进行简单的了解:由于lua为传统性的解释脚本语言,这个时候最然可以完美的跨不同的平台,但是性能比较差,这个时候JIT出现,动态运行的即时编译,在编译的过程中对于一些热路径进行记录,编译处理为机器码,在Dalvik虚拟机早期的编译中也是这样的,但是要处理好热路径和去寻找过程之间的性能平衡。

可以参考这个帖子https://my.oschina.net/u/2539854/blog/1480238进行初步的了解,后面有机会会详细的介绍这一块,毕竟设计到编译就比较好玩。

这给比较简单,下载 LuaJIT 源码,使用VS中命令行工具,prompt,到对应源码的src目录下进行编译:

luajit.exe -b HelloWorld.lua HelloWorldJit.out

接下来使用luajit对lua进行使用:

通过对于字节码的对比上也可以明显的看出JIT编译出来的字节码比较少,运行起来的性能就比较快。

接下来对于luajit的格式进行分析,详情参考虫大的文章:https://github.com/feicong/lua_re/blob/master/lua/lua_re3.md

二、反编译lua字节码

2.1反编译luac字节码:

目前对于luac的反编译普遍使用的是luadec这个工具:

GitHub:https://github.com/viruscamp/luadec

编译过程为:

git clone https://github.com/viruscamp/luadec cd luadec git submodule update --init lua-5.1 cd lua-5.1 make linux cd ../luadec make LUAVER=5.1

采用不同的版本进行编译。

注意:解决编译错误:“readline/readline.h: No such file or directory”

/usr/bin/ld: cannot find -lncurses

2.2反编译luaJIT字节码:

下载 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就是我们要的文件

对于HelloWorldjit.out 反编译可以看到:

反汇编的结果为:

反编译的结果为:

当然网上也有人说这个工具对于复杂的反编译有问题,可以借助于这个工具:后面破解逆向用到的时候再具体进行阐述。

https://github.com/franko/luajit-lang-toolkit

三、总结

      大致的了解了lua这门语言,以及包括luac、以及luajit等等,了解这些之后对于后面lua语言的保护,以及它的设计原理打下基础,同时后面还会重点的去分析lua虚拟机以及luajit的相关东西。

 

四、参考链接:

https://blog.csdn.net/snlscript/article/details/15533373

https://zhuanlan.zhihu.com/p/30094117

https://my.oschina.net/u/2539854/blog/1480238

https://www.jianshu.com/p/fc4bee82c3ef

https://github.com/feicong/lua_re/blob/master/lua/lua_re3.md

https://github.com/viruscamp/luadec

  • 6
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
luacLua的官方编译器,用于将Lua代码编译成字节码。编译则是将字节码向转换回可读的Lua源代码的过程。以下是luac编译使用的简要教程。 首先,确保您已经安装了Lualuac工具。打开命令行界面,并导航到您的Lua脚本所在的目录。 使用以下命令将Lua脚本编译为字节码文件: ``` luac -o output.luac input.lua ``` 其中,`input.lua`是您要编译Lua源代码文件的路径,`output.luac`是生成的字节码文件路径。执行命令后,将生成一个字节码文件,通常是以`.luac`为扩展名。 接下来,我们可以使用编译器来将字节码文件转换为Lua源码。有许多编译工具可供选择,其中`unluac`是一个受欢迎的选择。 首先,确保您已经安装了Java Runtime Environment(JRE)。然后,下载unluac的jar文件,并在命令行中使用以下命令运行编译器: ``` java -jar unluac.jar input.luac > output.lua ``` 其中,`input.luac`是您要编译的字节码文件的路径,`output.lua`是生成的Lua源代码文件路径。执行命令后,将生成一个可读的Lua源代码文件。 请注意,由于字节码是通过编译器生成的,编译后的源代码可能与原始代码有所不同。一些变量名和注释可能会丢失,但程序逻辑应该保持不变。 总之,使用luac编译器可以让我们查看和理解字节码文件,但请记住,这只是源代码的一个近似还原,不可避免地会有一些信息丢失。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值