.mek 文件按照顺序结构,大致可以从上至下分为

1
2
3
4
5
6
7
1 头部偏移
2 机体本体信息
3 spm序列信息
4 武装信息
5 ai信息
6 疑似voice信息
7 武装素材组清单

本次主要记录的是其中的 2 机体本体信息,会记录从如何发现规律,到实现思路的全过程。


1.观察二进制

使用任意一款二进制查看工具,将字符集调整到日语,我这里使用的是 010 Editor

[p1]

看到开头处一定不会觉得陌生,因为这里明显就是每个机体的基本信息。并且是以 00 为字符串的结尾符。其开头的 01 00 00 00 则是存在 FLAG,用于给 NeXAS 引擎判断下一个块是否存在,不存在会直接 return 。

那么,其组成大致就可按直觉表述为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Weapon {
// 机体名
String mekName;
// 机体名EN
String mekNameEnglish;
// 驾驶员名字
String pilotNameKanji;
// 驾驶员名字EN
String pilotNameRoma;
// 机体描述文本
String mekDescription;
// 一连串的小端整型数,数据块
List<Integer> leInts;
}

其下方的数据块均为小端整型,4 字节的数据。

观察别的 .mek 文件,会发现均为相同特征,且 leInts 的大小均完全相等,说明此 part 并不存在运行时的动态读取,而是以固定的顺序依次加载并使用。

[p2]

2.反编译静态分析

若上述结论正确,其特征应该也能在各种反编译工具中轻易找到,这里使用 IDA pro 进行静态分析。

寻找逻辑的方向就是直接全局搜索 .mek 字符串,并在使用到该字符串的周围,以及其下方的部分函数中,寻找是否有连续的字符串读取和连续的数值读取。(当然,你首先要能看出哪个函数是从流里读出数据的)

果不其然,在其中一个 .mek 字符串被引用到的,下方的一个函数中,能找到与二进制排布顺序完全一致的线性读取逻辑。

[p3]

此外,还能发现很多明显是用于开发的日语字符串,这里也被封到游戏 exe 里了,不过后续通过 resource hacker 发现,此处其实是 devtools 的 ui 里的文字。

[p4]
[p5]

那么,剩下的就简单了,对于任何一个玩这游戏好几百小时的人来说,估计看到数值就能猜个八九不离十,轻易找出机体信息内各种数值的含义,哪怕不知道,稍微改改封回去,也能立马悟到。

其实现如下:

parseMekInfo方法为真实实现


本站总访问量