import os
import sys
import struct

# 配置游戏对应的密钥和签名
KEY  = b"你的秘钥"
SIGN = b"4meJnPyl"
SIGN_LEN = len(SIGN)

def _long2str(v, w):
    n = (len(v) - 1) << 2
    if w:
        m = v[-1]
        if (m < n - 3) or (m > n): return None
        n = m
    s = struct.pack('<%dL' % len(v), *v)
    return s[0:n] if w else s

def _str2long(s, w):
    n = len(s)
    m = (4 - (n & 3)) & 3
    s += b'\0' * m
    v = list(struct.unpack('<%dL' % (len(s) >> 2), s))
    if w: v.append(n)
    return v

def xxtea_decrypt(data, key):
    """纯 Python 实现的 XXTEA 解密核心算法"""
    if not data: return data
    v = _str2long(data, False)
    k = _str2long(key.ljust(16, b'\0')[:16], False)
    n = len(v) - 1
    z = v[n]
    y = v[0]
    delta = 0x9E3779B9
    q = 6 + 52 // (n + 1)
    sum_val = (q * delta) & 0xFFFFFFFF
    while sum_val != 0:
        e = (sum_val >> 2) & 3
        for p in range(n, 0, -1):
            z = v[p - 1]
            v[p] = (v[p] - (((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4)) ^ ((sum_val ^ y) + (k[p & 3 ^ e] ^ z)))) & 0xFFFFFFFF
            y = v[p]
        z = v[n]
        v[0] = (v[0] - (((z >> 5 ^ y << 2) + (y >> 3 ^ z << 4)) ^ ((sum_val ^ y) + (k[0 & 3 ^ e] ^ z)))) & 0xFFFFFFFF
        y = v[0]
        sum_val = (sum_val - delta) & 0xFFFFFFFF
    return _long2str(v, True)

def decrypt_file(file_path):
    if not os.path.exists(file_path):
        print(f"[错误] 文件不存在: {file_path}")
        return

    print(f"[处理] 正在读取文件: {file_path}")
    
    try:
        with open(file_path, 'rb') as f:
            encrypted_data = f.read()
        
        # 检测并自动剔除文件头的签名
        if encrypted_data.startswith(SIGN):
            print(f"[检测] 发现文件头签名 '{SIGN.decode()}',已自动裁剪前 {SIGN_LEN} 字节。")
            encrypted_data = encrypted_data[SIGN_LEN:]
        else:
            print("[提示] 未发现已知文件头签名,尝试直接整包解密。")
        
        # 执行纯 Python 版 XXTEA 解密
        decrypted_data = xxtea_decrypt(encrypted_data, KEY)
        
        if not decrypted_data:
            print("[失败] 解密结果为空(可能 Key 错误,或该文件并非 XXTEA 加密)。")
            return
            
        # 生成输出文件(保持原后缀方便直接预览)
        dir_name, file_name = os.path.split(file_path)
        base_name, ext = os.path.splitext(file_name)
        output_name = f"{base_name}_decrypted{ext}" if ext else f"{base_name}_decrypted"
        output_path = os.path.join(dir_name, output_name)
        
        with open(output_path, 'wb') as f:
            f.write(decrypted_data)
            
        print(f"[成功] 解密完成!已生成文件: {output_path}")
        
    except Exception as e:
        print(f"[报错] 解密过程中出现异常: {e}")

if __name__ == "__main__":
    if len(sys.argv) > 1:
        for path in sys.argv[1:]:
            decrypt_file(path)
    else:
        print("提示: 你可以直接把文件拖到此工具上运行。")
        path = input("或者请输入要解密的文件路径: ").strip('"')
        if path:
            decrypt_file(path)
            
    input("\n处理完毕,按下回车键退出...")

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐