Cocos2d-x-lua工程的lua脚本加密

Cocos2d-x-lua工程的lua脚本加密,第1张

概述前言部分 1、本文是以cocos2d-x-lua项目为例说明的。 2、我这里只说下我自己遇到的问题和解决方法,当大家也遇到时可以参考下。 3、我所使用的cocos2d-x版本是cocos2d-2.1rc0-x-2.1.3,这个版本使用的是luajit,而不是源生的lua,luajit有很多好处。 ---------------------------------------------------

前言部分

1、本文是以cocos2d-x-lua项目为例说明的。

2、我这里只说下我自己遇到的问题和解决方法,当大家也遇到时可以参考下。

3、我所使用的cocos2d-x版本是cocos2d-2.1rc0-x-2.1.3,这个版本使用的是luajit,而不是源生的lua,luajit有很多好处。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

方法一:

这种其实并不是真正意义上的加密,而是用luajit把lua脚本编译成字节码(我之前实验过用luac编译出的字节码不能被luajit执行)。

1)编译luajit,这里并不是编译luajit的库,而是编译luajit的控制台程序,用作后面把lua脚本代码文件编译成字节码用。

  cd到 coco2dx安装目录/scripting/lua/luajit/LuaJIT-2.0.1

2) 输入make(如果控台显示command not found,那就要先安装make,Mac作为UNIX系却没有提供make,需要打开xCode->xCode(菜单栏)->Open Developer Tool->More Developer Tools->注册/登陆AppID->选择你对应的Command line Tool->下载安装)

  这时会在src文件夹下生成可执行文件luajit(这b玩意我找了好久,根本找不到在哪生成的)

  注意:前面那个步骤你也可以输入sudo make install,这是先编译luajit,然后安装luajit环境,这样你在控台直接敲luajit就能用。

3) 有了luajit这个可执行文件,我们就可以拿它编译lua脚本了。

  这时cd进src目录

  输入./luajit -b hello1.lua hello1.out

  这个hello1.lua应该是你要编译的源文件,必要时请带上路径。

  注意:你不能把luajit这个可执行文件单独拿出来到别处去运行,因为在src里有些它需要依赖的东西,如果你想把luajit移地方,那你把(当前已经在src文件夹了)luajit、jit文件夹、好几个.dasc文件打个包,这样你就可以到其他的地方运行luajit了。

4)把这个hello1.out加到你工程里,就可以直接当成普通的脚本一样运行。

【严重注意】:如果你hello1.lua里面写了require "hello2"那你最好把hello2.lua的生成的文件也命名成hello2.lua,否则再执行hello1.lua的时候就找不到依赖的hello2.lua。当然你也可以require的文件写带后缀名的文件,但这我没有试验过行不行。

方法二:

方法二的前提是你不用luajit,而使用lua。

这样这种方法是真正加密,原理是我们自己替换掉lua的的loader函数。

其实这种方法是因为我之前以为coco2dx用的lua,我在调试lua代码的时候发现的,当然也受到别的大神的启发。

先贴出一段代码

LUAliB_API int luaL_loadfile (lua_State *L,const char *filename) {  LoadF lf;  int status,readstatus;  int c;  int fnameindex = lua_gettop(L) + 1;  /* index of filename on the stack */  lf.extraline = 0;  if (filename == NulL) {    lua_pushliteral(L,"=stdin");    lf.f = stdin;  }  else {    lua_pushfstring(L,"@%s",filename);    lf.f = fopen(filename,"r");    if (lf.f == NulL) return errfile(L,"open",fnameindex);  }  c = getc(lf.f);  if (c == '#') {  /* Unix exec. file? */    lf.extraline = 1;    while ((c = getc(lf.f)) != EOF && c != '\n') ;  /* skip first line */    if (c == '\n') c = getc(lf.f);  }  if (c == LUA_SIGNATURE[0] && filename) {  /* binary file? */    lf.f = freopen(filename,"rb",lf.f);  /* reopen in binary mode */    if (lf.f == NulL) return errfile(L,"reopen",fnameindex);    /* skip eventual `#!...' */   while ((c = getc(lf.f)) != EOF && c != LUA_SIGNATURE[0]) ;    lf.extraline = 0;  }  ungetc(c,lf.f);  status = lua_load(L,getF,&lf,lua_tostring(L,-1));  readstatus = ferror(lf.f);  if (filename) fclose(lf.f);  /* close file (even in case of errors) */  if (readstatus) {    lua_settop(L,fnameindex);  /* ignore results from `lua_load' */    return errfile(L,"read",fnameindex);  }  lua_remove(L,fnameindex);  return status;}
每当要加载新的lua文件时都会调用luaL_loadfile,当走到status =lua_load(L,getF,lua_tostring(L,-1))时就说明要从文件读取内容了,注意这里穿了一个参数getF,它其实是个函数指针,我们把这个贴出来。

static const char *getF (lua_State *L,voID *ud,size_t *size) {  LoadF *lf = (LoadF *)ud;  (voID)L;  if (lf->extraline) {    lf->extraline = 0;    *size = 1;    return "\n";  }  if (feof(lf->f)) return NulL;  *size = fread(lf->buff,1,sizeof(lf->buff),lf->f);  return (*size > 0) ? lf->buff : NulL;}
这个函数走完了,lf->buff就有了脚本文件的内容,说道这俩大家就明白了把,我们可以在弄个decodeGetF,在上面传函数指针参数的时候传我们新改的decodeGetF,比方:

static const char *decodeGetF (lua_State *L,size_t *size) {  LoadF *lf = (LoadF *)ud;  (voID)L;  if (lf->extraline) {    lf->extraline = 0;    *size = 1;    return "\n";  }  if (feof(lf->f))return NulL;  *size = fread(lf->buff,lf->f);  //咱们来瞎搞一搞  for(int i=0; i<sizeof(lf->buff); i++)  {    lf->buff[i] ^= 250;//简单的亦或解密,怎么加密你应该清楚了  }  return (*size > 0) ? lf->buff : NulL;}

 这种方法我没有实验,理论上是可行的。怎么加密在你,我这只是说了个简单的异或加密解密,我认为我已经说清楚了,有啥疑问eMail我吧,blue-1986@hotmail.com

 如有错误请指正,大家一起进步。

总结

以上是内存溢出为你收集整理的Cocos2d-x-lua工程的lua脚本加密全部内容,希望文章能够帮你解决Cocos2d-x-lua工程的lua脚本加密所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1055567.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存