缘由#

想对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. STM32小结

    1.GPIO 电灯 推挽输出 PB5 2.GPIO 按键 浮空输入 PA0 3.写IO高电平 HAL_GPIO_WritePin(GPIOB,GPIO_Pin_5,1); 4.读取IO电平 HAL_G ...

  2. 遍历Map集合:java.util.Map.Entry、KeySet两种方式

    遍历Map集合的两种方式: 1.用KeySet Map.keySet(),返回一个存放所有key的set集合,通过遍历集合,根据key值取出所有的value值. Map<String,Strin ...

  3. thinkphp5自动完成

  4. JavaScript实现Tab栏切换

    本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 京东网页上,可以看到下面这种tab栏的切换: 我们把模型抽象出来,实现一 ...

  5. 三续ASM

    在ASM的Core API中使用的是访问者模式来实现对类的操作,主要包含如下类: 一.ClassVisitor接口: 在这个接口中主要提供了和类结构同名的一些方法,这些方法可以对相应的类结构进行操作. ...

  6. Java数据持久层框架 MyBatis之API学习六(Mapper XML 文件详解)

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

  7. 量化投资与Python之pandas

    pandas:数据分析 pandas是一个强大的Python数据分析的工具包.pandas是基于NumPy构建的. pandas的主要功能具备对其功能的数据结构DataFrame.Series集成时间 ...

  8. ASP.NETCore的Kestrel服务器

    什么是Kestrel服务器 Kestrel是开源的(GitHub提供的源代码),事件驱动的异步I / O服务器,用于在任何平台上托管ASP.NET应用程序.这是一个监听服务器和一个命令行界面.您将侦听 ...

  9. 使用 ServiceAnt 更好地解耦你的程序

    今天要厚着脸皮给大家推荐一个自己做的通信中间件--ServiceAnt,目前已经在我们团队的两个产品线上投入了使用. ServiceAnt是什么 它最初的定位是ESB(企业服务总线),但目前还没有达到 ...

  10. JavaScript数组的22种方法

    原文:http://www.cnblogs.com/xiaohuochai/p/5682621.html javascript中数组的22种方法   前面的话 数组总共有22种方法,本文将其分为对象继 ...