Android中IDA分析TexturePacker加密资源寻找加密Key
一、前言
今天我們來看如何破解分析TexturePacker加密資源的加密Key。根據(jù)經(jīng)驗目前常用的方法有以下三種:直接hook uncompress函數(shù),得到資源數(shù)據(jù)內(nèi)容并保存;直接hook setPvrEncryptionKeyPart函數(shù)(不同版本的cocos2dx引擎可能函數(shù)略有不同)打印Key;用IDA調(diào)試并分析so文件來獲取加密Key。前兩種方法hook代碼量比較多,通常要在Android環(huán)境中hook,顯然有些麻煩。第三種方法要求對IDA工具會基本的常用操作,代碼量相比要少。三種方法如果碰到so被加密或加殼了必須解密或脫殼后才能完成。當然不管用什么方法,只要找到適合自己的方法達到目的就可以。
二、案例分析
下面我們就對上面所提到的第三種方法進行調(diào)試分析。首先我們得有個案例程序,根據(jù)需要可自已找個類似的apk或自己寫個demo編譯成apk,這里我們選用類似的apk,這時我們就可以開始調(diào)試分析了。按照慣例:
第一步:解壓apk,看下目錄情況可知無常用加殼保護,得classes.dex文件,利用dex2jar+jd-gui得到java源碼:
?
看到源碼中無明顯加殼特征。得到libcocos2dcpp.so文件,不難看出此so是引擎cocos2dx用C++語言開發(fā)編譯的。用IDA工具打開無任何錯誤提示并且函數(shù)能正常顯示,說明so文件沒被加殼加密。
?
第二步:用apktool或ApkIDE反編譯apk(本案例用ApkIDE),獲取apk資源文件AndroidManifest.xml中信息,重點要看以下三個地方
1、application節(jié)點中android:debuggable="true",如果沒有這句則添加上或者為“false”改為"true"后保存并重新編譯得到前綴為ApkIDE_的apk。
2、manifest節(jié)點中package="com.mtx.thj" 這后面會用到……
3、activity節(jié)點中android:name="org.cocos2dx.cpp.AppActivity" 后面會用到……
第三步:啟動Android模擬器或Android手機,把apk安裝到Android模擬器或Android手機中(此案例為Android手機,數(shù)據(jù)線連接手機)。在cmd窗口輸入如下命令 and install D:\apk\cocos2dx_cpp_1.0.apk 并回車(路徑根據(jù)大家的apk路徑為準)完成安裝。
三、找出資源加密Key。IDA調(diào)試并分析libcocos2dcpp.so文件,找出TexturePacker編輯的資源加密Key。
第一步:在cmd命令行窗口啟動手機中的android_server,本手機為sv文件。
第二步:在上面同一個cmd命令行窗口用debug模式啟動程序并回車
adb shell am start -D -n com.mtx.thj/org.cocos2dx.cpp.AppActivity
這里的包名和入口Activity都可以在上面(2.2中)反編譯之后的AndroidManifest.xml中找到。
啟動程序成功
?
第三步:另啟動個cmd命令行窗口進行端口轉(zhuǎn)發(fā)
adb forward tcp:23946 tcp:23946
第四步:雙開IDA,一個用于靜態(tài)分析libcocos2dcpp.so,一個用于動態(tài)調(diào)試
?
記錄上面兩圖示中setPvrEncryptionKeyPart函數(shù)及setPvrEncryptionKey函數(shù)的相對地址分別為:0067F188和0067F1B4再打開一個IDA,進行attach調(diào)試進程
?
在上面窗口中搜索目標進程包名com.mtx.thj
并按ok按鈕attach調(diào)試進程,完成后F9運行并且設置debugger調(diào)試選項
?
第五步:使用jdb命令attach上調(diào)試器,這里可以用eclipse的devices查看進程端口
?
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8601
并回車
此時第二個IDA會暫停,F9運行幾次后會加載so文件,出現(xiàn)下面窗口一直點Cancel
?
F9運行直到Output window出現(xiàn) loaded /data/app-lib/com.mtx.thj-1/libcocos2dcpp.so,記下libcocos2dcpp.so在內(nèi)存中的絕對地址:75237000
第六步:對setPvrEncryptionKeyPart函數(shù)及setPvrEncryptionKey函數(shù)下斷點
setPvrEncryptionKeyPart函數(shù)的絕對地址=第三步中的相對地址:0067F188+75237000 = 758B6188
在第二個IDA的調(diào)試窗口中按下G鍵輸入758B6188確定就可到setPvrEncryptionKeyPart函數(shù)位置并且下F2斷點
同時F5鍵進入偽代碼窗口在此函數(shù)下F2斷點
同理setPvrEncryptionKey函數(shù)的絕對地址=第三步中的相對地址:0067F1B4+75237000 = 758B61B4
并在IDA的調(diào)試窗口中按下G鍵輸入758B61B4確定就可到setPvrEncryptionKey函數(shù)位置并且下F2斷點(圖略)
同時在此函數(shù)的偽代碼窗口中對setPvrEncryptionKey函數(shù)下F2斷點
第七步:F9運行程序
出現(xiàn)add map窗口一直點Cancel,加載好幾個so文件,直到執(zhí)行到setPvrEncryptionKey函數(shù)斷下
?
斷下時在General registers窗口里的R0R1R2R3分別就是密碼字符串,那么此apk里TexturePacker所加密資源加密Key估計為AAAAAAAABBBBBBBBCCCCCCCCDDEE1988,如果很難看出在setPvrEncryptionKey函數(shù)偽代碼窗口中F9就可以斷下,并將鼠標移動到a1,a2,a3,a4位置可以看到對應的密碼字符串的值
此時再參考下cocos2dx引擎中setPvrEncryptionKeyPart函數(shù)解密調(diào)用Key的情況,可確定AAAAAAAABBBBBBBBCCCCCCCCDDEE1988就是資源的加密Key
第八步:驗證密碼正確性
用TexturePacker的Tools -> PVR Viewer打開之前解壓的apk目錄下assets目錄中任一個.pvr.ccz后綴文件
注意:
.pvr.ccz的16進制數(shù)據(jù)中頭4字節(jié)為 43 43 5A 70 ,才是加過密的.pvr.ccz資源文件
在TexturePacker工具如果輸入過一次Key后,打開加過密的.pvr.ccz資源文件可直接打開
?
四、小結(jié)
1、對于cocos2dx資源加密用這種加密方式加密安全等級非常低,不建議使用。當然加密后也算是對游戲資源的一層防護……
2、對于用TexturePacker工具加密的資源要找密碼Key用IDA調(diào)試時對函數(shù)setPvrEncryptionKey下斷點很容易找到Key;
3、對于單個資源文件直接用TexturePacker工具打開后保存,如果要批量解密資源要在win平臺下編寫工具。
總結(jié)
以上是生活随笔為你收集整理的Android中IDA分析TexturePacker加密资源寻找加密Key的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TexturePacker 命令行方式调
- 下一篇: android sdk如何瘦身,给And