我是逆向工程的新手,但我确实理解汇编代码。但是,我面临一个问题。
它是关于一个旧的 Rockstar 游戏,“恶霸:奖学金版”(2007 年发布 - 又名“Canis Canem Edit”)。但是,它在我目前拥有的 Windows 10 周年纪念版操作系统上执行存在问题。这是预期的,因为它是一个旧软件。为了解决这个问题,我尝试了许多在线解决方案(兼容模式、设置 CPU 关联等),但都没有太大帮助。
所以我决定使用 OllyDbg 来研究代码。崩溃的原因相当稳定。访问冲突。然而,这纯粹是随机的。我可以毫无问题地玩一个小时,或者在 10 分钟内遇到崩溃。该程序显然试图将数据从地址 0 移动到寄存器,这是不允许的。异常总是在指针调用发生的同一个地方抛出。
下面是 OllyDbg 调试程序时的截图。(抱歉分辨率太低,游戏老了,所以分辨率设置为1280x960)
在0088729D
具有此指令的地址处引发异常
MOV ECX, DWORD PTR DS:[EAX]
EAX 寄存器显然是空的(您可以在图像中看到)。所以我检查了信息何时移至该寄存器。它发生在地址处(我选择了该行并添加了注释“移动空地址”)00887281
。它包含以下指令:
MOV EAX, DWORD PTR SS:[ESP+8]
据我所知,SS是堆栈段寄存器和ESP扩展堆栈指针。ESP 寄存器包含地址0019F3A0
。偏移量为 8 时,地址现在为0019F3A8
(请参阅右下框中的选择)。它包含00002000
.
在这之后我现在一无所知。我不明白为什么通话期间的地址为零而不是那个值。我希望 EAX 寄存器将包含00002000
在指令之后。然而,这一次并非如此。EAX 寄存器包含00000000
.
我相信我错误地解释了这一点。有人可以指出我误解发生的地方或告诉我如何更正确地检查这个问题吗?
谢谢你。
PS:之所以会这样,是因为我小时候玩过恶霸,想再玩一次。显然,即使在网络上尝试了已知的解决方案之后,仍有其他用户遇到同样的问题。也许如果我为此找到了一个可靠的解决方案,我也可以帮助其他人。