• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Windows下为Lua脚本进行加密处理

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

缘由#

想对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();
}

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap