https://h5.game-app543.com/game/detail/285
尝试使用签名范围搜索密钥
签名 xjdzEncrypt
密钥 xjdzaabbccddeeffgghh
但是xxtea无法解密
这种js引擎的需要使用索引文件但是我没有在res文件夹下找到任何config文件
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
});
没见过
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)
大佬们牛逼,解加密来自吾爱,
jsc解加密工具-Orange.zip (1.6 MB)
挖一下,今天心血来潮,尝试提取文件,看见了一个非常符合我喜欢的角色CG,使我想要魔改,去除了背景,把男的删除了,把JJ换成了大茄子。分享一下
(原来的右膝盖是缺失一部分的,ps技术有限,补全的有瑕疵,将就一下吧,哈哈)
1.zip (4.8 MB)