R18圖片解密 已解決

cocos 有缓存,控制台禁用缓存后刷新应该可以抓到,但cg的话就是帧序列

一般来说cocos这种引擎底层的资源处理应该有人写过解析工具,但我没搜到过。自己造的轮子有点问题,但能凑合着用

from concurrent.futures import ThreadPoolExecutor
from cocos2dAsset.downloader import assetDownloader
from cocos2dAsset.parser import ManifestJson
from loguru import logger
from numpy import uint8, frombuffer as npbuff, tile as npfill
import requests
import shutil
import os

# logger.level('ERROR')

def decryptimage(url,path,data):
    if path.endswith(('.png','.jpg')):
        # 楼上的解密代码
        if data.startswith((b'\xFF\xD8\xFF', b'\x89PNG')):
            return
        darr = npbuff(data, dtype=uint8)
        dlen = len(darr)
        basekey = f'{dlen}2fjaykPFd6bAJn59beX5TWDQzsEW'.encode('utf-8')
        keylen = len(basekey)
        klen = 32
        key = bytearray(klen)
        o, t = 0, 0
        for i in range(klen):
            o = key[i] = basekey[t] ^ o
            t = (t + 1) % keylen
        karr = npbuff(key, dtype=uint8)
        decrypted_data = (darr ^ npfill(karr, (dlen // klen) + 1)[:dlen]).tobytes()
        if not decrypted_data.startswith((b'\xFF\xD8\xFF', b'\x89PNG')):
            logger.error(f'failed to decrypt {path}')
            return
        downloader.mkdir(path)
        with open(path, 'wb') as f:
            f.write(decrypted_data)
            return True

config_dict = {
    "downloader_assetroot": "https://cdn-app.miraigirl.net/",
    "downloader_weburl": "",
    "downloader_threadnum": 20,
    "downloader_savepath": "resource/game",
    "asset_baseurl": "https://cdn-app.miraigirl.net/assets"
}

downloader = assetDownloader(config_dict)
settings_jsonUrl = 'https://cdn-app.miraigirl.net/src/settings.ca618.json'
jsdata=  requests.get(settings_jsonUrl).json()
downloader.manifestOfmanifestData['resources'] = jsdata['assets']['bundleVers']['resources']
downloader.jsurl = 'assets/{typename}/index.{version}.js'
downloader.configurl = 'assets/{typename}/config.{version}.json'
downloader.downloadAllManifest()

# 下载全部资源文件
# downloader.downloadAllFromManifest()

# 仅下载HCG
res:ManifestJson  = ManifestJson('resources',downloader.manifestData['resources'])
downloader.downloadCallback = decryptimage
res.mapExt()
downloader.MTdownloadAndSetimport(res,res.getAllpackDownloadUrl())
downloader.MTdownloadAndSetimport(res, res.getAllINDimportDownloadUrl())
res.setRealPaths()
with ThreadPoolExecutor(max_workers=20) as executor:
    for i in res.assetList:
        if i.nativeVersion:
            if i.nativeExt:
                if 'HCG' in i.realPath:
                    executor.submit(downloader.downloadAndSaveBinary,res.convertInfoToUrl('native', i.uuid, i.nativeVersion, i.nativeExt))

# 按path名称复制
dst = 'game_img'
for i in res.assetList:
        if i.nativeVersion and i.nativeExt and i.realPath:
            srcpath = downloader.convertUrltoPath(res.convertInfoToUrl('native', i.uuid, i.nativeVersion, i.nativeExt))
            if os.path.exists(srcpath):
                dstpath = f'{dst}/{i.realPath}{i.nativeExt}'
                downloader.mkdir(dstpath)
                shutil.copy(srcpath,dstpath)
                    
1 个赞