(Je m'excuse si c'est le mauvais endroit pour demander cela. Je pense que c'est vraiment une programmation connexe, mais si cela appartient à un autre site s'il vous plaît laissez-moi savoir)
J'ai grandi en jouant à Pokémon Rouge et Bleu, les jeux qui ont été très amusant, mais sont un peu tristement célèbre pour avoir de nombreux exploitable pépins (voir, par exemple, cette ridicule speedrun du jeu qui utilise de corruption de la mémoire à son tour l'élément de l'écran dans un éditeur hexadécimal).
Récemment, j'ai trouvé un intéressant speedrun du jeu qui utilise un glitch appelé le "ZZAZZ glitch" de corrompre important emplacements de mémoire et de laisser le lecteur presque immédiatement gagner le jeu. Selon l'auteur, la description de la speedrun, le ZZAZZ glitch fonctionne comme suit:
Pour démarrer un Entraîneur de bataille, le jeu doit charger un grand nombre de données, tels que [...] l'argent qu'il va céder en cas de défaite. Lors du chargement de l'argent est là que les choses peuvent vraiment moche. Pour des raisons qui sont hors de moi, de l'argent est stockée dans une manière complètement différente, le jeu utilise une structure de données de trois octets et au lieu de convertir la valeur en binaire, il les stocke dans "l'homme" de la représentation. Par exemple, $123456 est stockée en tant que 0x123456 au lieu de 0x01E240, la conversion correcte.
[Certaines entrées non valides dans le Formateur table] point d'emplacement non valide de l'argent de données. Quand le jeu tente d'effectuer des opérations avec ces données dans ladite structure, il va de noix et commence à écraser une énorme partie de la mémoire RAM. Plus précisément, pour chaque bloc de trois octets, deux d'entre eux contiennent 0x9999 (le montant maximum d'argent qu'un formateur peut donner). Ce schéma se répète de nombreuses fois par le biais de RAM. Pour voir ce mieux, je recommande la mise en pause de la vidéo sur l'émulateur après la ZZAZZ formateur est confronté et de définir VBA mémoire du spectateur à 0xD070.
Cette analyse du sens, mais comme je suis programmeur, je ne peux pas aider mais se demander comment sur la terre que les programmeurs écrit le code qui permettrait de rendre cela possible. Aucune approche que je peux penser pour écrire une fonction qui convertit en hexadécimal codé nombre décimal à virgule serait jamais démarrer le remplissage aléatoire de blocs de mémoire avec 0x9999 si l'entrée n'était pas une hexadécimal valide codé nombre décimal.
Ma question est, sans précisément, la conception de l'algorithme à l'échec de cette façon, est-il une simple mise en œuvre d'une conversion de l'hexadécimal codé en décimal à virgule que pourrait entraîner ce genre de corruption de la mémoire lorsque la fed à une valeur non valide?
Encore une fois, si c'est hors-sujet, toutes mes excuses. Mes pensées sont que d'autres programmeurs sur ce site peuvent avoir grandi en jouant à ce jeu, et ça sonne comme un exercice intéressant dans la rétro-ingénierie pour essayer de comprendre comment un glitch comme cela pourrait être possible.