2

我一直在查看我试图“改进”的一段电脑游戏代码。(好吧,也许我对游戏很烂,但我仍然想玩)。您能否查看以下代码:

fld dword ptr[ebp+00007B1C]
fsub dword ptr[esp+64]
fst dword ptr[ebp+00007B1C]
call 004A2E48

此代码每秒调用一次,用于关卡倒计时。我需要在一个特定的水平上停留几分钟。如果我可以修改上面的代码,使推入地址 [ebp+00007B1C] 的值为 0,那么游戏关卡将永远超时,这样我就可以不用玩那些疯狂的“生存”小游戏了。

我将解释我从这段代码中理解的内容。不用担心,您不必深入研究。第一行中,我们得到计时器值。例如,如果还剩 97 秒,则在此处加载此值。
第二行中,从 97 中减去一个值(1 秒)。
第三行中,96 再次移动到内存中。最后我们有一个函数调用,它将根据剩余时间进行其他处理。

现在我需要做的就是以某种方式修补这段代码,以便推送的值为 0(在第三步中)。
你能帮我解决这个问题吗?

4

3 回答 3

4

代替

fld dword ptr[ebp+00007B1C]
fsub dword ptr[esp+64]

fldz ; Push zero on to top of floating point stack
nop ; From the end of the fldz to the beginning of the store instruction
于 2009-09-30T19:53:20.573 回答
2

另一个补丁:
替换

fld dword ptr[ebp+00007B1C]

fld dword ptr[esp+64]
NOP
NOP
于 2009-09-30T20:17:58.980 回答
1

只需 nop 出第二个命令。也就是说,找出 fsub 命令占用了多少字节,并用那么多无操作字节码 (0x90) 覆盖它。

于 2009-09-30T19:22:40.310 回答