我正在尝试修改旧的DOS游戏(FIFA国际足球)中的某些字符串,尤其是球员的姓名。

过去,在发布时完成这样的任务并不难-DOS游戏,因为很容易在可执行文件或数据文件中找到字符串。但是,对于此DOS游戏,我感到很困惑。

我用十六进制编辑器浏览了游戏文件和可执行文件,但找不到字符串。游戏包括一个english.dat文件,该文件确实包含可读的本地化字符串。但是,此文件仅包含游戏标题和菜单选项中的名称,而不是我要查找的玩家名称。其他文件由其他语言,图形和声音的本地化字符串组成。

我使用DOSBOX的调试版本通过以下命令执行内存转储:

memdumpbin 180:0 1000000


我从这里得到命令:http://www.vogons.org/viewtopic.php?t=9635

在内存转储中,我可以找到字符串希望更改。

链接此信息以查找字符串来源的最佳方法是什么?我假定这些字符串在某种程度上已在可执行文件中加密或压缩,尽管它可能在另一个晦涩的游戏文件中。如果字符串被压缩/加密,也许有一种通用方法可以将这些数据从可执行文件中提取出来。我的操作系统是Windows 8/64位。

另外,要明确-我想在源(即文件中)而不是内存中修改字符串。

评论

我在reverseengineering.stackexchange.com/a/3004/2959顶部提到了几种策略-可能适用于常见的混淆/编码,但不适用于压缩。

刚刚检查过;可执行文件已压缩或加密,我找不到任何数据文件名。 (它的确在“主”代码的末尾包含字符串“ Hello EA”。)

#1 楼

该程序使用PharLap DOS扩展器,如其MZ标头所示。每个“重定位表头中的偏移量”(请参见http://www.program-transformation.org/Transform/PcExeFormat)中的32位可执行程序都从偏移量18A0开始,在该位置您可以看到正确的签名P3 。根据标头信息,可执行文件的长度为0x95851,这是另一个正确的提示。在此部分的结尾附近,从18A0开始,您可以看到文本字符串“ Hello EA”,并且在下一个32字节“页面”处嵌入了表示另一个可执行文件的签名MZ。因此,这大部分必须包含主要的可执行文件。获取文件包含的数据类型的“感觉”。我看到图案每2行重复一次,当我将显示宽度设置为32时,图案很明显。可执行格式始终以固定的标头开头,并且通常在后面填充大量零,因此我怀疑重复模式可能是XOR键。一个简单的C程序证实了这一点。我不知道从哪里开始解码,但是32的第一个非全零倍似乎是一个不错的猜测:offset 0x1AA0

从那里解码证明预感是正确的:看看那里是什么。灾害!我看到的不是可读文本,而是随机数据-仍然具有清晰的图案。

但是“可执行文件”不是一个连续的长数据块。通常将其分为“可执行代码”,“初始化数据”,“未初始化数据”,“重定位”等不同的部分。当加载到内存中时,这些部分都从对齐的地址开始,但不一定在文件本身中,或者具有相同的“内存页”大小。因此,XOR加密有可能在新部分的开头重新开始。 PharLap标头应包含有关每个部分的开始和结束位置的信息(如果要尝试调整程序,则应调查此内容),但是要确认XOR键是相同的,只是调整起始位置。再开始一个位置,没有成功,但是再开始两个位置,我注意到了这段数据:

00000 : Y...r9..n3.>..-.A@I.7P........h4..a"1.P(s.......x. rG..f...X.+..
00040 : ..a|D.P(.b..A...x......f3..F..h4....a.P(...........o7..f3..F2...
00080 : .@@@@@@...@@BLASTER=@ULTRASND=@GOLD=@mvsound.sys@DEVICEdevice@@@
000C0 : @@@@@@@@@@@.......ULTRAMID@@@@@@@@@@@@@@@ ..@.@@@@@@.........@.@
00100 : .@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@.@@.@@@@..@@...@@@..@@......&...
00140 : ./....8....C....N....X...@c.@@ m....y...................C.......
00180 : .PCSPKR.ADV@MT32MPU.ADV@ADLIB.ADV@ADLIBG.ADV@SBFM.ADV@SBFM.ADV@S
001C0 : BP1FM.ADV@SBP2FM.ADV@PASFM.ADV@PASOPL.ADV@TANDY.ADV@GF1MIDI.ADV@
00200 : CUST_MID.ADV@SBP2FM.ADV@SBAWE32.ADV@@@@ALGDIG.ADV@SBDIG.ADV@SBDI
00240 : G.ADV@SBPDIG.ADV@SBPDIG.ADV@PASDIG.ADV@PASDIG.ADV@@GF1DIGI.ADV@C
(etc.)


这就是我需要的证明:数据部分确实使用了相同的XOR键。下一步:测试从0到31的所有可能性,然后看是否有变化。只有在+30时才起作用,就像我要放弃的那样:

890C0 : B.@.L.@^W.@.a.@^l.@.v.@^..@...@ @ @ @ @ @ @ @~FIFA International
89100 :  Soccer@ @PC Version by@~The Creative Assembly@ @~Lead Programme
89140 : r@ @Tim Ansell@ @ @ @~Programmers@ @Adrian Panton@Clive Gratton@
89180 :  @ @~Lead Artist@ @Will Hallsworth@ @ @ @~Additional Artwork@ @A
891C0 : lan Ansell@ @ @ @~Original Music@Composed, Produced@and Performe
89200 : d by@Ray Deefholts@for ~HFC Music@ @Additional Drum@Programming 
89240 : and@Assistance@ @Tim Ansell@ @~Sound Effects@ @Bill Lusty@ @ @ @
89280 : ~Producer@ @Kevin Buckner@ @ @ @~Associate Producer@ @Nick Golds
(etc.)


因此,可执行文件中的每个单独部分都使用32字节加密XOR键;该XOR键对于所有部分都是相同的;

下面的C程序将解密整个文件,您必须手动调整开始位置。要编辑文件,您必须:


阅读PharLap的部分。
分别解密每个部分。
将所有内容写入新文件。
调整您想要的内容。
再次加密部分(这是XOR密钥,因此使用完全相同的算法)。
将加密的文件复制回主可执行文件。

关于#4的注释:您提到了更改播放器的名称。由于它是一个以零结尾的名称列表,因此您可以假设在其他位置有一个指向这些名称的指针列表。这意味着您只能更改名称的各个字符,而不能使其更长。如果要自由调整所有名称,则必须找到指针列表并进行调整。


(初步更新)


XOR编码不使用部分。取而代之的是,似乎每个块都以一个单词来确定其长度,可能还有1个或2个下一个单词(可能(再次)设置XOR键的起始位置)。到目前为止,尚无定论。
可执行文件数量很大,带有零。如果计算每个32字节块中的零个数,对所有32个可能的位置进行XOR运算,并打印出具有最高数量的XOR位置,则可以看到相同“最佳”猜测的连续列表。这表明存在更长和较短的部分,并且使用相同的密钥进行异或运算,这可能有助于确定长度算法。


782C0 : ..@...@,..@..Algeria@Ali Mehdaoui Igail@Mohammed Said@Abdel Dahb
78300 : i@Hamid Ahkmar@Nagar Baltuni@Omar Mahjabi@Ali Cherif@Hamar Mahbo
78340 : ud@Khered Adjali@Imahd Tasfarouk@Alamar Sahid@Mahmar Ahboud@Akha
78380 : r Binnet@Mouhrad Dahlib@Mahied Amruk@Lakhar Diziri@Amaar Azir@Mu
783C0 : stafa Farai@Akmar Bahoud@Ahmad Said@Taraki Aziz@Argentina@Alfio 
(etc.)


评论


那比我预期的要多得多。谢谢您为我节省了许多时间。在旅行中,我确实发现了可执行文件中包含了pklite之类的可能性,而且在最近搞砸了Scumm游戏之后,奇怪的是,我将XOR视为一种有效的加密机制。

–user11826
2015年3月7日在16:44

别客气!使用当今功能强大的计算机(包括很多事后分析)检查旧游戏几乎和玩它们一样有趣。我将仔细看一下PharLap的标题,距我上次看到它们已经有一段时间了。

–杂件
2015年3月7日在17:11

@Jongware:您把游戏藏在某个地方了吗,或者有可以下载的地方?阅读您的帖子让我想知道解密是在pharlab加载程序中进行还是在游戏本身中进行,以及是否有可能对32位部分进行解密并分配出加载程序的XOR-ing部分。

–贡特拉姆·布洛姆(Guntram Blohm)
2015年3月7日在19:19

@GuntramBlohm:它似乎被归类为“放弃软件”,当包含“ 1993”时很容易找到(但我想知道EA是否同意。尽管如此,我在Mac上,所以对我来说毫无用处。)Pharlap标头完全有效,但XOR方案不遵循各节。我认为这是一个方案,其中第一个单词指示每个连续块中加密字节的数量。

–杂件
2015年3月7日在20:34

我对此的最后评论:解码器位于PharLap可执行文件的末尾,并从其标头中的EIP开始。但是它也很模糊,无法清晰地分解。幸运的是,您不必掌握球员的名字。但是,要掌握名称指针列表并不容易(可能是紧随其后的数据)。另一个问题可能是PharLap标头包含校验和,并且更改数据可能会使可执行文件无效。

–杂件
2015年3月11日23:34

#2 楼

有一个ida插件可以连接到DosBox(补丁版),并允许您从ida调试DosBox游戏。但是,我怀疑您是否可以在ida的免费版本上使用它。

您的memdumpbin使用地址180:0的事实暗示游戏使用了dos扩展器,因此“真实”程序是在保护模式下运行的32位程序-180是dos扩展程序通常用于其32位段的段值。这就带来了另一个问题-IDA 5 free可以读取16位.exe(基本上是扩展程序)的dos部分,而不能读取32位(其格式称为LE)的dos部分。

但是,更老的IDA Free 4.1能够读取LE文件,并且仍在Internet上浮动(搜索idafre41.zip)。还有一个免费的dos扩展器DOS32A,其中包括一个工具(您需要下载源代码),该工具可将32位LE文件与16位扩展器分开。一年前,当我想调试类似的程序时,我能够使用DOS32A获取LE文件,将其加载到IDA 4.1中以获得IDA数据库,然后在IDA free 5.0中打开该数据库。 (我现在购买了IDA,这使我的生活变得更加轻松;尽管价格对于业余爱好者来说有点高,但我还是会推荐给任何人)

您可以在以下地址匹配地址您在IDA中找到了指向XREF的播放器名称,然后检查访问该地址的函数以写入内容,然后使用DOS32A中集成的调试器调试程序并验证播放器名称的写入位置,最后跟踪其源代码并修改它。但是,如果名称确实是在原始.exe文件中压缩的,则必须从程序集文本(可能是标准的也可能不是标准的文本)中确定压缩方案,然后找出如何根据到该方案,并希望新的字符串能够适合旧的压缩字符串使用的内存。

因此,您的任务并非易事,但您会在此过程中学到很多-祝您好运!