Вы можете помочь с этим ассемблерным кодом?


Я просматривал фрагмент кода компьютерной игры, который я пытаюсь "улучшить". (хорошо, может быть, я отстой в игре, но я все еще хочу играть в нее). Не могли бы вы заглянуть в следующий код:

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 (на третьем шаге).
Не могли бы вы помочь мне с этим?

3 2

3 ответа:

Заменить

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

Еще один патч:
заменить

fld dword ptr[ebp+00007B1C]

С

fld dword ptr[esp+64]
NOP
NOP

Просто не выполняйте вторую команду. То есть, выясните, сколько байт занимает команда fsub, и перепишите ее таким количеством байт-кодов без операций (0x90).