require 实现

  • require函数在实现上是依次调用package.searchers(lua51中是package.loaders)中的载入函数,成功后返回。在loadlib.c文件里有四个载入函数的实现,分别为searcher_preload, searcher_Lua, searcher_C, searcher_Croot。
  • searcher_preload是从读取LUA_REGISTRYINDEX的_PRELOAD字段。已经require过的文件会写入到该表中
  • searcher_Lua是依据文件名称查找package.path中的全部路径的lua文件。存在文件则返回
  • searcher_C是搜索package.cpath中的全部路径下的库文件
  • searcher_Croot是对require(“a.b.c”)的情况,读取a库。然后查找函数名为lua_a_b_c的lua_CFunction函数
static void findloader (lua_State *L, const char *name) {int i;luaL_Buffer msg;  /* to build error message */luaL_buffinit(L, &msg);lua_getfield(L, lua_upvalueindex(1), "searchers");  /* will be at index 3 */if (!lua_istable(L, 3))luaL_error(L, LUA_QL("package.searchers") " must be a table");/*  iterate over available searchers to find a loader */for (i = 1; ; i++) {lua_rawgeti(L, 3, i);  /* get a searcher */if (lua_isnil(L, -1)) {  /* no more searchers? */lua_pop(L, 1);  /* remove nil */luaL_pushresult(&msg);  /* create error message */luaL_error(L, "module " LUA_QS " not found:%s",name, lua_tostring(L, -1));}lua_pushstring(L, name);lua_call(L, 1, 2);  /* call it */if (lua_isfunction(L, -2))  /* did it find a loader? */return;  /* module loader found */else if (lua_isstring(L, -2)) {  /* searcher returned error message? */lua_pop(L, 1);  /* remove extra return */luaL_addvalue(&msg);  /* concatenate error message */}elselua_pop(L, 2);  /* remove both returns */}
}
  • 如今要实如今require时能读取加密文件,有两种办法,一种是直接改动源码。即改动第二个载入函数,又一次实现当中读取文件内容的函数,另外一种办法是在lua中改动package.searchers表。在载入器的第一和另外一种之间加入一个载入器函数,该载入器模拟searcher_Lua函数。搜索path路径,然后逐个匹配文件。然后读取文件内容,解密。然后调用load载入并返回(c中为luaL_loadbufferx),这里在载入时最好传入文件名称作为来源參数。方便在调试信息中定位.
  • 加密方案可使用相似xxtea轻量级的加密算法
  • 在对lua文件进行加密打包时。能够在文件头写入指定的签名内容。以方便在解密前预先推断是否为有效的加密文件

改动lua源码方案

  • 在searcher_Lua中终于是调用lua_load(L, getF, &lf, lua_tostring(L, -1), mode)载入源文件,该函数的第二个參数getF是一个lua_Reader函数,所以这里能够重写该函数以实现解密,也能够向外部暴露一个接口用来将自己定义的文件读取函数作为參数传给lua_load。以下是原版的getF实现
static const char *getF (lua_State *L, void *ud, size_t *size) {LoadF *lf = (LoadF *)ud;(void)L;  /* not used */if (lf->n > 0) {  /* are there pre-read characters to be read? */*size = lf->n;  /* return them (chars already in buffer) */lf->n = 0;  /* no more pre-read characters */}else {  /* read a block from file *//* 'fread' can return > 0 *and* set the EOF flag. If next call to'getF' called 'fread', it might still wait for user input.The next check avoids this problem. */if (feof(lf->f)) return NULL;*size = fread(lf->buff, 1, sizeof(lf->buff), lf->f);  /* read block */}return lf->buff;
}

外部改动载入器方案

  • 直接改动package.searchers表,向当中加入载入器,c版实现例如以下
void addLuaSearcher(lua_CFunction func)
{if (!func) return;// stack content after the invoking of the function// get loader tablelua_getglobal(m_state, "package");          /* L: package */lua_getfield(m_state, -1, "loaders");       /* L: package, loaders */// insert loader into index 2lua_pushcfunction(m_state, func);           /* L: package, loaders, func */for (int i = lua_objlen(m_state, -2) + 1; i > 2; --i){lua_rawgeti(m_state, -2, i - 1);        /* L: package, loaders, func, function */// we call lua_rawgeti, so the loader table now is at -3lua_rawseti(m_state, -3, i);            /* L: package, loaders, func */}lua_rawseti(m_state, -2, 2);                /* L: package, loaders */// set loaders into packagelua_setfield(m_state, -2, "loaders");       /* L: package */lua_pop(m_state, 1);
}
  • 载入器函数实现依据传入的文件名称。逐个匹配的package.path中的内容,存在文件后,然后读取文件内容,解密,最后再将解出的内容调用load载入并返回(c中为luaL_loadbufferx),实现能够參照lua源码中的searcher_Lua实现

lua 代码加密方案相关推荐

  1. 如何防止你的代码被窃取?Python代码加密方案汇总(带实例验证)

    Python代码加密方案汇总 文章目录 Python代码加密方案汇总 需求描述 基础:Python文件格式 `.py` python源代码 `.pyc` 编译得到的字节码文件 `.pyo` 编译优化后 ...

  2. Python代码加密方案

    Python代码加密方案 方案1:使用Pyarmor工具进行加密 PyArmor 是一个用于加密和保护 Python 脚本的工具.它能够在运行时刻保护 Python脚本的二进制代码不被泄露,设置加密后 ...

  3. lua脚本加密,lua代码加密使用说明

    概述 xLua加密工具主要是一款Lua安全编译器,配置好xLua环境后,用几维提供的libluajit.a替换对应的默认文件,来实现对Lua文件的加密,加密后的Lua文件只能由几维提供的lua byt ...

  4. Lua代码加密,防止代码反编译

    加密目的: 在游戏开发中,脚本作为一种资源文件,就像图片视频一样,被引擎所引用.如果不对脚本进行加密,不怀好意的人轻松解压出脚本文件,给你瞬间复制一个游戏出来.在程序发布前一般会对脚本进行加密,防止代 ...

  5. cocos2d 3.3 lua 代码加密 luac

    1.0 cocos luacompile 用法 我用的普通的cocos2d lua,没用quick,quick好像可以对整个资源包括图像和音频都加密,打包成zip.我看了下luacompile 的 h ...

  6. js压缩代码后怎么生成source map_浅谈前端代码加密

    作者简介:于航,PayPal Senior Software Engineer,在 PayPal 上海负责 Global GRT 平台相关的技术研发工作.曾任职于阿里巴巴.Tapatalk 等企业.f ...

  7. ASP 、PHP 代码加密的安全性逻辑思考

    以古董后台语言 asp 为例,为了保证明文代码不被最终使用者修改或抄袭,有多种方法对代码进行编码,执行时再解码.也可以直接将代码全部编译入 COM+ 组件 ,但是这需要每次都编译,不适合日常使用. 因 ...

  8. cocos lua 加密方案

    cocos2d使用的是luajit,lua原生编译出来的bytecode和luajit是不兼容的,所以直接用luac法编译出来的bytecode脚本无法在cocos2d中使用. 目前所指的解决方案有2 ...

  9. FairGuard游戏Lua加密方案解析

    Lua以其小巧快速的特点已渐渐成为广大游戏开发者必修项,因此Lua的安全问题对于游戏开发者亦是迫在眉睫. 一. Lua 在手游中的使用场景 1.Cocos2dx 引擎 在 Cocos2dx 引擎中,可 ...

最新文章

  1. 拉格朗日乘数法的原理,我用10幅图把它讲清楚了
  2. TensorFlow 深度学习笔记 TensorFlow实现与优化深度神经网络
  3. [十一]基础数据类型之Character
  4. 网站如何才能吸引用户,增加网站点击率?
  5. 迁移后的Net Standard版本的类库测试和多平台项目实测
  6. 自动化运维Shell课堂笔记
  7. (python3.8)pygraphviz的下载安装配置(在python下)最新
  8. docker占满linux磁盘根目录的解决办法
  9. 机房收费系统之导出Excel
  10. html语言中base,HTML base 标签
  11. Python HTTP库:requests快速入门
  12. XmlHttpRequest错误:Access-Control-Allow-Origin不允许使用原点null
  13. 软件、硬件、模拟器,盘点九大机器人开源项目
  14. google地图距离算法,如何计算谷歌地图中两点之间的距离?
  15. 2014年终总结回顾与2015年工作总结
  16. 基于Android 的手机传感器检测
  17. 一款手机看电脑上电影视频的win10应用
  18. 微信聊天记录同步电脑
  19. 画质超高的仙侠java游戏_画质超高的游戏有哪些?顶级画质大型游戏盘点
  20. wlan配置——瘦AP配置【拓扑简单,代码详细,命令解释】

热门文章

  1. 阿里云DDoS基础防护详解防护阈值黑洞时间详细说明
  2. 《中国人工智能学会通讯》——12.58 大数据不确定性学习的研究
  3. 《为iPad而设计:打造畅销App》——想象iPad上的游戏
  4. Mybatis原理分析之一:从JDBC到Mybatis
  5. 读书笔记之快速排序(一)
  6. ubuntu下codeblocks起步
  7. java word表格_java操作word的表格
  8. python下载文件并改名_第46p,8行代码,用Python批量重命名文件
  9. python代码规范链接
  10. C语言入门经典——基础知识(指针 数组 多维数组)