Windows下為Lua腳本進行加密處理


緣由#

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

你可以看到,腳本已經被順利執行,並顯示各種結果。😃

總結#

采用LuaJit對Lua腳本進行加密以后,不僅可以保證文件的安全性,而且還能使腳本的運行速度提高10~20倍,是非常不錯的選擇。

題外話#

在編寫測試腳本的時候,總是出現無法找到Lua腳本或者是腳本頭部錯誤的問題。一氣直接就直接新開了一個開發環境,然后逐漸補上腳本。最后發現是因為我在實現中對腳本進行了引用操作,而對於引用的目標腳本沒有進行完全加密,從而導致編譯失敗。所以這里提醒下,如果腳本中有引用其他模塊的方式,該模塊也必須進行同樣的加密操作,並且后綴名最好改成.lua。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM