性界大战cocos游戏解密

https://h5.game-app543.com/game/detail/285

尝试使用签名范围搜索密钥

签名 xjdzEncrypt

密钥 xjdzaabbccddeeffgghh

但是xxtea无法解密

这种js引擎的需要使用索引文件但是我没有在res文件夹下找到任何config文件

import os
HEADER = b"xjdzEncrypt"
KEY = b"xjdzaabbccddeeffgghh"
KEY_LEN = len(KEY)
def decrypt_file(file_path):
    try:
        with open(file_path, "rb") as f:
            data = f.read()
        if len(data) < len(HEADER):
            return

        if not data.startswith(HEADER):
            return

        encrypted = data[len(HEADER):]
        decrypted = bytearray(len(encrypted))
        for i in range(len(encrypted)):
            decrypted[i] = encrypted[i] ^ KEY[i % KEY_LEN]
        with open(file_path, "wb") as f:
            f.write(decrypted)

        print(f"[Y] {file_path}")

    except Exception as e:
        print(f"[-N-] {file_path} -> {e}")

def decrypt_directory(root_dir):
    for root, dirs, files in os.walk(root_dir):
        for name in files:
            file_path = os.path.join(root, name)
            decrypt_file(file_path)

decrypt_directory(r'69ba8af2561df4.74886084-spj2-2020318-release-v1.0.0.9\assets\res')

交叉引用一下就能看到其实是异或
我也没找到config文件倒是main.js没加密
包含一段

    // init assets
    cc.AssetLibrary.init({
        libraryPath: 'res/import',
        rawAssetsBase: 'res/raw-',
        rawAssets: settings.rawAssets,
        packedAssets: settings.packedAssets,
        md5AssetsMap: settings.md5AssetsMap,
        subpackages: settings.subpackages
    });

没见过

1 个赞

image

这个解密后是个类似config的映射文件,这个分类的脚本,我自己写的脚本分类有问题。:weary_face:

import json
import os
import re
import shutil

BASE64_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
BASE64_VALUES = [0] * 128
for idx, char in enumerate(BASE64_CHARS):
    BASE64_VALUES[ord(char)] = idx

HEX_CHARS = list('0123456789abcdef')
_t = ['', '', '', '']
UUID_TEMPLATE = _t + _t + ['-'] + _t + ['-'] + _t + ['-'] + _t + ['-'] + _t + _t + _t
INDICES = [i for i, x in enumerate(UUID_TEMPLATE) if x != '-']


def decode_uuid(base64_str):
    result = UUID_TEMPLATE.copy()

    result[0] = base64_str[0]
    result[1] = base64_str[1]

    j = 2
    for i in range(2, 22, 2):
        lhs = BASE64_VALUES[ord(base64_str[i])]
        rhs = BASE64_VALUES[ord(base64_str[i + 1])]

        result[INDICES[j]] = HEX_CHARS[lhs >> 2]
        j += 1
        result[INDICES[j]] = HEX_CHARS[((lhs & 3) << 2) | (rhs >> 4)]
        j += 1
        result[INDICES[j]] = HEX_CHARS[rhs & 0xF]
        j += 1

    return ''.join(result)



text = open(r"decode.js", "r", encoding="utf-8").read()
assets_match = re.search(r'assets:\s*{([\s\S]*?)}\s*,', text)
if not assets_match:
    raise ValueError("未找到 assets 数据")
assets_block = assets_match.group(1)
pattern = re.compile(
    r'["]?([a-zA-Z0-9+/]+)["]?\s*:\s*\[\s*"([^"]+)"'
)
result = {}
for key, path in pattern.findall(assets_block):
    if (path.startswith("r18/")or path.startswith("roleSpine/"))  and re.search(r'\.(json|skel|atlas|png)$', path):
        result[key] = path
Basedir = r"69ba8af2561df4.74886084-spj2-2020318-release-v1.0.0.9\assets\res\raw-assets"
jsondir = r"69ba8af2561df4.74886084-spj2-2020318-release-v1.0.0.9\assets\res\import"
for k, v in result.items():
    decodeu = decode_uuid(k)
    filetype = v.split(".")[-1]
    copypath = os.path.join(r"output", v)
    if filetype != "json":
        filep = os.path.join(Basedir, decodeu[:2], f"{decodeu}.{filetype}")
    else:
        filep = os.path.join(jsondir, decodeu[:2], f"{decodeu}.{filetype}")
    print(f"{k} -> {decodeu} -> {v} -> {filep} -> {copypath}")
    if filetype != "json":
        os.makedirs(os.path.dirname(copypath), exist_ok=True)
        shutil.copy(filep, copypath)
    else:
        with open(filep, 'r', encoding='utf-8') as file:
            tmp = json.load(file)
            _skeletonJson = tmp.get("_skeletonJson", None)
            if _skeletonJson:
                with open(copypath, "w", encoding="utf-8") as f:
                    json.dump(_skeletonJson, f, ensure_ascii=False, indent=2)
1 个赞

大佬们牛逼,解加密来自吾爱,

jsc解加密工具-Orange.zip (1.6 MB)

挖一下,今天心血来潮,尝试提取文件,看见了一个非常符合我喜欢的角色CG,使我想要魔改,去除了背景,把男的删除了,把JJ换成了大茄子。分享一下 :grinning_face: (原来的右膝盖是缺失一部分的,ps技术有限,补全的有瑕疵,将就一下吧,哈哈)

1.zip (4.8 MB)