[已解決]求助大佬们我的御剑日记这些档案的解密方法

如题:

继台服后,渠道服也要关了,虽然官服还正常,不清楚还能活多久 :sob: :sob: :sob:
astc档案有找到解密脚本如下:(台服的,国服也适用)

import os

byte_0 = bytes([
    0x11, 0x2B, 0x65, 0x78, 0x17, 0x0C, 0x0D, 0x17, 0x15, 0x35, 0x62,
    0x65, 0x7B, 0x62, 0x15, 0x7F, 0x11, 0x2C, 0x63, 0x17, 0x4D, 0x57,
    0x0C, 0x59, 0x0B, 0x20, 0x65, 0x21, 0x20, 0x63, 0x0C, 0x7F, 0x12
])

byte_33 = bytes([
    0x75, 0x04, 0x0A, 0x0C, 0x7B, 0x15, 0x10, 0x21, 0x36, 0x37, 0x1B,
    0x23, 0x65, 0x64, 0x0B, 0x0F, 0x47, 0x2F, 0x5A, 0x24, 0x11, 0x59,
    0x41, 0x4C, 0x5B, 0x21, 0x66, 0x5A, 0x31, 0x40, 0x51, 0x7E, 0x0D
])

byte_66 = bytes([
    0x15, 0x43, 0x2D, 0x27, 0x58, 0x51, 0x0F, 0x57, 0x15, 0x13, 0x24,
    0x14, 0x0E, 0x2B, 0x25, 0x16, 0x1F, 0x0E, 0x4E, 0x0E, 0x3F, 0x29,
    0x42, 0x52, 0x10, 0x29, 0x0F, 0x69, 0x65, 0x49, 0x1C, 0x20, 0x42
])

byte_99 = bytes([
    0x54, 0x22, 0x3D, 0x4A, 0x07, 0x37, 0x4D, 0x11, 0x63, 0x69, 0x65,
    0x13, 0x4A, 0x2D, 0x2D, 0x4B, 0x41, 0x59, 0x0E, 0x73, 0x24, 0x4E,
    0x15, 0x62, 0x77, 0x10, 0x32, 0x3C, 0x46, 0x50, 0x5A, 0x64, 0x6E
])

def decrypt_yf(filepath):
    with open(filepath, "rb") as f:
        data = bytearray(f.read())
    if len(data) < 16 or data[:2] != b'AB':
        print(f"文件 {filepath} 無需解密")
        return
    

    v5 = (data[13] | (int.from_bytes(data[2:4], 'big') << 16)) & 0xFFFF00FF | (data[12] << 8)
    v6 = data[15] | (data[14] << 8)
    v7 = int.from_bytes(data[10:12], 'big') | (int.from_bytes(data[4:6], 'big') << 16)
    v8 = v7 - (v7 // v6) * v6 + v7
    v9 = v5 % 3 if (v8 & 3) != 0 else 3
    v10 = min(v8, len(data))
    
    if v5 + v10 + 16 >= len(data):
        print(f"文件 {filepath} 不符合解密條件")
        return
    
    start_offset = v5 + 16
    end_offset = start_offset + v10
    

    if v9 == 0:
        key_segment = byte_0
        key_name = "byte_0"
    elif v9 == 1:
        key_segment = byte_33
        key_name = "byte_33"
    elif v9 == 2:
        key_segment = byte_66
        key_name = "byte_66"
    else: 
        key_segment = byte_99
        key_name = "byte_99"
    
    print(f"使用的密鑰段:{key_name}")
    print(f"解密範圍:{start_offset} 到 {end_offset}")
    

    for i in range(start_offset, end_offset):
        key_index = (i - start_offset + v5) % 33
        data[i] ^= key_segment[key_index]
    

    decrypted_filepath = filepath + ".dec"
    with open(decrypted_filepath, "wb") as f:
        f.write(data[16:])
    print(f"解密完成: {decrypted_filepath}")

for filename in os.listdir("."):
    if filename.endswith(".astc"):
        decrypt_yf(filename)

astc.zip (1.0 MB)
但bin档案不适用 :scream: :scream: :scream:。看看有没有人有备份脚本或知道bin档案如何解密的 :sob: :sob: :sob:
spines-atlas.zip (1.5 MB)

bin文件没有加密, 它是谷歌的研发的格式flatbuffers, 你需要提供类型类, 才能转换
flatc

1 个赞

曾经尝试过还原,但是未能成功
我要没记错这不是单纯把文件塞进去,还有别的处理

这个格式是根据你提供的fbs模型文件生成的二进制文件

table 示例 {
    编号1: string;
    编号2: uint32;
}

root_type 示例;

需要找出游戏定义类型的文件或者代码

flatc 会根据你提供的类型 进行读取文件从而反序列化

感些大佬的解说:sob: :sob: :sob:
可能还请大老辛苦一下!看哪边能找到fbs模型文件!

纯小白不熟,但还是提前感谢大佬的帮助! :smiling_face_with_three_hearts: :smiling_face_with_three_hearts:

cmd 指令flatc.exe --json --strict-json --raw-binary --natural-utf8 F:\test\spineatlas.fbs -- F:\test\spineatlas.bin
spineatlas.zip (344 字节)

1 个赞

image
这样就会生成一个json文件
然后就是你自己写代码解析还原atlas

感谢,但是我更好奇如何解析出完整的fbs文件,是直接从代码里面还原的么?

你熟悉这个格式的话, 是可以通过硬猜结构的, 我因为处理过好几次这个格式, 所以猜出来很简单

果然还是需要专业对口的来。。
另外尝试还原atlas,当时和曾经一样遇到了一个问题,他们的rotate似乎有一定程度魔改,估计只能先去研究下,有进度再汇报吧

有spine文件吗? 我测试看看

1081.zip (3.0 MB)

实际上spine支持180和270这种角度的

spine是支持,但是在atlas里要怎么表达180和270呢?

就是用数字

或者你可以转成4.0格式的atlas

我看它的skel就是3.8.95,然后看了下这个版本的atlas的rotate好像只有true和false

因为这是老版本的默认值 0 = false 90 = true, 实际也支持数字

还真是可以直接数字,果然得专业的来