• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
从架构层面杜绝lua中使用未定义的变量发布时间:2022-07-22
下一篇:
lua字符串处理(string库用法)发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap