一、腳本加密
如果只是實現加密,這個更簡單了。
在引擎目錄下/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了。
注意:此資源加密好像只適合圖片加密,其他資源加密讀取不到。