与Ghidra的Crusader Kings III合法化同性恋婚姻

2021-04-06 06:17:09

Crusader Kings III是一个非常令人印象深刻的游戏。它不仅适用于其官方内容,而且还为其广泛的修改工具令人印象深刻。即使在发布之前,我的承诺在改进的修改体验中被绘制。与这篇文章有关,我对表观致力于改善包容性的表观致力于印象。

虽然游戏确实允许玩家重新形成各种中世纪文化,接受同性伴侣,因为CK3版本1.3.1它目前不允许改革者允许同性婚姻。那应该没问题;这就是Mods的衣服!

令人印象深刻的CK3在悖论互动的内部脚本语言中实施(如果您在没有任何括号的情况下造成的Lisp,那么就像你所接受的那样。游戏还为玩家提供了良好的实用程序来创建,包,并在蒸汽研讨会等地方分发自己的脚本。

获得两个角色要结婚(没有任何奇特状况)是相当简单的。所有你真正需要的是一个这样的脚本:

do_ye_a_marriage = {category = contraction_category_friency_friency_accept = yes is_shown = {always = yes} on_auto_accept = {scope:actor = {marry = scope:procient}}}}}}}}

选择将正在播放的结婚托斯卡纳的公爵夫人与任何人你时,不问任何问题。

创建一个mod来嫁给同性角色应该是非常简单的。瑞典国王未婚,所以你可以向他施加效果......

… 没有什么?什么都不会在游戏中发生。 CK3确实保留了相当详细的错误日志,在Windows上通常存储在C:\ Users \< \ document \ Paradox Interactive \ Crusader Kings III \ Logs \ Error.log中。我们会看到:

[Jomini_Script_System.cpp:169]:脚本系统错误!错误:结婚效果[k_denmark的svend estrid(内部ID:15228 - 历史纪录的ID 101515)不得嫁给K_SWEDEN的Erik Stenkiling(内部ID:17969 - 历史纪录ID 100525)]

不幸的是,事实证明,游戏逻辑嫁给两个字符的游戏二进制文件,而不是在脚本文件中,而游戏引擎将单方面阻止同伴相同的婚姻。这使得试图在Cruisader Kings 3中嫁给两个同性人物......一个非法运作。

(看,它不像我所做的一切都是制造坏双关语的借口。只是大多数我所做的事情。)

当游戏发布时,Modders会发现这很快。我汇总了已成为官方悖论论坛的改变的主题。随着时间的推移,补丁只是设法使事情变得更糟,在论坛和宣布上的陈述中,虽然所关注的问题,但解决这个问题是困难的,而且它不是目前的优先事项。

现在游戏莫德尔斯,用来将游戏的问题带到自己的手中,可以达到足够的时间的各种各样的东西。我从最近的GTA Online工作中获取了灵感,并花了我的时间从事游戏引擎的一些轻型逆向工程。借鉴了,我设法生产了一个390个字节的非官方游戏补丁,以绕过同性婚姻的硬编码限制以及同性伙伴采用儿童所需的一些其他效果。在官方论坛上发布这一点的回应是......

......不是我希望的。关于禁令和删除补丁线程外,还删除了从实时提及补丁的任何帖子,包括来自原始请求线程的整页。

现在,我可以尝试找到一些接受补丁的其他网站,但是有一些缺点。我制作的补丁只有我的操作系统上的CK3当前蒸汽版本,我的CPU架构很好。但我可以提供比这更便携的东西:知识!

因此,无需进一步的ADO,让我们通过一个逐步的指南,看看有人如何有一点技术诀窍,如何逆转工程师像十字架王书3这样的游戏。

(如果您没有太多的技术知识,或者您只是像我这样的不耐烦的摩擦,请随时跳到底部附近的快速修复部分)

Ghidra是由美国政府国家安全局̶t̶o̶̶h̶a̶c̶k̶̶h̶̶̶̶̶̶̶̶̶s̶e̶̶̶̶̶s̶h̶建造的一套逆向工程工具套件。它在2019年开放了营销,自从使奇怪的编码人员能够戳他们的鼻子进入各种各样的程序。

我将把安装说明留给其网站,但在打开并点击教程问候语后,您将与这样的窗口满意:

开始,您必须通过开始新项目的形式。这是从文件中完成的 - >新项目... 。为您的项目提供名称和位置,您已准备好导入您的游戏文件。

要做到,您要查找CK3.exe文件的位置。我是一个蒸汽版本,可以在D:\ SteamLibrary \ Seamapps \普通\ Crusader国王III \二进制文件中找到,但你可能需要做一些狩猎来找到你的。

一旦找到了CK3.exe文件,您就可以通过文件导入 - >导入文件... interface。这应该让你看看这样的东西:

在击中确定并加载您的二进制文件,您将被打招呼通过您可以通过的报告以及活动项目窗格中的一个新文件。双击该文件以启动真正的乐趣。

Ghidra的界面在第一次遇到时令人生畏,但很简单,有一点经验。只要记住,如果您意外退出导航窗格,您通常可以将其带回顶部条上的Windows选项。

在首次开放二进制时,系统将提示您开始分析:

Ghidra可以分析很多关于文件的东西。如果您不确定您正在寻找什么,则最简单的方法可以接受默认值并点击分析。对于二进制大小的CK3.exe的大小,这将需要一段时间。我离开了我的跑步过夜。一旦分析完成,如果您希望任何分析仍然在重新开放时,您将希望在左上方的保存按钮。

从那里整个世界开放了。逆向工程的最困难的部分特定特征有时可以弄明出从哪里开始。幸运的是,我们确实有一个领导:启动这个的非常错误消息。常用的文本通常在程序文件中存储为序列。像k_denmark的Svend Estrid这样的文本可能是动态生成的,但不允许嫁接的文本可能存储在文件本身中。

从菜单栏中,选择搜索 - >对于字符串...并单击“使用默认选项的搜索”。从那里,您可以使用过滤框搜索一串文本。初始化后,这将(慢慢地)搜索游戏文件的任何与过滤器匹配的字符串。

我们运气了!双击该行项将带您到列表窗格中的文本字符串(在其他窗口中,用于切换Windows)。

这将显示一些关于我们在内存中的位置的文本字符串的一些信息。现在字符串本身并没有告诉我们很多。我们对使用字符串的文本更感兴趣。通过右键单击突出显示的行,您可以选择引用 - >显示引用地址查找那些。

看起来有两个地方引用内存中的位置。我们也可以从第一个开始。双击第一行项目以转到其位置。在主窗口中,这应该打开列表和分解窗格中的位置(如果您没有分解窗格,可以使用窗口打开一个 - >反编译)。

现在有很多痛苦的痛苦在反编译窗格中吐出来。像CK3这样的游戏通常用C ++这样的编程语言制作,当分布式开发人员通常剥离他们的游戏文件中的函数和变量的名称,以使这些文件更小。为了补偿,Ghidra只是给大多数事情都有假的名字。

关于逆向工程的一个有趣的事情是,二进制文件是你经常不需要知道大部分痛苦的手段。在我们的情况下,我们可以向下滚动,直到我们看到与我们的字符串的行。

我们可以通过单击Fun_14034CB90(Spoorer,它主要只是打印错误)来检查正在调用的功能,但我们更感兴趣地保持其运行。滚动到if-block的顶部此功能已在,我们看到这个:

因此,CVAR2是函数fun_140a1b9c0的结果,如果该结果为零,则触发错误处理代码。鉴于错误是关于两个角色如何不结婚的问题,它是一个很好的赌注,即LVAR7和LVAR3是被检查的两个字符。如果我们双击fun_140a1b9c0,我们可以看看它的内部。

现在这是C编程的一些了解真的有帮助。我们正在寻找一个我们的输入参数相互比较的位置,返回零。在函数的顶部附近,我找到了这样的块:

这将取得我们的输入(我们假设是某种字符结构),并将它们的每个偏移0x124的字节进行比较。如果这些字节相等,则整个函数返回零。这看起来可能是比较角色性别的,只要角色的性别可以适合一个字节(而且我知道从一些玩作用发动机,它实际上是单一的,男性和女性1个。

看到我们是否正确的最佳方式是我们的if-yex-matemate是尝试绕过它。单击“Decompiler”窗格中的“IF”将将列表窗格带到相应的装配指令。

当检查二进制文件时,这可以降低。 JZ是“跳零跳”的短暂。它需要一个上一个比较(在这种情况下我们的两个是个体),如果该比较导致零(如果致命符相等,则跳转到内存中的新位置。如果我们要遵循指令左侧的黑线,它将导致我们的一些代码,使函数返回零。

删除这样的指令的一种方法是改变它跳转的地方。为此,请右键单击“列表”窗格中的行,然后选择“修补程序指令”。

请注意,跳跃位置现在看起来很像内存位置。如果我们希望我们的JZ指令永远不会跳转,我们可以将其跳转位置更改为140A1BA00的下一行。这种方式,它将最终是我们的角色的性别等于。

请注意,左侧的箭头已更改为新的跳转位置。一旦Ghidra再次完成了函数,我们编辑的if-stalate应该不再存在。

到目前为止所有这些编辑都刚刚在我们的Ghidra项目中。如果我们想测试我们的更改,我们需要将其恢复到二进制文件中。 Ghidra有一些已知的问题导出我们使用的表单中的文件,因此我们希望利用免费脚本来补偿。

该链接的官方指示对我不起作用,因此我将SavePatch.py​​文件放入我的> ghidra \ features \ python \ ghidra_scripts \ folder \ folder。在那里,您需要拖动列表窗格中的组件行,以便整个东西是绿色的。然后单击界面顶部附近的脚本管理器按钮:

在Finder Bar中输入“SavePatch”,您应该看到下载的脚本。

双击找到的行项目,应提示您选择文件。您最初导入并选择它的CK3.exe文件的路径(您可能希望将其另存为备份的其他位置。如果所有这些都正确,您的磁盘游戏应使用已修改的跳转指令进行修补。

如果我们跳回游戏,试着再次尝试瑞典之王,我们......

......仍然没有什么。但我们确实在错误日志中有一个新的消息:

它看起来像悖论开发人员对自己的使用有一些额外的检查。我们可以在这个上使用相同的方法。搜索 - >对于字符串...,过滤“只能嫁给不同性别的字符”,然后就是那个字符串引用 - >显示参考地址。

这次只有一个。既然我们有一个想法要寻找什么,这个函数中的相关代码很容易找到。

这是第一个类似的结构。它将我们的两个参数与0x124进行了比较,并检查它们是否相等。选择我们的“如果”相应的装配看起来有点不同:

我们突出显示的指令是JNZ或“跳跃,如果不是零”指令,箭头指向我们的“只能嫁给”字符串。所以我们希望这个指令总是跳,而不是永远不会跳。为此,再次右键单击突出显示的行,然后选择“修补程序指令”。接下来将JNZ更改为JMP,这是无条件跳转的指令。

要应用于您的游戏,请遵循相同的突出显示,脚本管理器,并选择savepatch.py​​。

......毕竟,我们最终可以获得丹麦 - 瑞典的个人联盟,我们始终知道我们想要。

我最初发布的修补程序有这种变化和其他几个能够联合采用的同性伴侣。他们都使用了相同的装配技巧。

但这是所有这些变化吗? CK3具有在脚本文件中删除的检查,因此基本游戏根本不应该看到任何更改。我用一些简单的同性恋婚姻模式玩了一段体面的时间,到目前为止我注意到的唯一出色的错误是这样的:

事实证明,CK3嫁给效果并没有针对嫁给自己的特定检查。一些效果,如set_father将明确地阻止角色成为自己的父亲,但任何特定的角色都是与自己同样的性别,因此同性恋汇块也作为自婚块。任何Modders都可能希望在其Mod中明确检查此功能。

即使这也很稳定,而我播放它。对CK3开发者来说,他们的发动机非常强大。

(如果任何CK3开发人士确实恰好读到这一点,我会建议无论如何地建议对自婚的特定检查。)

但是如果你不想开始职业逆向工程软件怎么办?嗯,如果您碰巧有CK3 1.3.1的Windows 10 Steam版本,您可以在选择的十六进制编辑器中打开CK3.exe文件,以进行以下更改:

这是同样的事情,减去所有的挖掘。在制作mods时,请注意上面的“嫁给自己”问题(或者如果你是一个自恋器)。

我知道一些人将令人沮丧的是,帕拉多到目前为止如何处理。我知道我已经过了。我会问虽然人们请不要骚扰个人悖论。我聊天的那些似乎是好人。