火焰之纹章 影(Fire Emblem Shadows) 音频解包求助

数据包文件: 515.37 MB file on MEGA

官网:Fire Emblem Shadows | Nintendo

重新开了个帖,想收语音,目前看了外网没有讨论这个解包的帖子,目前试了AssetStudio几个版本都无法加载bundle文件,VGM工具箱没有响应的方法,HxD内也无法分辨这个文件的类型,接触近几年新手游解包比较少,在此求教一下大佬们解包方法。

什么狼人杀。。。还有就是并非没有讨论,不过似乎只到local key为止

KEY_LOCAL = bytes.fromhex("8b3877795fb5a6ee3efcdd8874ad28c7")
KEY_REMOTE = bytes.fromhex("b17f5799272f256658f5f727ec058ef2")

def calculate_nonce(f):
    v6 = 0
    v8 = 0
    for char in os.path.splitext(os.path.basename(f))[0]:
        char_code = ord(char)
        v10 = v6 & 0x3C
        v6 += 4
        v8 ^= (char_code & 0xF) << v10
    v8 = v8 & 0xFFFFFFFFFFFFFFFF
    return struct.pack("<Q", v8)

def decrypt(i):
    nb = calculate_nonce(os.path.basename(i))
    with open(i, "rb") as f:
        enc = f.read()

    keys_to_try = [
        ("REMOTE", KEY_REMOTE),
        ("LOCAL", KEY_LOCAL),
    ]

    for key_name, key in keys_to_try:
        cipher_ecb = AES.new(key, AES.MODE_ECB)
        dec = bytearray()
        numb = (len(enc) + 15) // 16
        for bi in range(numb):
            cb = nb + struct.pack(">Q", bi)
            keystream = cipher_ecb.encrypt(cb)
            s = bi * 16
            end = min(s + 16, len(enc))
            for i in range(end - s):
                dec.append(enc[s + i] ^ keystream[i])
        h = bytes(dec[:16])
        if b"UnityFS" in h:
            with open(i, "wb") as f:
                f.write(bytes(dec))
            return (True, key_name)
    return (False, None)

能解密小一半的资产,剩下的懒得找key了,等大佬接手了

非常感谢。

战棋狼人杀,看到类型以后两眼一黑,感觉这游戏明天关服也不意外。