Question

Je l'ai regardé à travers un morceau de code d'un jeu PC que je suis en train de « améliorer ». (Ok alors peut-être que je suce au jeu mais je veux encore jouer). Pourriez-vous s'il vous plaît examiner le code suivant:

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

Ce code est appelé à chaque seconde pour le compte à rebours de niveau. Je dois rester sur un niveau particulier pendant quelques minutes. Si je peux modifier le code ci-dessus afin que la valeur poussée dans l'adresse [ebp + 00007B1C] est 0 alors le niveau de jeu sera toujours temps et il me sauvera jouer les fous minijeux « survie ».

Je vais vous expliquer ce que je comprends de ce code. Ne vous inquiétez pas, vous n'avez pas d'aller en profondeur dans ce. Dans la première ligne nous obtenons la valeur de la minuterie. Par exemple, si 97 secondes sont restantes alors il est ici que cette valeur est chargée.
Dans le seconde ligne une valeur (1 seconde) est soustrait de 97.
Dans le troisième ligne 96 est à nouveau déplacé vers la mémoire. Enfin, nous avons l'appel de fonction qui va faire d'autres traitements en fonction du temps restant.

Maintenant, tout ce que je dois faire est rustine ce morceau de code en quelque sorte de sorte que la valeur qui est poussé est 0 (dans la troisième étape).
Pouvez-vous s'il vous plaît me aider avec ça?

Était-ce utile?

La solution

Remplacer

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

avec

fldz ; Push zero on to top of floating point stack
nop ; From the end of the fldz to the beginning of the store instruction

Autres conseils

Un autre patch:
remplacer

fld dword ptr[ebp+00007B1C]

avec

fld dword ptr[esp+64]
NOP
NOP

Il suffit de nop la deuxième commande. Autrement dit, savoir combien d'octets la commande FCaisson prend et le remplacer avec autant

bytecode sans opération (0x90).
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top