SearchForCheats.de.vu » Tutorials » Hacking Lesson #4: Was versteht der VBA?


Hacking Lesson #4: Was versteht der VBA?

Hm... hi Leute, mich gibt’s auch noch. Ich möchte mich an dieser Stelle mal eben bei Leanny bedanken, dass er die letzte Stunde übernommen hat. (Wird später hinzugefügt) Gleichzeitig möchte ich mich auch dafür entschuldigen, dass es bis zur Nummer 4 jetzt so lange gedauert hat.
Dennoch bin ich stolz darauf, gerade passend zu Ostern dieses Werk verbrochen zu haben - Die Lesson 4 *Fanfare*

...


Was? Ich hab genug angekündigt? Mhm... könnte sein... Also... wo soll ich anfangen? Heute behandeln wir das erste (und etwas einfachere) Code-Format. Nämlich das, das so aussieht (keine Angst, ist nur ein Beispiel): 02024afc:00 ... Und da beginnen die Probleme schon. Es ist unüblich, für ein spezielles Code-Format direkt einen Code anzugeben. Man benutzt stattdessen eine allgemeine Form. Die allgemeine Form für das Format da oben (wir nennen es ab jetzt VBA-Format) ist die Folgende:

8-Bit-Constant-Write
XXXXXXXX:YY

16-Bit-Constant-Write
XXXXXXXX:YYYY

32-Bit-Constant-Write
XXXXXXXX:YYYYYYYY

Buaaaargh... wer hat das verstanden? Ich nicht... Naja... Vielleicht doch. Ich erklärs mal.

  • 8-Bit-Constant-Write
    Ah... klingt toll! Kann man das essen? Wir gehens mal langsam an. 8-Bit dürfte nach den Letzten Stunden klar sein... 8 Bit entsprechen einer Byte und geben die Länge eines (geschriebenen) Wertes an. Wenn wir jetzt kurz in unserem Gedächtnis kramen, fällt uns auch vielleicht wieder ein, dass eine Byte den Wert 0-dec – 255-dec erhalten kann... Das sind 0x00 - 0xFF, genau zwei Stellen. (YY... Vielleicht kann man damit ja was anfangen?) Nächstes Wort: Constant... Jaaa... Constant gibt an, dass der Wert „konstant“, also dauerhaft geschrieben wird. Wobei zu erwähnen ist, dass sich das „Constant“ auf die Länge einer „Session“, also zwischen dem Zeitpunkt des An- und Ausschaltens des AR’s, bezieht. Prinzipiell bleibt der Wert sogar danach noch im RAM stehen, nur ist ab dann nichtmehr gewährleistet, dass sich der Wert auch nichtmehr verändert – er könnte ja vom „Spiel“ (dem ROM) geändert werden. Write steht simpler Weise einfach nur für „Schreiben“. Zusammengefasst bedeutet das: 8-Bit-Constant-Write schreibt für eine AR-Session dauerhaft einen Wert der Länge 8-Bit in den Memory. (Nur so... Memory = RAM)
  • XXXXXXXX:YY
    Hier gibt man das generelle Aussehen eines Codes an. Es ist sozusagen der „Syntax“ eines Codes. Für gewöhnlich bedeutet X hierbei immer Adresse und Y steht für Wert. Mit diesem Wissen können wir jetzt also den Syntax genauer auseinandernehmen: X steht für Adresse, also ist gemeint, dass hier in unserem Code 8 Stellen Platz für eine Adresse ist. Ein einzelnes X kann hierbei für eines der Hexadezimal-Zeichen stehen. Zu beachten ist, dass der zu schreibende Wert byteweise "reversed" werden muss. Das heißt, der Wert, den wir zuletzt schreiben, wird als erstes vom VBA (oder AR) geschrieben werden. Bei 8-Bit-Constant-Write ist das noch zu vernachlässigen, allerdings muss der zu schreibende Wert bei 16 oder gar 32 Bit umgekehrt werden. Es ist noch anzumerken, dass bei Nichtausreichen der Adressenlänge einfach links der freie Platz mit 0en gefüllt wird. Wenn deine Adresse zu lang ist, weißt du, dass du generell irgendwas falsch gemacht hast. ;-) Nun denn... Hier ein paar Fragen zum obigen Absatz:
    Was steht bei den Adresse-Xen wenn du nach 0x23588F schreiben willst? ( 002358FF ; Die Adresse ist zu kurz, wir müssen zwei 0en einfügen (Achja... das 0x ist nur ein Vorzeichen von Hex. Aber das weißt du ja hoffentlich noch.))
    Und was weißt du, wenn du versuchst an Adresse 0xF532CB45AD zu schreiben? (Du weißt, dass du irgendwas falsch gemacht hast, weil die Adresse mehr als 8 Zeichen hat)
    Gut. Die Xe sollten jetzt klar sein. Aber was ist mit den Ys? (Yps ^^) Die Y’s (auch Gott, sieht das bescheuert aus...) geben – wie unschwer zu erraten ist – den Wert an, der geschrieben werden soll. Jetzt erinnere dich nocheinmal zurück an das lustige 8-Bit-Constant-Write ... Dort habe ich gesagt (geschrieben?), dass auf genau eine Byte, also 2-Hex-Stellen geschrieben wird. Das gibt das YY an... 2 Stellen, an die geschrieben wird. Garnicht so schwer, oder?
  • 16-Bit-Constant-Write
    Na? Dreimal darfst du raten! Alles genau so wie beim 8-Bit-Constant-Write, nur dass hier gleich 2 Byte, also 4 Zeichen (oder 16 Bit, wie du willst) geschrieben werden.
  • XXXXXXXX:YYYY
    Erklärung siehe oben, nur dass eben auch hier 16-Bit (wieder 4 Hex-Stellen) geschrieben werden.
  • 32-Bit-Constant-Write
    Die längste Möglichkeit, Daten auf einmal in den RAM zu hämmern. 32 Bit entsprechen 4 Byte oder 8-Hex-Zeichen. Man schreibt ein sogenanntes „Word“ in den Memory.
  • XXXXXXXX:YYYYYYYY
    Das allgemeine Format um im VBA 32 Bits Daten zu schreiben, der Doppelpunkt kommt immer zwischen Wert und Adresse

Das war das erste Code-Format... Ein Beispiel dafür:
Wir wollen an 0x02025534 den Wert FF1E schreiben. Der Code, im VBA-Format lautet: 02025534:1EFF und zwar deswegen, weil Werte "von hinten" geschrieben werden, wie ich gar nicht oft genug sagen kann. Wir müssen also die Byte, die zuerst geschrieben werden soll (in unserem Fall FF), an die letzte Position stellen.Aber jetzt erstmal zwei kurze Einschübe.

    Was war das mit dem „Word“?
    Eine klassische Bezeichnung für eine Ansammlung von Zahlen. Ich führe mal eben 3 neue Begriffe ein, ok? Alles was in einer Linie steht, hat die selbe Bedeutung.
    8-Bit          1 Byte          Byte           YY           Byte
    16-Bit         2 Bytes         Halfword       YYYY         Wort
    32-Bit         4 Bytes         Word           YYYYYYYY     Doppelwort
    Genau... Byte, Halfword und Word werden sehr oft im Englischen verwendet. Und Englisch sollte man zumindest ein bisschen verstehen, wenn man sich mit dem Thema Code-Hacking auseinandersetzt. Die Drei Begriffe sind einfach nur die Synonyme für 1, 2 und 4 Byte(s). Zu beachten ist die Tatsache, dass das "Word" keinesfalls 1:1 ins Deutsche übersetzt werden kann. Im Deutschen spricht man hier von einem "Doppelwort". Das selbe gilt für "Halfword", welchen im Deutschen einfach ein Wort ist. Dies soll obige Tabelle verdeutlichen.

    Was tun... wenn der Wert zu lang ist?
    Das ist auch ein klassisches Problem. Angenommen, wir wollen in unserem Beispiel den Wert 0x123456789ABCDEF0 (selten so einen komischen Wert gesehen...) an die Adresse 0x020271DB schreiben. Dann haben wir erstmal das Problem, dass wir Werte > 32-Bit (noch) nicht schreiben können. Dies ändern wir jetzt. Zur Verdeutlichung sehen wir uns mal an, was hier im Memory steht.
    Ansicht: [ ] 8-Bit          [ ] 16-Bit           [x] 32-Bit
    020271DB          1DF33C9D 789CC8FB 0055F392
    020271E7          C0C0C0FF 745FC4BA 94D37EEE
    020271F4          726DB374 45168952 123A132E
    Die Zahlen sind rein zufällig gewählt. Nach unserer kleinen Schreibe-Aktion soll es dort folgendermaßen aussehen:
    Ansicht: [ ] 8-Bit          [ ] 16-Bit           [x] 32-Bit
    020271DB          12345678 9ABCDEF0 0055F392
    020271E7          C0C0C0FF 745FC4BA 94D37EEE
    020271F4          726DB374 45168952 123A132E

    Die ersten beiden Words sind wichtig. Wir haben also die ersten 64 (2 Words, also 2 * 32) Bit überschrieben. Unser erster Code sollte klar sein. Das ist dein Part... Wie heißt der erste Teil um die ersten 32 Bit zu schreiben? (Reversen nicht vergessen!) (020271DB:78563412)
    Das war ja nicht so schwer, oder? Jetzt geht es aber hinter dem Wert noch weiter... Was machen wir da jetzt? ... Ganz einfach! Unabhängig davon, ob unser erster Code steht oder nicht, können wir ja einfach einen zweiten Code dazuschreiben! *gedankenblitz* Der Wert ist einfach fortgesetzt nach unserem ersten Teil. Also 0x9ABCDEF0 ... Wieder 32 Bit... Aber was ist mit der Adresse?
    020271DB          12345678 9ABCDEF0 0055F392 Adresse          B1B2B3B4 B5B6B7B8 B9BABBBC
    Bx = Byte x
    Nicht verzweifeln! Ich habe nur eben eine Legende geschrieben. Sozusagen zur Orientierung. Bx steht dabei für jeweils eine Byte. (Habe sie einfach durchnummeriert...) Jetzt müssen wir einfach die Offset-Adressen schön durchzählen, und die Sache hat sich erledigt!
    020271DB     Byte1:      12
    020271DC     Byte2:      34
    020271DD     Byte3:      56
    020271DE     Byte4:      78
    020271DF     Byte5:      9A
    020271E0     Byte6:      BC
    020271E1     Byte7:      DE
    020271E2     Byte8:      F0
    020271E3     Byte9:      00
    020271E4     Byte10(A):  55
    020271E5     Byte11(B):  F3
    020271E6     Byte12(C):  92
    "Waaaaah... was hatter den jetzt schonwieder gemacht???" ;-) Ganz einfach. Ich habe die beiden Words, die wir schreiben wollten, in 8 Teile geteilt. Jeweils bei vollständigen Bytes. Die Bytes 9 – 12 stehen da nur der Vollständigkeit halber und könnten ignoriert werden. Was ich dir damit vor Augen führen will: Wir sehen aus dem Beispiel von oben heraus, welche Adresse unsere Words haben. Das erste Word steht bei 0x020271DB . Und das zweite Word steht 4 Bytes dahinter. (Warum 4 Bytes? 1 Word = 32-Bit = 4 Byte) Also beginnt mit Byte5 ein neues Word. Unser erster Zweizeiler muss also folgendermaßen lauten:
    So... jetzt üben wir das mal ein bisschen... Gesucht sind immer fertige VBA-Codes (Wohlgemerkt VBA! Wir machen bis jetzt immernoch nur die blöden VBA-Codes!) Für die Lösung - wie immer - einfach den Klammerinhalt markieren...

    Du willst an die Adresse 0x20356AB den Wert 0xCB schreiben. (020356AB:CB)
    Schreibe ein beliebiges Halfword an die Adresse 0x20FF3CC. (020FF3CC:C0DE ; Der hintere Wert ist frei wählbar, solange er 4 Zeichen aufweist und in Hex ist, stimmt’s!)
    Adresse 7825319 soll den Wert 0x11 erhalten. (007767A7:11 ; Nicht verstanden? Der erste Wert ist ein Dezimal-Wert! (Das 0x fehlt) Deswegen musst du ihn erstmal umrechnen!)
    Ein beliebiges Word soll an eine beliebige Adresse geschrieben werden. (Denk dir was aus... Solange zwei mal 8 Hex-Zeichen stehen, ist die Sache richtig.)
    Jetzt noch etwas Schwereres: Schaffst du es, unseren Code von oben so umzuschreiben, dass nicht 2 Words, sondern 4 Halfwords geschreiben werden?
    (020271DC:3412
    020271DE:7856
    020271E0:BC9A
    020271E2:DEF0
    )
    Wer hier mehr als 2 Aufgaben falsch hat, sollte sich nocheinmal die vorherigen Lessons anschauen.

    Anmerkung zum Schluss noch: Wer hier etwas deutlich zu schwer findet, der sagt das bitte, ich weiß nicht wie ihr mit der Geschwindigkeit zurechtkommt.

"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