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 代碼執行效率[2],所以非常多游戲/框架都采用 LuaJIT 替代官方 Lua 虛擬機,

對應地,開發人員可以使用 luajit 可執行程式將 Lua 源代碼編譯為 luajit 的位元組碼,

luajit 的位元組碼也有相應的反編譯器,比如 ljd [3] [4], luajit-decomp[5],
三. 常見的 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 的密鑰, 之后就可以解密出腳本[6]:
打開 string 視窗,直接搜索 sign,key 就在附近

2. 自定義 Lua 操作碼
有些游戲會自定義 Lua 操作碼,使得常規的 luadec / unluac 無法反編譯位元組碼,某大型回合制游戲就是采用了這種保護方法,它可以提高一些外掛制作門檻,但由于代碼自身保護強度不夠,被輕易還原操作碼,進而被反編譯[1],

四.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 層代碼,看不到沒有任何介面:

4.接入方便
接入時無需更改上層 Lua 腳本代碼,對開發者透明,
5.支持平臺
iOS、Android、PC三平臺全覆寫
6.方案小結
FairGuard 從多個攻擊角度審視 Lua 腳本安全問題,從 Lua 語言多各個層面出發,推出了全新的 Lua 腳本保護方案,該方案能為 Lua 代碼提供高強度的保護,同時支持官方 Lua 與 LuaJIT,支持 Cocos2dx 引擎,支持 uLua / toLua / xLua 等 Unity3d 插件,提供游戲專用的lua加密方案,
FairGuard專注于游戲加固與反外掛,深耕技術,致力于打造業界頂尖的游戲加固產品,公司開發團隊都是來自于網易游戲加固專案的核心人員,創始人專注于安全領域10多年,前網易游戲加固負責人,從0到1主導了網易游戲保護專案,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/193749.html
標籤:java
上一篇:2020ICPC·小米 網路選拔賽第一場 D題 Router Mesh【Tarjan求割點和子樹】
下一篇:使用Three.js實作3D樓盤展示,創建天空之盒實作真實的環境氛圍,在Three.js中添加樹,花等植物。 仿學校3D樓盤模型,結合物聯網實作安全監測
