1. 程式人生 > >破解TexturePacker加密資源,尋找解密Key之旅

破解TexturePacker加密資源,尋找解密Key之旅

破解TexturePacker加密資源的方式有好多種。。最多的是hook uncompress然後獲取到內容,加入ccz的檔案頭寫入檔案。
例如:

void ZipUtils::ccSetPvrEncryptionKeyPart(int index, unsigned int value)// 設定金鑰的介面

上appstore上隨便找個cocos2d的遊戲,拖入Hopper,搜尋ccSetPvrEncryptionKeyPart,沒有找到。然後搜尋ZipUtils,如下圖:

這裡寫圖片描述
ccDecodeEncodedPvr用來解密pvr.ccz檔案,沒有找到ccSetPvrEncryptionKeyPart,那麼我們在ccDecodeEncodedPvr上下程式碼塊裡面試試運氣

這裡寫圖片描述

int sub_444200(int arg0, int arg1) {
    r1 = arg1;
    r0 = arg0;
    r3 = *(0x7d79d0 + r0 * 0x4);
    asm{ it         eq };
    if (r3 == r1) {
            return r0;
    }
    *(0x7d79d0 + r0 * 0x4) = r1;
    *(int8_t *)0x7d89e0 = 0x0;
    return 0x0;
}

這個有點像。。猜測arg0為index arg1為value
寫tweak驗證:

int(*orgccSetPvrEncryptionKey)(int
index,unsigned int key); int myccSetPvrEncryptionKey(int index,unsigned int key); int myccSetPvrEncryptionKey(int index,unsigned int key2key{ NSLog(@"\n\n===== keys: %d-%u ======\n\n",index,key); orgccSetPvrEncryptionKey(key1,key2); } %ctor{ NSLog(@"====== HOOKED ======"); intptr_t module_vmaddr = _dyld_get_image_vmaddr_slide(0
); intptr_t ccSetPvrEncryptionKey = module_vmaddr + 0x444200 + 1; MSHookFunction((void *)ccSetPvrEncryptionKey, (void*)myccSetPvrEncryptionKey, (void**)&orgccSetPvrEncryptionKey); }

測試log

Jun  1 11:57:43 crean XXX[73393]:

    =====  keys: 0-405172683    ======
Jun  1 11:57:43 crean XXX[73393]:

    =====  keys: 1-1270815801    ======
Jun  1 11:57:43 crean XXX[73393]:

    =====  keys: 2-3663874658    ======
Jun  1 11:57:43 crean XXX[73393]:

    =====  keys: 3-2333226975    ======
將這4個Key轉為16進製為
182671CB4BBF1C39DA624A628B1237DF

用TexturePacker開啟加密的pvr.ccz的檔案,它會提示你輸入128位加密的KEY,輸入直接解密驗證:

這裡寫圖片描述

我想,看了這篇教程學到的不緊緊是破解TexturePacker加密資源哦。。自己動手驗證試試。。只隨機了一個遊戲測試。。有興趣的朋友可以找個遊戲驗證驗證是否通用。。