cocos進階教程(3)Lua加密技術


如果開發者不想讓游戲中的資源或腳本文件輕易的暴露給其他人,一般會采用對文件進行加密的方式來保護文件或資源被盜用。Quick-Cocos2d-x 為開發者提供了xxtea加密算法,用來對腳本文件及資源進行加密,加密對象大體分為如下幾種:

1. 對腳本/資源文件本身加密

2. 將腳本/資源文件壓縮成zip,對zip進行加密

3. 對腳本/資源文件加密后,再將其壓縮后的zip再次加密

首先來演示對腳本文件的加密

1. 創建一個新工程,名為quicktest。

通過控制台進入到該工程目錄下,例:

cd /Users/Helloworld/Desktop/quick-cocos2d-x-2.2.5/bin/quicktest

2. 執行 compile_scripts.sh腳本(位於quick-cocos2d-x-2.2.5/bin文件夾下。windows下執行.bat),執行時需要輸入若干個參數,這里簡單介紹一下各個參數的功能(也可以直接查看對應的php腳本文件或輸入-h查看幫助):

  • -h 幫助

  • -i  源文件目錄

  • -o 輸出文件目錄/輸出文件名

  • -p 包前綴名字

  • -x  不包含的包,即當前目錄下的哪些包不希望被添加進去

  • -m 編譯模式,包含兩種,一種是默認的打包成zip,另外一種是不打包直接生成一個個的文件

  • -e 加密模式,包含兩種,xxtea_chunk是對文件本身進行加密,xxtea_zip是對打包后的zip進行加密

  • -ek 加密秘鑰

  • -es 加密簽名

  • -ex 加密文件的后綴名,默認是lua

  • -c 從一個文件加載參數列表

  • -q 生成過程不輸出信息

 

例:

/Users/Helloworld/Desktop/quick-cocos2d-x-2.2.5/bin/compile_scripts.sh -i scripts -o res/game.zip -e xxtea_zip -ek MYKEY -es XT

上面這段代碼的作用,是將 scripts 文件夾中的腳本文件壓縮,並存放到res目錄下,壓縮后的文件名為game.zip,加密方式采用的是對zip壓縮包進行加密,如果采用文本方式加密則-e 后應該寫 xxtea_chunks。秘鑰和簽名將會在代碼中使用。操作完整截圖如下:

下面打開quick-cocos2d-x/bin/quicktest/res ,可以看到里面有兩個壓縮包,其中framework_precompiled.zip是引擎自帶的,而另外一個則是我們剛剛生成的,雙擊game.zip之后你會發現解壓出來的是一個game.zip.cpgz的文件,然后雙擊這個.cpgz的文件之后又會生成game.zip文件,原因是這個zip已經被加密,所以無法識別了。如果這里采用的是腳本加密的方式或不加密的方式則可以正常解壓。

 

之后在引擎中使用加密后的腳本文件時,只需將AppDelegate.cpp中原本執行腳本文件的那段代碼替換為如下代碼:

pStack->setXXTEAKeyAndSign("MYKEY", 5, "XT", 2);
pStack->loadChunksFromZIP("res/game.zip");
pStack->executeString("require 'main'");

其中第一行代碼中的5和2代表的是字符串"MYKEY"和"XT"的字符個數為5和2。

 

腳本加密的方式大體如上文所述,至於資源加密的方法與腳本加密類似,在進入quicktest目錄下之后執行pack_files.sh腳本(win執行pack_files.bat)。輸入-h查看幫助

第一個樣例,是將res中的資源文件進行加密,加密后的文件存放到resnew文件夾中;第二個是講res中的資源打包成zip存放到game.zip,並未加密;第三個是存放到zip中后並對zip進行加密。還有另外一種方式就是兩種方法結合使用,將資源加密后存放到某一文件夾,之后再重新執行一次腳本將這些加密后的文件打包成zip再加密。

之后還需要在AppDelegate.cpp中加一段代碼:

pStack->setXXTEAKeyAndSign("XXTEA", 5,"tsts",4);

如果將資源壓縮成了zip包,還需再加一行代碼:

pStack->loadChunksFromZip("picture.zip");

如此便可以成功運行了,打包時在項目的資源中僅保留.zip即可,原本的資源及腳本直接刪除其引用即可,源文件千萬不要刪掉。

還有一點需要說明的是,該方法並非只能對Quick-x中的資源加密,比如,如果開發者使用的是Cocos2d-x 2.2.5的版本,但是卻希望使用Quick-x中的加密方法對資源及腳本進行加密,這樣也是可以的。加密的步驟與上述相同,但由於Cocos2d-x v2.2.5並沒有相關的解密算法,所以需要修改若干文件方可正常使用,筆者修改后已測試成功,這里簡單描述需要修改的內容。

 

Quick-x 腳本及資源加解密方法修改文件(具體修改的地方對比一下就知道了)

一、資源解密修改

1.修改cocos2dx/platform/ios/CCImage.mm文件

2.增加文件 apptools 到 extensions 文件夾

3.給cocos2dx.xcodeproj添加header search path  : "$(SRCROOT)/../../extensions"

(注:這里筆者將apptools添加到了extensions文件夾只是為了方便,其實添加到其它位置也並非不可以。這里面涉及到了一點問題,因為cocos2dx的庫文件位於cocos2dx.xcodeproj工程中,而lua庫位於另外一個工程,但這一點在quick-x中不一樣,在quick-x中這兩個庫文件都位於同一個工程,所以它們之間引用不存在問題,但是在cocos2d-x 2.2.5中便存在了不同工程間的文件引用問題,所以筆者此處做了2,3步的修改)。

 

二、腳本解密修改

1.修改lua/cocos2dx_support/CCLuaStack.h  .cpp 文件

2.增加 xxtea文件 目錄 cocos2dx/support/xxtea.h  xxtea.c  

3.增加 CCZipFile.h .cpp文件 目錄 cocos2dx/platform/CCZipFile.h  .cpp  

4.修改 unzip.h .cpp文件 目錄cocos2dx/support/zip_support/unzip.h  .cpp 

5.增加 loapi_mem.h .cpp文件 目錄 cocos2dx/support/zip_support/loapi_mem.h .cpp 

 

修改成功后,在Cocos2d-x v2.2.5中也可以使用該加密方法了。


免責聲明!

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



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