缘由#

想对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 <windows.h>    // 我是用了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();
}

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

Windows下为Lua脚本进行加密处理的更多相关文章

  1. 在windows下编写shell脚本

    注意两点: 1.第一行:#!/bin/bash 2.将文档格式转换为unix,因为在windows下编写shell脚本回车符是\n\r,而linux下的回车符是\n,所以在linux下运行脚本的时候, ...

  2. 【Linux】windows下编写的脚本文件,放到Linux中无法识别格式

    注意:我启动的时候遇到脚本错误 » sh startup.sh -m standalone tanghuang@bogon : command not found : command not foun ...

  3. 在windows下编辑shell脚本注意点

    编辑脚本是直接在windows下写的,并没有使用特定的编辑器或者其他工具,所以很有可能出现一些莫名其妙的异常,这些错误是我们眼睛看不到的,遇到这个情况,例如如下异常或者提示语法错误  Java代码  ...

  4. Learning Lua Programming (3) iMac下搭建Lua脚本最好的编码环境(代码补全,编译运行)

    这篇文章参考自http://blog.sina.com.cn/s/blog_991afe570101rdgf.html,十分感谢原作者的伟大创造,本人亲测可行. 这篇文章记录一下如何在MAC系统环境下 ...

  5. sublime text 2中Windows下编写的脚本在Linux平台上运行遇到字符问题

    今天在windows下的sublime text 2下写了个脚本,上传到ubuntu服务器中执行后提示: -bash: /usr/bin/python: /usr/bin/python^M: bad ...

  6. windows下编写shell脚本执行错误

    在 windows 下,换行符是 \r\n,在linux下,换行符是 \n.如果你在IDEA里写sh脚本,可以手动设置脚本的换行符为 \n,如果你用notepad++写脚本,可以显示所有字符,以便明确 ...

  7. <转>windows下编译lua源码

    因为之前一直使用 lua for windows 来搭建lua的使用环境,但是最新的 lua for windows 还没有lua5.2,我又想用这个版本的lua,所以被逼无奈只能自己编一下lua源码 ...

  8. windows下写的脚本,在linux下执行失败

    Windows中的换行符为CRLF, 即正则表达式的rn(ASCII码为13和10), 而Unix(或Linux)换行符为LF, 即正则表达式的n. 在Windows和Linux下协同工作的时候, 往 ...

  9. windows下通过批处理脚本启动redis

    三种启动方式的特点: 第一种方式 :根目录之命令窗口启动 特点:每次启动都要进入到redis的根目录,比较繁琐,并且占用一个窗口 第二种方式:bat脚本便捷启动 特点:可放在桌面便捷启动,占用窗口 第 ...

随机推荐

  1. 三 : spring-uploadify上传文件

    一 : applicationContext.xml中:必须声明不然获取不到<!-- 上传文件的配置 --> <bean id="multipartResolver&quo ...

  2. 初窥React Native

    这两天在学习react native,被虐得布耀布耀的,运行一个hello world花了一天时间(手动捂脸). 由于是跟着官网走,所以一开始便是开发环境的搭建.其他的就不说了(详情见 React N ...

  3. 从零开始学习前端JAVASCRIPT — 6、JavaScript基础DOM

    1:DOM(Document  Object  Model)的概念和作用 document对象是DOM核心对象:对html中的内容,属性,样式进行操作. 节点树中节点之间的关系:父子,兄弟. 2:DO ...

  4. 关于OELD屏显示电池电量的简易方法

    如何采集电源电压大家可能都熟悉,stm32的ADC+DMA能很方便迅速的帮我们采集到自己想要的电压数据.使用DMA进行数据搬运也能很好的减轻CPU的一部分压力.但是这样只是第一步--数据. 用户想看到 ...

  5. HTTP 405 错误 – 方法不被允许 (Method not allowed)【转载】

    介绍 HTTP 协议定义一些方法,以指明为获取客户端(如您的浏览器或我们的 CheckUpDown 机器人)所指定的具体网址资源而需要在 Web 服务器上执行的动作.则这些方法如下: OPTIONS( ...

  6. dedecms_

    2012-7-5(no1)当我们点击检索结果的某个电影超链接时,如何跳转到对应的内容页[本资源由www.qinglongweb.com搜集整理] dedelist标签 --可以嵌套 项目移植: mys ...

  7. 机器学习——kNN(2)示例:改进约会网站的配对效果

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...

  8. 《并行程序设计导论》——MPI(Microsoft MPI)(6):并行排序算法

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...

  9. ADO.NET复习总结(6)-断开式数据操作

    一.基础知识 主要类及成员(和数据库无关的)(1)类DataSet:数据集,对应着库,属性Tables表示所有的表(2)类DataTable:数据表,对应着表,属性Rows表示所有的行(3)类Data ...

  10. libJPEG-turbo库使用示例代码

    libJPEG库是用于编码数据为JPEG格式或者解码JPEG格式图片的常用库,OpenCV读取图像底层实现就是利用libJPEG库,而libJPEG-turbo则效率更高. 具体怎么编译编译libJP ...