我目前正在逆向工程一个定期更新的多人游戏。网络协议使用自定义序列化框架,我现在能够恢复关于正在交换的消息的大量信息。对于每条消息,我可以检索所述消息的完整结构和该消息的类型(例如。身份验证、聊天、移动…)。然而,我遇到的一个问题是消息和消息类型经常被添加和删除,而且消息可能有添加或删除的字段。消息和消息类型的总体顺序保持不变
!我现在正在寻找一种方法,如何最好地利用信息,我必须匹配更新的消息结构的旧的,我已经确定了一些消息和字段的含义。也就是说,给定如下两组消息,我如何传输已经逆向工程的信息(新消息中的注释)?
旧消息:
Authentication:
message Login:
opcode: 1
fields:
- string mail
- string password
message LoginResponse:
opcode: 2
fields:
- string token
Chat:
message ChatSend:
opcode: 3
fields:
- string channel
- string message
message ChatReceive:
opcode: 4
fields:
- string channel
- string user
- string message
新消息:
Type1: # Authentication
message Unk1: # Login
opcode: 1
fields:
- string unk1 # mail
- string unk2 # password
_ string unk3 # new field
message Unk2: # LoginResponse
opcode: 2
fields:
- string unk1 # token
Type2: # new Type
message Unk3:
opcode: 3
fields:
- Vec3 unk1
- float unk2
Type3: # Chat
message Unk4: # ChatSend
opcode: 4
fields:
- string unk1 # channel
- string unk2 # message
message Unk5: # new message
opcode: 5
fields:
- string unk1
- string unk2
message Unk6: # ChatReceive
opcode: 6
fields:
- string unk1 # channel
- string unk2 # user
- string unk3 # message
一些附加信息:大约有60种不同类型的消息,每种消息类型最多有大约100条消息。此外,我也欢迎伪代码或python的解决方案。
更好和更可持续的解决方案是重新设计生成消息的系统,使其与名称和格式保持一致。这将使它更具可扩展性。
如果这确实不是一个选项,这里有一个可能的算法,您可能想通过使用Levenshtein等库计算字符串差异来探索。这里,让我们关注最外层的数据(类型)。只需对内部数据(消息和字段)执行相同的概念。
假设这些是新旧消息中类型之间的匹配:
旧消息 | 新消息 | 备注 | O1 | N1 |
---|---|---|
N2 | 新 | |
N3 | 新 | |
陶瓷 | ||
O3 | 它们 | |
删除 | ||
O5 | 删除 | |
N6 | 新 | |
O6 | N7 | |
N8 | 新 |