前言:

涉及过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)来占位,这可以缩短文字的长度,但是,我们不能增加字符串的长度,这个操作是致命的

【Gamemaker】YYC1.4编译的程序研究相关推荐

  1. c语言自己编译自己,TCC研究(一): Tiny C Compiler最小的C语言编译器,自己编译自己...

    TCC研究(1): Tiny C Compiler最小的C语言编译器,自己编译自己 最近,在学习编译器技术, 研究了一下TCC, 记录一下. Tiny C Compiler(简称TCC, 或Tiny ...

  2. 反编译小程序得到源代码

    前言 最近在研究小程序吗,在git上找了一些阅读类的开源代码,拿到小程序代码,用java写了一套后台支撑,经过上线,部署,审核,域名,备案,服务器等等,算是接近了阅读类app的尾声,等有时间一一整理一 ...

  3. AuToCAD启动自定义加载程序研究(转)

    AuToCAD启动自定义加载程序研究(转) AuToCAD启动自定义加载程序研究(转) 2009年06月02日 星期二 下午 12:28 CAD文件加载顺序:       acad2006.lsp ( ...

  4. 让MFC(c++)编译的程序支持高DPI

    让MFC(c++)编译的程序支持高DPI 问题描述: 写的程序A.exe,在笔记本开着盖子重启电脑,打开程序的时候是有界面的:但是如果点击重启之后把盖子合上之后,等重启完毕再打开A的时候,程序就打不开 ...

  5. 使用MS VS的命令来编译C++程序

    以前,我是在linux下使用命令或者makefile来编译C++程序的,最近需要在windows上做点测试.于是使用ms VS来作为开发工具,这种大揽全包的IDE确实好用:点一下菜单,编译结果就出来了 ...

  6. [转]VS2015编译的程序在其他机器上缺少msvcp120.dll

    http://www.lai18.com/content/1159618.html 1. 今天分享一个自己在开发过程中遇到的困难. 用VS2015开发了一个windows客户端(win32项目),在自 ...

  7. linux下软件编译终止,[2018年最新整理]linux下编译运行程序命令大全.ppt

    [2018年最新整理]linux下编译运行程序命令大全 1. 项目课题引入 2. Vi编辑器的使用方法 3. Linux中C语言程序的编辑 4. Linux中C语言程序的运行 5. 现场演示案例 课题 ...

  8. QT编译发布程序后报错如缺少dll、“应用程序无法正常启动(0xc000007b)”的可能解决方法

    QT编译发布程序后报错如缺少dll."应用程序无法正常启动(0xc000007b)"的可能解决方法 参考文章: (1)QT编译发布程序后报错如缺少dll."应用程序无法正 ...

  9. 利用csc.exe 手动编译C#程序

    1. 创建见 cs代码文件 using System; class TestApp{static void Main(){Console.WriteLine("Test! 1,2,3&quo ...

  10. 【开发环境】Windows 系统中使用 Makefile 构建脚本编译 C 程序 ( 下载并安装 TDM-GCC 编译器 | 配置环境变量 | 编译 Makefile 程序 )

    文章目录 一.下载 TDM-GCC 编译器 二.安装 TDM-GCC 编译器 三.配置环境变量 四.根据 Makefile 脚本编译 C 程序 一.下载 TDM-GCC 编译器 下载并安装 TDM-G ...

最新文章

  1. [原创]软件测试过程改进的内容和注意事项
  2. Databricks基本操作
  3. QML中类似QMap的用法
  4. flume案例-文件数据采集-步骤分析
  5. 进程的创建与可执行程序的加载
  6. JavaScript窗体控制函数
  7. Abbey加入了FreeCodeCamp团队,担任编辑
  8. 基类成员的public访问权限在派生类中变为_第17篇:C++继承中虚表的内存布局
  9. java 拖放文字_Java实现拖放效果
  10. 液压减振器 matlab,摩托车液压减振器内泄漏对阻尼力影响计算及其对策
  11. Java进制转换问题(详解)
  12. excel流程图分叉 合并_excel流程图怎么画
  13. C++游戏服务器框架笔记(二)_封装Socket类
  14. sql条件查询表数据条数
  15. win10专业版有必要吗_Win10专业版和家庭版系统有什么不同?
  16. Linux块设备驱动(一) _驱动模型
  17. VLC初始加载优化:avformat_find_stream_info接口延迟降低
  18. 上市早不如巧,深度剖析嘉楠“两个第一”的内涵
  19. 使用 dotnet *.dll启动项目,修改产品模式为开发模式
  20. 23种设计模式(GOF)

热门文章

  1. 如何应对“创可贴”式员工
  2. PRi——自行车码表
  3. 优联键盘linux驱动,一个坚决不用樱桃轴的优联84客制化键盘
  4. java微信公众号开发,认证,自定义菜单,消息推送,网页跳转
  5. 基于显著性检验分析两个样本分布相似度及Python实现—— t检验、拟合优度检验、KS检验、Wilcoxon符号秩检验、H检验、Mann-Whitney秩检验、P值的意义、API汇总
  6. Android 在一个APP里打开另一个APP
  7. Leetcode799-香槟塔
  8. 【字符编码转换】使用iconv
  9. mysqlclient和pymysql如何选择?_gevent_waiter的使用
  10. N沟道MOSFET所需的高于电池的电源电压