前言:
关于GM2023和汉化的部分,详见知乎:【Gamemaker】GMS 1.4 和 GM 2023 YYC 编译和汉化的程序研究 - 知乎 (zhihu.com)
涉及过Gamemaker游戏反编译领域的可能都知道,所有使用Gamemaker Studio 1.4(简称GMS1.4)编译的程序在游戏根目录里都会有一个“data.win”文件。而这个文件里包含了游戏的代码,音效,精灵,着色器...等等等等。因此使用GMS1.4编译的游戏被破解的风险很大,GMS1.4的官方为了防止这个情况特地制作了一个编译选项,叫”YYC“,大概意思是将所有的代码都交给了VS和Windows SDK去编译,在消除了data.win文件的同时也大大提高了游戏被反编译的难度。所有的资源文件全部都被嵌入了一个小小的exe文件里,因此,我特此写出了·这篇文章去详细讲解EXE的文件结构
正文:
实际上,GMS1.4所创建的EXE分成了及其明显的三个部分,我将会用字节码的形式去讲述这些部分
解释器部分——从最开头到FORM(46 4F 52 4D)
这部分写出了Gamemaker的解释器,这个解释器能告诉EXE如何去读取Gamemaker所编译出来的数据,因为YYC严格上说并不是一个真正的C程序编译器,GMS的数据结构仍需要解释器去解释。然而,因为C语言的NB,我们无法反编译出解释器的具体内容
数据包部分——FORM(46 4F 52 4D)到AUDO(41 55 44 4F)
如果该部分未被加密,那么FROM后再四个字节应该是GEN8(47 45 4E 38),如果你检查FROM后有这四个字母,那么恭喜你,这个EXE的数据包文件没有被加密。你可以提取出这个exe的数据包,那么这个数据包能做到什么呢?你已经可以从中提取出音效,精灵,着色器了,如果你不需要更改代码,那么看到这里已经足够了。你可以使用UndertaleModTool这个工具的打开这部分数据包,在打开之前,你只需要将这部分字节复制,然后放到一个新的data.win文件中或是使用脚本"ExtractEmbeddedDataFile"。进行完这个操作后你就可以从里面读取除代码外的所有东西了!
代码部分——AUDO(41 55 44 4F)到最后
这部分是真正的难点,YYC编译使代码完全变了个样子,只要你改动一个字节,这个程序就会立马崩溃。那么我们应该怎么办?别急,实际上我们还是能修改一个东西——字符串
字符串并没有被放置在数据文件里,而是被编译到了字节SetEndOfFile(53 65 74 45 6E 64 4F 66 46 69 6C 65)的后面,这是个很有意思的地方,那就是字符串是被编译到数据包前面的,所以你不用往后找。在更改时我们需要遵守两条原则
1.更改时切勿修改了文件的大小,比如CeyaseOver这个字符串,如果要更改那么就得写成CeyaseEnda,你需要凑字。
2.如果你真的想要缩短文字的长度怎么办?不用担心,我们可以使用空子节(00)来占位,这可以缩短文字的长度,但是,我们不能增加字符串的长度,这个操作是致命的