des加密 lua_Windows下为Lua脚本进行加密处理

本文介绍了如何使用LuaJit对Lua脚本进行加密处理,以提高安全性,并通过示例展示了加密过程。同时,作者提到LuaJit不仅能提升脚本的安全性,还能提高运行速度,是 Lua 脚本加密与优化的一个好选择。在实际操作中,需要注意对引用的模块同样进行加密处理。
摘要由CSDN通过智能技术生成

缘由#

想对Lua脚本进行安全性处理,可惜一直没有想到很好的解决方案,考虑过用原生Lua将脚本编译成二进制代码,也考虑过用zlib将文件进行加密压缩处理,但是感觉都不是最佳方案,今天忽然想到有个东西叫LuaJit不错,网上搜索了一把,感觉这东西比上面两种方案来的好,就赶紧下载下来尝试使用了一把。

环境#

Visual Studio 2012

LuaJit2.0.1 我是直接从cocos2d-x2.2.5版本中复制出来的

使用步骤#

1.使用VS的控制台工具,进入到luajit的src目录,执行msvcbuild.bat脚本,编译稍等片刻,会在当前目录下产生lua51.dll lua51.lib luajit.exe几个文件。其中luajit.exe用来对Lua脚本进行加密处理的程序,lua51.dll,lua51.lib跟原先的lua动态库功能一致

2.复制lua51.dll lua51.lib luajit.exe以及lua.h, lauxlib.h, luaconf.h, luajit.h, lualib.h以及jit文件夹的内容到需要使用的文件夹内

3.编写一个测试脚本script.lua

print "hello world"

print (package.path)

function foo()

end;

function callbar()

print "call bar"

for i=0,30000000 do

bar()

end

end

4.利用luajit.exe对script.lua进行加密

luajit -b script.lua script_out.lua

执行成功后,script_out.lua就是加密以后的脚本文件了。

5.新建一个Demo控制台程序,并设置其包含的头文件为lua.hpp,链接库为lua51.lib

#include // 我是用了GetTickCount()函数

#include "lua.hpp"

#pragma comment(lib, "lua51.lib")

6.编写测试用例,具体就直接贴代码了

static int l_bar(lua_State *L) {

return 0;

}

int demo1()

{

int status;

lua_State * L;

L = luaL_newstate();

luaL_openlibs(L);

LuaFunctionTable::registerFunctions(L);

status = luaL_loadfile(L, "script_out.lua");

if (status)

{

printf("could not open lua file : %s\n", lua_tostring(L, -1));

return -1;

}

/* do the file */

printf("run script\n");

int result = lua_pcall(L, 0, 0, 0);

if (result) {

printf("failed to run script : %s\n", lua_tostring(L, -1));

return -1;

}

printf("run foo\n");

DWORD tm1 = GetTickCount();

for (int i = 0; i < 30000000; ++i) {

lua_getglobal(L, "foo");

result = lua_pcall(L, 0, 0, 0);

if (result) {

printf("failed to run script : %s\n", lua_tostring(L, -1));

return -1;

}

}

printf("run time is %d-%d\n",tm1, GetTickCount()-tm1);

/* call from lua by c */

lua_pushcfunction(L, l_bar);

lua_setglobal(L, "bar");

if (status) {

printf("register function failed : %s\n", lua_tostring(L, -1));

return -1;

}

lua_getglobal(L, "callbar");

tm1 = GetTickCount();

status = lua_pcall(L, 0, 0, 0);

if (status) {

printf("callbar failed: %s\n", lua_tostring(L, -1));

return -1;

}

printf("run time is %d-%d\n", tm1, GetTickCount() - tm1);

lua_close(L);

return 0;

}

int _tmain(int argc, _TCHAR* argv[])

{

return demo1();

}

你可以看到,脚本已经被顺利执行,并显示各种结果。😃

总结#

采用LuaJit对Lua脚本进行加密以后,不仅可以保证文件的安全性,而且还能使脚本的运行速度提高10~20倍,是非常不错的选择。

题外话#

在编写测试脚本的时候,总是出现无法找到Lua脚本或者是脚本头部错误的问题。一气直接就直接新开了一个开发环境,然后逐渐补上脚本。最后发现是因为我在实现中对脚本进行了引用操作,而对于引用的目标脚本没有进行完全加密,从而导致编译失败。所以这里提醒下,如果脚本中有引用其他模块的方式,该模块也必须进行同样的加密操作,并且后缀名最好改成.lua。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值