缘由#

想对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. [国嵌攻略][152][I2C总线介绍]

    IIC电气特性 I2C(inter intergrated circuit)总线是由philps公司开发的两线式串行总线,用于连接微控制器及其外围设备. I2C总线只有两根双向信号线: SDA:ser ...

  2. UE4 Xml读写

    UE4自带一个XmlParser,可以很方便的实现Xml的读写. 1,在PublicDependencyModuleNames.AddRange中添加XmlParser. 2,include XmlP ...

  3. JAVA 键盘输入数组,输出数组内容和最大值、最小值

    package shuzu; import java.util.Scanner; import java.util.Arrays; public class shuzu { /** * @param ...

  4. php页面zend加密乱码的解决办法

    http://www.chinaz.com/program/2008/1021/41485.shtml?qq-pf-to=pcqq.group 今天在服务器部署一个php程序是有zend加密的页面出现 ...

  5. nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address 

    http://blog.csdn.net/ownfire/article/details/7966645 今天在做LNMP的时候,启动nginx服务,无法开启,导致网页打不开.把服务从起一下发现提示错 ...

  6. sudo :apt-get:command not found

    在centos下用yum install xxx yum和apt-get的区别 一般来说著名的linux系统基本上分两大类:  1.RedHat系列:Redhat.Centos.Fedora等  2. ...

  7. JAVA WEB之Spring4.x JdbcTemplate

    jdbcTemplate 说白了,他就是Spring提供用于简化数据库访问的类 基本jdbc驱动访问数据库 /* 一个简易好用的数据库连接和访问类 */ package cslg.cn.control ...

  8. VisualSFM+PMVS生成稠密点云

    利用相机拍摄一个场景不同角度的图片,使用VisualSFM能够得到稀疏点云,如果想要得到稠密点云,可以在VisualSFM中加入PMVS的应用程序,PMVS会作为一个插件运行将稀疏点云插成稠密的点云. ...

  9. MySql优化子查询

    用子查询语句来影响子查询中产生结果rows的数量和顺序. For example: SELECT * FROM t1 WHERE t1.column1 IN (SELECT column1 FROM ...

  10. hibernate解读之session--基于最新稳定版5.2.12

    前言 hibernate是一个实现了JPA标准的,用于对象持久化的orm框架.博主近一年开发都在使用. 前段时间在工作中遇到了一个hibernate的问题,从数据库查找得到对象后,修改了其中部分字段值 ...