lua 代码加密方案
生活随笔
收集整理的這篇文章主要介紹了
lua 代码加密方案
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
require 實現
- require函數在實現上是依次調用package.searchers(lua51中是package.loaders)中的載入函數,成功后返回。在loadlib.c文件里有四個載入函數的實現,分別為searcher_preload, searcher_Lua, searcher_C, searcher_Croot。
- searcher_preload是從讀取LUA_REGISTRYINDEX的_PRELOAD字段。已經require過的文件會寫入到該表中
- searcher_Lua是依據文件名稱查找package.path中的全部路徑的lua文件。存在文件則返回
- searcher_C是搜索package.cpath中的全部路徑下的庫文件
- searcher_Croot是對require(“a.b.c”)的情況,讀取a庫。然后查找函數名為lua_a_b_c的lua_CFunction函數
- 如今要實如今require時能讀取加密文件,有兩種辦法,一種是直接改動源碼。即改動第二個載入函數,又一次實現當中讀取文件內容的函數,另外一種辦法是在lua中改動package.searchers表。在載入器的第一和另外一種之間加入一個載入器函數,該載入器模擬searcher_Lua函數。搜索path路徑,然后逐個匹配文件。然后讀取文件內容,解密。然后調用load載入并返回(c中為luaL_loadbufferx),這里在載入時最好傳入文件名稱作為來源參數。方便在調試信息中定位.
- 加密方案可使用相似xxtea輕量級的加密算法
- 在對lua文件進行加密打包時。能夠在文件頭寫入指定的簽名內容。以方便在解密前預先推斷是否為有效的加密文件
改動lua源碼方案
- 在searcher_Lua中終于是調用lua_load(L, getF, &lf, lua_tostring(L, -1), mode)載入源文件,該函數的第二個參數getF是一個lua_Reader函數,所以這里能夠重寫該函數以實現解密,也能夠向外部暴露一個接口用來將自己定義的文件讀取函數作為參數傳給lua_load。以下是原版的getF實現
外部改動載入器方案
- 直接改動package.searchers表,向當中加入載入器,c版實現例如以下
- 載入器函數實現依據傳入的文件名稱。逐個匹配的package.path中的內容,存在文件后,然后讀取文件內容,解密,最后再將解出的內容調用load載入并返回(c中為luaL_loadbufferx),實現能夠參照lua源碼中的searcher_Lua實現
總結
以上是生活随笔為你收集整理的lua 代码加密方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BZOJ 2820 YY的GCD 莫比乌
- 下一篇: home目录迁移至新分区