当前位置:   article > 正文

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

luac

最近开始学习对于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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/497121
推荐阅读
相关标签
  

闽ICP备14008679号