我一直在浏览一段我试图“改进”的电脑游戏代码。 (好吧所以也许我在游戏中很糟糕,但我还是想玩它)。您能否查看以下代码:
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(在第三步中)。
你能帮帮我吗?
答案 0 :(得分: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
答案 1 :(得分:2)
另一个补丁:
取代
fld dword ptr[ebp+00007B1C]
与
fld dword ptr[esp+64]
NOP
NOP
答案 2 :(得分:1)
刚刚结束第二个命令。也就是说,找出fsub命令占用的字节数,并用许多无操作字节码(0x90)覆盖它。