SearchForCheats.de.vu » Tutorials » Hacking Lesson #2: Theorie & Praxis


Hacking Lesson #2: Theorie & Praxis

Schön, dich wieder zu sehen! Ich hoffe du bist dir noch im Klaren was 0x64 in dezimal ist? Und warum 10 gleich 2 ist? Gut...
Heute werden wir unseren ersten Wert pushen... *Dramatisch schau*

Was wir dazu im Wesentlichen machen, sollte jedem klar sein:

  • Wert suchen
  • Wert überschreiben

Klingt ganz einfach, hm? Also zu Schritt 1... Den Wert finden... Öffne einmal die ROM, die du hacken willst. (Wir nehmen hier der Einfachheit halber Pokemon Saphir, da Nintendo zu den Zeiten noch nicht so gemein zu Hackern war wie beispielsweise bei Emerald)
Ich denke, du hast jetzt das Problem, dass du in deinem Spiel noch nie einen Hexadezimal-Wert gesehen hast? Das können wir ändern. Klicke nach Laden der ROM einmal auf „Tools“ > „Memory Viewer“. Woooooow... Da sind sie also. Die Values... Du kannst dich im RAM, den du jetzt betrachtest, (wir nennen das ab jetzt so!) einmal genauer umsehen. Wie du vielleicht bemerken wirst, hast du auf den RAM freien Schreibzugriff und du kannst ganz nach Belieben darin schreiben. Nur wirst du so nicht besonders erfolgreich sein, wenn du einen bestimmten Wert suchst. Wir brauchen also ein System, mit dem wir die richtige Adresse einer Byte finden. Dazu benutzen wir die Suchfunze. Was sie in etwa macht, erkläre ich dir, nachdem du mal auf „Search for Cheats“ (Keine Werbung! ^^) geklickt hast. Folgendes Fenster öffnet sich:

Suchfunktion

Hmja... Die einzelnen Abschnitte:

  • In dem großen Fenster oben werden nachher unsere Suchergebnisse angezeigt. Dort steht bereits, wie du siehst, „Address“ (Adresse) und „Value“ (Wert) ...
  • „Search-Type“ (Suchart)
    Hier wird definiert, ob du den Wert der Adresse, die du suchst, kennst oder nicht.
  • “Data Size“ (Datengröße)
    Hier wird angegeben, wie groß die Datenmenge ist, die wir suchen. Um das etwa einschätzen zu können, musst du bedenken, dass 8Bit den maximalen Wert von 255, 16Bit den maximalen Wert von 65535 und 32Bit den maximalen Wert 4294967295 hat.
  • “Signed/Unsigned“
    Hm... Hier wird definiert, nach welcher Art von Zahlen du suchst. „Unsigned“ lässt das Vorzeichen ignorieren, „Signed“ setzt es. Die Sache mit den Vorzeichen kommt erst viiieeel später... Dann gibt es noch das Gebräuchlichste, nämlich „Hexadecimal“. Damit wird definiert, dass du nach Hex-Werten suchst. (Signed und Unsigned suchen Dec)
  • “Update Values“ (Werte aktualisieren)
    Diese Funktion erleichtert manchmal die Suche ein bisschen. Sie bewirkt, dass die Adressen, die oben angezeigt werden (später) immer gleich den aktuellsten Wert anzeigen. Es ist nützlich, also: Immer aktivieren...
  • “Enter Value“ (Wert eingeben)
    Dieses Feld kann nur bei „Bekannter Wert“ verwendet werden. Hier schreibt man den Wert der Adresse, die man sucht, auf.
  • “Compare Type“ (Vergleichsart)
    Die größte und wichtigste Funktion. Hier wird definiert, wie sich dein unbekannter Wert ändert. Wenn du nach bekannten Werten suchst, wirst du meistens den „Equal“ Type brauchen. Aber um es mal zu verdeutlichen, was hier passiert, schreibe ich mal ein kleines Beispiel:

    Im Speicher steht an irgendeiner Stelle:

    0x02024530         00 00 C5 78 FF 3C 91 00 BA E7
    0x0202453A         FF FF 23 58 5A 35 44 BC 01 7A

    NEIN! Nicht durchdrehen! Das sind zufällig gewählte Werte! Du musst nicht verstehen, warum gerade das da stehen soll... Also das ist aus irgendwelchen Gründen in unserem Memory und wir initialisieren die Suche, indem wir auf „Start“ klicken. Wir sind immernoch auf der Suche nach unbekannten Werten! Wie dem auch sei... zu späterer Zeit steht dann im Memory (sagen wir mal) Folgendes:

    0x02024530         00 00 AA 00 FF FF 9A 00 91 E7
    0x0202453A         FF FF 23 58 5C 35 00 00 01 7A

    Jetzt erkläre ich mal, welche Adressen angezeigt werden, jenachdem, welchen Suchtyp man bestimmt hat.

    • Equal
      0x02024530          00
      0x02024531          00
      0x02024534          FF
      0x02024537          00
      0x02024539          E7
      0x0202453A          FF
      0x0202453B          FF
      0x0202453C          23
      0x0202453D          58
      0x0202453F          35
      0x02024542          01
      0x02024543          7A
      Hier würde die Suche diese Werte ausspucken. Es werden also beide Memory-Dumps überprüft und dann werden alle Adressen angezeigt, die deinem Suchkriterium entsprachen. In unserem Fall war es „Gleich“, deswegen wurden alle Adressen, deren Wert sich nicht verändert hat, angezeigt. (Wer nicht weiß, wie ich auf die geschriebenen Adressen komme: Einfach die Bytes durchzählen. Die Adresse, die zu Beginn einer Zeile steht, ist die der ersten in der Linie befindlichen Byte. Zählen selbstverständlich in Hex. ^^)

    • Not Equal
      0x02024532          AA
      0x02024533          00
      0x02024535          FF
      0x02024536          9A
      0x02024538          91
      0x0202453E          5C
      0x02024540          00
      0x02024541          00
      So bekommst du also alle Adressen, deren Wert sich geändert hat. (Not Equal)

    • Less Than
      0x02024533          00
      0x02024538          91
      0x02024540          00
      0x02024541          00
      Jetzt kommen alle Adressen zutage, deren Wert kleiner geworden ist. Diese Funktion benutzt du, wenn du zum Beispiel nach der Adresse der gegnerischen Energie suchst. Da siehst du auch nur einen Balken, der kleiner wird, wenn du dem Gegner Schaden zufügst.

    • Less or Equal
      0x02024530          00
      0x02024531          00
      0x02024533          00
      0x02024534          FF
      0x02024537          00
      0x02024538          91
      0x02024539          E7
      0x0202453A          FF
      0x0202453B          FF
      0x0202453C          23
      0x0202453D          58
      0x0202453F          35
      0x02024540          00
      0x02024541          00
      0x02024542          01
      0x02024543          7A
      Dieses Mal liefert die Suchfunze alle Werte, die gleich geblieben sind oder kleiner geworden sind... Entspricht also dem mathematischen Zeichen <=

    • Greater Than
      0x02024532          AA
      0x02024535          FF
      0x02024536          9A
      Na was wohl?? Alle Adressen deren Wert größer geworden ist, erscheinen.

    • Greater or Equal
      0x02024530          00
      0x02024531          00
      0x02024532          AA
      0x02024534          FF
      0x02024537          00
      0x02024535          FF
      0x02024536          9A
      0x02024539          E7
      0x0202453A          FF
      0x0202453B          FF
      0x0202453C          23
      0x0202453D          58
      0x0202453F          35
      0x02024542          01
      0x02024543          7A
      Entspricht dem mathematischem Zeichen >= Alle Werte, die größer geworden oder gleich geblieben sind, werden angezeigt.

Uff... fertig mit Erklären. *Figerrauchen*

Wir können also mit der Suchfunktion alle erdenklichen Werte finden, indem wir unseren unbekannten Wert, der durch einem bekannten Operator bearbeitet wurde, finden.
Sprich: Wenn wir wissen, dass der Wert (die Energie) weniger geworden ist, können wir alle Adressen, deren Werte größer oder gleich geblieben sind, ausschließen. Fangen wir doch mal an... Wir suchen einen Code, der unser Pokémon unsterblich macht.

    Einschub:
    Jaja, es ist mir klar, dass jetzt wieder ein paar ROM-Hacker daherkommen und Bedenken gegen diesen Code aussprechen. Das ist auch richtig. Per RAM-Write ist dieser Code einfach zu buggy. (Oder, um mal pika zu zitieren: "Ich würde den Code nicht als "falsch" ansehen. Er tut im Wesentlichen das, was man von ihm verlangt, hat aber Nebenwirkungen und ist daher suboptimal und verdient Verbesserung - aber solange noch keine bessere Variante zur Verfügung steht, ist diese variante passabel.") Ich würde ihn auch per ROM-Write machen. Trotzdem ist er am besten als Einsteigerbeispiel zu gebrauchen. Also: Mowl & STFU and so on...

Is irgendwas? ... Ich hab nix, gesagt. Einfach ruhig bleiben ^^ Sooo... Nimm mal ein beliebiges Pokemon, das du „unsterblich“ machen willst, an die erste Stelle deines Teams. (Ich setze mal vorraus, dass du einigermaßen mit dem Spiel „Pokémon“ umgehen kannst...) Lass dich in einen Kampf verwickeln und drücke, sobald die KP geladen wurden [Strg + C] um die Suchfunze aufzurufen. Was wir einstellen ist Folgendes:

  • Um uns die Umrechnerei nach Hex zu sparen, suchen wir im „Unsigned“ Modus
  • Unser Wert ist bekannt, „Specific“
  • Wir suchen, nach einem ... Ja wonach denn? Zur Antwort markieren.
  • (16-Bit-Wert, da Pokemon ja mehr als 255 KP haben können)
  • Mein Zigzachs hat gerade im Moment 15KP. Also tippe ich in die Zeile unten „15“ ein. Du nimmst deinen Wert.
  • „Update Values“ is immer gut... ^^
  • „Compare Typ“ ist natürlich „equal“, gleich ( KP = 15)

Das sieht dann also so aus:

Screenshot der Einstellungen

Jetzt noch ein beherzter Klick auf „Start“ und dann auf „Search“ und schon wird der gesamte Memory nach deinem Wert gescannt. Eventuell öffnet sich folgendes Fenster:

Zu viele Ergebnisse

Das bedeutet schlicht und einfach, dass zu viele Adressen deinen Wert enthalten. Du musst also weitersuchen und das Offset näher spezifizieren. Dazu lässt du dir ein paar KP abziehen. Sobald der Wert feststeht, drückst du wieder [Strg + C] um die Suche zu öffnen. Du lässt alle Einstellungen gleich, außer dass du in die Linie unten den neuen Wert eintippst. Bei mir wäre das jetzt 9. Nach einem Klick auf „Search“ sieht die Sache schon recht ordentlich aus. (Zumindest bei mir...) Sollten bei dir immer noch zu viele Adressen angezeigt werden, so wiederholst du den Vorgang einfach mehrere Male. Zum Schluss solltest du noch zwei Offsets (=Adressen) übrig haben. Hm... 2 Adressen... Eine richtig, eine falsch... Wähle per Zufallsprinzip eine der Adressen. Klicke danach unten auf „Add Cheat“. Ein Fenster öffnet sich.
Code hinzufügen

  • Address: Hier steht deine Adresse drin, die du pushen willst
  • Value: Der Wert, auf den die obenstehende Addresse gebracht werden soll. Ich habe mal 900 gewählt.
  • Description: Die Beschreibung zu deinem Code. Nach einer gewissen Zeit braucht man das nicht mehr, aber am Anfang ist die Funktion ganz gut, um den Überblick zu bewahren.

Klicke zweimal auf OK und du bist wieder im Spiel. Und... es passiert... NICHTS! Anscheinend zumindest... Was ist passiert? Haben wir uns "verhackt"? Habe ich mal wieder Scheisse verzählt? Will uns das Spiel verarschen???

[...]

Letzteres trifft zu. ^^ Da Pokémon ein recht aufwändiges Spiel ist, werden die Werte nicht alle Nasen lang aktualisiert. Wenn du mal kurz ins Pokemonmenü und wieder zurück gehst, wirst du feststellen, dass deine KP auf einen dir sehr vertrauten Wert gestiegen sind. Woher ich weiß, warum du nicht durch Zufall die falsche deiner beiden Addressen genommen hast? Ganz einfach: Beide Addressen enthalten den richtigen Wert. Warum das so ist, wirst du in einer späteren Lesson noch erfahren.

Fertig? Ende gut, alles gut? Nein... Leider nicht. Denn die KP verhalten sich mit aktiviertem Cheat sehr seltsam... Zum Beispiel zieht jede Attacke genau so viel KP ab, wie du maximal haben kannst. Und wenn du angegriffen wirst, steigen deine KP manchmal... Wie du schon siehst, ist der Code nicht besonders toll. Das ist auch der Grund, warum dieser Code eigentlich nicht so machbar ist, da manchmal (bei zu heftigen Schlägen) mit deinem Pokémon seltsame Sachen geschehen. So einen Code würde jemand also sofort wieder verwerfen, denn wer weiß, was ein so kleiner Code für Fehler verursachen kann???? Deshalb die vorherige Anmerkung über das ROM-Hacking...
Nichtsdestotrotz solltest du deinen Erfolg genießen. Öffne einmal die Cheatliste unter „Cheat List“ im Menü um das nächste Problem zu sehen. ^^ Da steht euer Code. Aber er sieht ziemlich seltsam aus. In etwa so:

XXXXXXXX:YYYY

Das Action Replay könnte solch einen Code nicht lesen. Tatsächlich ist das aber ein Feature. Hier steht so ziemlich direkt, was der Code macht. XXXXXXXX gibt dabei unsere Adresse an und YYYY den Wert, den wir geschrieben haben. (Hex) Lege dir ein *.txt File an und notiere dort deinen Code + Bezeichnung. Du wirst ihn noch brauchen. Puh... Ganz schön anstrengend, hm? Immerhin sind wir jetzt fertig.

"Hausaufgabe":
Wie lautete eigentlich das Offset, das du oben gefunden hast?
(0x02024AA8 ist das gebräuchlichere, da man immer lieber Adressen nimmt, die mit 0x02 beginnen. Das andere Offset ist 0x030043C6)

Vielleicht hast du ja jetzt eine Idee, wie du das Gegnerische KP Offset findest. (Per unbekannte Suche) Das machen wir zwar erst nächste Stunde, aber vielleicht findest du es?
(0x03004626)

Per Bekannte Suche kannst du auch das Offset für die AP finden. Wie lautet es?
(0x02024AA4)

"Pokémon" ist ein eingetragenes Warenzeichen der Firma Nintendo
"Action Replay" ist ein eingetragenes Warenzeichen von Datel Interact.
© www.SearchForCheats.de.vu by Mastermind_X
© 2006 - 2008