Lua自定义方式加载模块

来源:互联网 发布:帝国cms灵动标签大全 编辑:程序博客网 时间:2024/05/22 10:47

很多人苦于lua脚本被别人破解导致整个游戏被他人抄袭而苦恼,现在来说说最近刚研究通的一种修改办法,可以加载自己加密过的脚本,而且又不会导致普通的lua脚本无法执行,这样既可以运行加密脚本也可以运行普通的脚本,这是多么爽的一件事情。

好了接下来我直接给出我们需要修改的地方;打开文件loadlib.c这个文件我们可以看到有几个函数loader_Lua,loader_C等函数;我们可以仿写一个 ,实现自己读取文件数据的方法;由于一直没有什么深入对lua的实现进行解析,所以我一开始和很多人一样干脆将loadfile函数给修改了,后来发现这种做法是错误的;这样让很多别人实现好的IDE不能使用了,当然这也是一种办法;

我们可以在下面的表中加入自己的代码:

static const lua_CFunction loaders[] =  {loader_preload, loader_Lua, loader_MYLua, loader_C, loader_Croot, NULL};

如果你熟悉源码你一定非常了解这个表中怎么能有loader_MYLua这么山寨的名字,这个名字是我自己实现的;为了不给大家带来心理压力,表示本菜鸟只好给大家演示下我有多么的菜,这样才可以让读本文的小伙伴们感到这家伙也是个坑爹的程序猿类。好了为了偷懒我几乎什么都没有去改变,只是将脚本的后缀改变了下。

下面看看这个山寨的函数是怎么实现的吧:

static int loader_MYLua (lua_State *L) {    const char *filename;    const char *name = luaL_checkstring(L, 1);    filename = findfile(L, name, "MYDatapath");    if (filename == NULL) return 1;  /* library not found in this path */    if (luaL_loadfile(L, filename) != 0)        loaderror(L, filename);    return 1;  /* library loaded successfully */}

当然上面这个函数并不能起到加密的作用;而熟悉lua使用的大神一定知道这不是什么难事,介于读这篇文章的人几乎都会是菜鸟,本菜为了照顾和我一样属于火星来的程序员类,还是决定把这个些需要的函数写下来;这里找到文件后大家需要做的不是直接加载文件,而是一个从文件中读取数据;然后将数据进行解密的一个操作。将解密后的数据调用:

luaL_loadbuffer 或者调用luaL_loadstring

加密函数和这两个函数的用法,由于本菜鸟太懒了决定直接贴出连接地址自己去看吧:

http://www.lua.org/manual/5.1/manual.html#luaL_loadbuffer

好了废话少说,别以为这样你就万事大吉了,细心的小伙伴们会发现这函数中的MYDatapath这个山寨的家伙怎么来的;表示呵呵呵呵;这个啊我们需要在luaopen_package这个函数中加入自己的操作;才可以让lua顺利的加载起我们自己的加密数据。继续简单说一下需要在函数适当的位置加入下面的代码;

setpath(L, "MYDatapath", LUA_MYDATA_PATH, LUA_MYDATA_PATH_DEFAULT);(不用我说,任何菜鸟都知道该加入什么地方。)

#define LUA_MYDATA_PATH_DEFAULT \        ".\\?.MYdata;"  LUA_LDIR"?.MYdata;"  LUA_LDIR"?\\init.MYdata;" \                        LUA_CDIR"?.MYdata;"

好了废话不多说,这个宏定义给出来,添加位置还是说一下好了;这个当然是在luaconf.h 这个文件之中了。坑爹啊,键人你能不能一次性把东西说完,有人开始吐槽了;肯定是有人看到这里以后就开始编译代码了;发现还有个宏没有定义:

#define LUA_MYDATA_PATH "LUA_MYADATA_PATH"

这个宏的位置在loadlib.c 这个的开头加入就好了;一切自己的方式加载自己的加密脚本就这样完成了。不得不说这个lua的作者是位大师级的架构师;能让我这么菜的人轻易的去实现自己想做的事情;整个实现花费大约在两小时之内。



骂人抓狂骂人这是我现在最想做的事情!


2 0
原创粉丝点击