動態

詳情 返回 返回

遊戲Lua加密方案 - 動態 詳情

Lua以其小巧快速的特點已漸漸成為廣大遊戲開發者必修項,因此Lua的安全問題對於遊戲開發者亦是迫在眉睫。

一. Lua 在手遊中的使用場景

1.Cocos2dx 引擎

在 Cocos2dx 引擎中,可選的腳本語言主要有 Lua 與 Javascript。相對於 Javascript, 因 Lua 更適合製作非 h5 遊戲而被廣泛使用。

2.Unity3d 引擎

Unity3d 引擎的原生腳本語言是 C#, 但由於 iOS 系統安全限制無法熱更新 C#, 從而出現了許多使用 Lua 的熱更新框架,如 toLua / uLua / xLua 等。這些框架將 Unity3d 引擎 API 封裝為 Lua 接口,讓遊戲開發人員擁有使用 Lua 腳本開發遊戲邏輯/界面的能力。需要熱更新時,服務端可以動態下發 Lua 腳本,客户端加載新的 Lua 腳本即可更新遊戲邏輯/界面等。

二. Lua 腳本安全問題

由於 Lua 是一種解釋型語言,所以 Lua 虛擬機可以直接解釋執行 Lua 源代碼,這就導致許多遊戲開發者直接將 Lua 源代碼打進 apk / ipa 中,這相當於直接泄漏了遊戲源代碼,大大降低了外掛製作門檻,更有可能被拿去做換皮膚二次開發。在 Cocos2dx 中,若直接使用 cocos compile 編譯打包(不加 --compile-script 參數),那麼 Lua 腳本就是以源代碼形式打包的。

在實際開發中,開發人員可以選擇使用官方 Luac 或者 LuaJIT 將 Lua 腳本編譯為字節碼,但它們也都面臨相似的安全問題。

1.官方 Lua

開發人員可以使用 Luac 將 Lua 源代碼編譯為 Lua 字節碼。

從上面的字節碼看,已經不包含源代碼,只包含函數名稱及字符串。不過 Lua 字節碼非常容易被 luadec / unluac 等工具反編譯,而且反編譯得到的 Lua 代碼幾乎與源代碼一致。

2.LuaJIT

由於 LuaJIT 在開啓 JIT 的情況下可以數十倍提升 Lua 代碼執行效率,所以非常多遊戲/框架都採用 LuaJIT 替代官方 Lua 虛擬機。

對應地,開發人員可以使用 luajit 可執行程序將 Lua 源代碼編譯為 luajit 的字節碼。

luajit 的字節碼也有相應的反編譯器,比如 ljd , luajit-decomp。

三. 常見的 Lua 保護方案

1.Cocos2dx xxtea 加密

cocos compile 命令提供了 --lua-encrypt 等參數用於加密 Lua 腳本:

lua 相關參數:

*--lua-encrypt 開啓 XXTEA 加密功能。

--lua-encrypt-key LUA_ENCRYPT_KEY 指定 XXTEA 加密功能的 key 字段。

--lua-encrypt-sign LUA_ENCRYPT_SIGN 指定 XXTEA 加密功能的 sign 字段。*

但是這個加密非常容易被破解,如下圖,外掛製作者可以很容易就在 libcocos2dlua.so 中找到 xxtea 的密鑰, 之後就可以解密出腳本。

  1. 自定義 Lua 操作碼

有些遊戲會自定義 Lua 操作碼,使得常規的 luadec / unluac 無法反編譯字節碼。某大型回合制遊戲就是採用了這種保護方法,它可以提高一些外掛製作門檻,但由於代碼自身保護強度不夠,被輕易還原操作碼,進而被反編譯。

四.FairGuard Lua 保護方案

FairGuard 針對 Lua 腳本可能存在的各方面安全問題,在深入理解 Lua 語言特性與虛擬機底層的基礎上,推出全新的 Lua 腳本保護方案,從各個方面確保 Lua 腳本不被分析破解。

1.字節碼文件深度加密

Cocos2dx 使用 xxtea 整體加密腳本文件,這種方式不僅易於被分析出加密密鑰,也容易被 hook luaL_loadbuffer 而得到明文文件。我們採用深度加密的方式,確保 Lua 腳本無法被直接解密,確保無法通過 hook luaL_loadbuffer / lua_reader 等函數截獲明文腳本文件。

正常的字節碼:

我們保護後的字節碼:

2.運行時動態保護

FairGaurd 深入虛擬機引擎,使用壓縮/混淆/動態變形等方式定製了獨有的運行時信息,進一步提高逆向分析難度。

3.Lua 虛擬機代碼保護

配合高強度的 so 加固,使得 Lua 虛擬機代碼不易被逆向分析。正常的 Lua 虛擬機 Native 層代碼,可以看到非常多的 Lua 接口:

我們處理後的 Lua 虛擬機 Native 層代碼,看不到沒有任何接口:

Add a new 評論

Some HTML is okay.