quick-cocos2d-x 腳本和資源加密

一、腳本加密

如果只是實現加密,這個更簡單了。

在引擎目錄下/quick/bin/下面 compile_scripts.bat  這個東西就是我們需要的。他接受好幾種加密方式,我一般只用到xxtea_zip 和 xxtea_chunk 這兩種。前一種是把lua腳本壓縮成一個zip,爲這個zip加密。後一種是爲每個腳本加密,然後再壓縮一次(包會比前一種大)。其他都差不多。

compile_scripts.bat中帶有不少的參數,詳情如下: 
1、 -h 幫助。顯示參數的解釋及使用,英文的。 
2、-i 源碼目錄 
3、-o 輸出文件或目錄 
4、-p 包前綴 
5、-x 不包含在內的包。如果你有些源文件不想被編譯進去的話,將會用到這個參數,只能設置包(對應文件夾),不能指定到文件多個包的話用,(逗號)隔開。示例:-x app.test,server,指的是app/test/.*,server/.* 這兩個目錄下的所有文件都不會被編譯。
注:經測試,目前這個參數沒有作用,已報告給作者,請等待修復。
 
6、-m 編譯模式。有兩個值  
-m zip 默認,生成的是zip格式文件; 
-m files 生成的是一個個文件,不打包,這個時候-o參數指的就是輸出的目錄。 
7、-e 加密模式。可以對編譯後的文件再進行 XXTEA 加密,有兩個值: 
-e xxtea_zip 對應-m zip,對打包後的zip格式文件進行加密,之後再打包成zip格式。 
-e xxtea_chunk 對編譯後的文件加密,最後打不打包取決於-m。 
注:xxtea_zip一定要與-m zip編譯模式對應,不然會提示出錯 
8、-ek 加密密鑰。對-e有效,且設置了-e之後一定要設置-ek。 
9、-es 加密簽名。對-e有效,默認值爲"XXTEA",這個只是爲了讓引擎知道文件是否被加密過,意義不大,所以可不設置。 
下面是一個編譯及加密的例子:

1 compile_scripts.sh -i scripts -o res/game.zip -e xxtea_zip -ek aaa -es XT

10、-ex 編譯後的文件的後綴名。對-m files有效,默認值爲"lua"。 
11、-c 從一個文件加載參數列表 
12、-q 生成過程不輸出信息 

終端進入 /quick/bin/這個目錄,執行 ./compile_scripts.bat -i 你的腳本的目錄(比如我的/Users/bkbl/Documents/game/src) -o 加密後文件的輸出目錄(比如我的/Users/bkbl/Documents/game/res/game.zip) -e (加密方式 xxtea_chunk 或者 xxtea_zip ) -es 簽名(比如 XXTEA) -ek 密鑰(也就是KEY 比如 adadada) 

只要代碼沒錯誤,這兒也不會報錯。我的輸出路徑是我項目res下。如果不是 拷貝進去。

最後在AppDelegate.ccp 添加

stack->setXXTEAKeyAndSign("你的key", strlen("你的key"), "你的簽名", strlen("你的簽名"));

比如:

1
stack->setXXTEAKeyAndSign("adadada"strlen("adadada"), "XXTEA"strlen("XXTEA"));

讀取這個zip

1
stack->loadChunksFromZIP("res/game.zip");

修改下面

1
engine->executeScriptFile(ConfigParser::getInstance()->getEntryFile().c_str());

的函數爲

1
stack->executeString("require 'main'");

如果你同時做了腳本和資源加密 一定要用一套key和簽名的。切記!


二、資源加密

項目結構如圖 

 

這個功能七月大神在很早之前就已經實現了,但是在3.3有幾個小BUG,可能很多人不知道一直卡住了。我就在這兒從頭到尾的流程都講一次。
道理很簡單 主要就只用到quick-src/extra/approols/下面的HelperFunc這個類
我只做了圖片的加密,plist未做。道理一樣。我就只說圖片的吧。
第一步


    1.  由於cocos現在統一了資源讀取,所以,找到CCImage.ccp這個類,導入HelperFunc頭文件 
#include "extra/apptools/HelperFunc.h"
這個時候重要的來了,xcode報錯。提示HelperFunc.h找不到。我查了半天最後才發現問題所在,原來是searchpath的路徑官方填錯了。按照圖片步驟,添加quick-src的搜索路徑

    
$(SRCROOT)/../../runtime-src/Classes/quick-src 
這個時候,錯誤應該就消失了。


    2.找到 initWithImageFile 這個函數 
    修改  Data data = FileUtils::getInstance()->getDataFromFile(_filePath);
爲    Data data = HelperFunc::getData(_filePath);
這一步就是讀取資源的時候通過七月大神封裝好的類來解密
第二步
這個時候android是編譯不過去的.跟上面一樣提示 找不到HelperFunc
可以通過改mk文件來處理。按照路徑 
     你的項目/frameworks/cocos2d-x/cocos/Android.mk 
打開mk,在如圖的位置添加quick-src的搜索路徑

 
$(LOCAL_PATH)/../../runtime-src/Classes/quick-src/
一定要注意格式哦。上面一行末尾如果沒有 需要添加一個 \     
第三步
接下來就是加密圖片了
        在引擎目錄下/quick/bin/下面 有個pack_files.sh 我們就是用到這個東西來加密了。這個跟lua加密差不多。我簡單說一下流程
1.寫一個配置文件.php的。很簡單。我貼一個
          
 
切記 記好你的key和簽名!!!後面還會用到

我比較懶,沒有新寫一個demo。。用的項目的,所以關鍵部位*****。不過不重要。忘諒解。
2.終端執行 pack_files.sh -c 你的php路徑.php 如果沒有報啥錯,這一步就算完成了。我的輸出路徑填的就是項目res下。如果不是,把加密好的圖片拷貝覆蓋進去就OK。

第四步
最後在AppDelegate.ccp 添加

stack->setXXTEAKeyAndSign("你的key", strlen("你的key"), "你的簽名", strlen("你的簽名"));


不過如果是win32-vs上這個方法就不行了,經過我的測試,已經成功。

首先:把自己工程目錄裏\frameworks\runtime-src\Classes\quick-src\extra\apptools的HelperFunc.cpp和HelperFunc.h文件拷到自己工程目錄\frameworks\cocos2d-x\cocos\platform這裏一份。

其次:在自己工程目錄裏\frameworks\cocos2d-x\cocos\platform找到CCImage.cpp文件,在這裏加載一個頭文件#include "HelperFunc.h"。

然後:找到CCImage.cpp裏的initWithImageFile這個函數,把Data data = FileUtils::getInstance()->getDataFromFile(_filePath);這句修改爲Data data = HelperFunc::getData(_filePath);這個。

最後:把你拷貝的HelperFunc.cpp這個文件,去掉這個#include "CCLuaEngine.h"頭文件,把#include "lua.h"修改爲#include "lua/lua/lua.h",再把這個函數稍微修改一下。

int HelperFunc::getFileData(const char *pPathFile)
{
    unsigned long size;
    unsigned char* buf = HelperFunc::getFileData(pPathFile, "rb", &size);
    
// 	LuaStack* stack = LuaEngine::getInstance()->getLuaStack();
// 	stack->clean();
	if (buf) {
//		stack->pushString((const char*)(buf), (int)size);
		delete buf;
	} else {
//		stack->pushNil();
	}
    return 1;
}
這樣重新編譯一下工程就OK了。


注意:此資源加密好像只適合圖片加密,其他資源加密讀取不到。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章