SearchForCheats.de.vu » Tutorials » Hacking Lesson #6: Matheunterricht, Teil 1


Hacking Lesson #6: Matheunterricht, Teil 1

Steckt die Emulatoren weg! Schließt eure Memory Viewer! Macht ARCrypt erstmal zu! Heute werden wir eine absolut langweilige trockene theoretische Stunde machen.


...

[...]

Immernoch da?
Ich hatte gedacht, dass jetzt wirklich keiner mehr interessiert ist. Aber gut. Dir sagt vielleicht der Begriff "Operatoren" was. Ein Operator verändert einen Wert, der übergeben wird, mit einem weiteren gegebenen Wert (Parameter) auf bestimmte Weise. ( @_@ Nicht verzweifeln... Der Lichtblick kommt gleich...)

Ein einfaches Beispiel für einen Logischen Operator ist "+" . (Wir erinnern uns an unsere Grundschulzeit...)
Also.. Irgendwann mal, bevor der Taschenrechner uns komplett verdorben hat, wussten wir mal, dass man mit "Plus" einen übergebenen Anfangswert durch einen bestimmten zusätzlichen Wert auf ganz bestimmte Weise, nämlich hinzuzählen, verändern kann. Mit anderen Worten:

1 + 1 = 2

Nachdem diese unlösbare Schwierigkeit überwunden ist, kommen uns vielleicht spontan noch ein paar weitere Begriffe in den Sinn. "Minus" sollte da auftauchen... "Geteilt" wird euch ein Begriff sein... "Mal" wird euch bekannt vorkommen...
STOPP! Das alles sind Grundschulausdrücke. Bringen wir die doch mal auf ein gehobeneres Niveau.

  • "+" = "Addition"
    Summe = Summand 1 + Summand 2 + ... (Beliebig fortführbar)
  • "-" = "Subtraktion"
    Differenz = Minuend - Subtrahend 1 – Subtrahend 2 - ... (Beliebig fortführbar, zumindest erstmal... das ändert sich noch früh genug... ^^)
  • "*" = "Multiplikation"
    Produkt = Faktor 1 * Faktor 2 * ... (Beliebig fortführbar)
  • "/" = "Division"
    Quotient = Dividend / Divisor

Gut. Ab jetzt will ich von "Mal", "Wegnehmen" oder "Teilen" nichts mehr hören. Wir verwenden stattdessen immer schön die Ausdrücke der Arithmetik.
Das waren jetzt vier logische Operatoren. Ich werde euch heute noch einen weiteren logischen und 2 binäre Operatoren vorstellen. Der Logische, (der komischerweise in der Schule nie verwendet wird, weil man ihn eher im Bereich Informatik benötigt) ist MOD.

(Wha? Wer ist Mod? Das Sandmännchen? PE? ^^ [...])

Nein. Schaut euch ersteinmal das Schema an:

"Mod" = "Modulo" = "Ganzzahldivision mit Rest"
Betrag von Modulo = Rest(Dividend / Divisor)
Schaut etwas seltsam aus. Ist höchstwahrscheinlich mathematisch auch noch inkorrekt geschrieben. Aber besser fiel´s mir jetzt nicht ein, wie ich es darstellen soll. Was macht das also? Schauen wir uns ein paar Rechnung an:

10 Mod 10 = 0
10 Mod 9 = 1
10 Mod 8 = 2
10 Mod 7 = 3
10 Mod 6 = 4
10 Mod 5 = 0
10 Mod 4 = 2
10 Mod 3 = 1
10 Mod 2 = 0
10 Mod 1 = 0

Irgendwas verstanden? Nein?
Der Dividend wird durch den Divisor dividiert. (XD) Das Ergebnis ist allerdings nicht der Quotient, sondern der Rest der Natürlichen Zahl (|N) welcher übrig bleibt. Ein paar weitere Beispielrechnungen für dich:

9 Mod 3 = 0
1 Mod 1 = 0
13 Mod 10 = 3
20 Mod 7 = 6
5 Mod 10 = 5

Aber wozu das Ganze?
Nun. In der Mathematik (und ganz besonders in der Informatik) kann man nicht einfach sagen: "Nimm die letzte Stelle der Zahl und mach dasunddas damit!" Ein Prozessor kann solch eine Anweisung beispielsweise nicht interpretieren. Dafür benötigen wir Mod.
Sagen wir, wir haben gegeben die Dezimale Zahl 456215897 und uns interessiert aus irgendwelchen Gründen die 7 am Schluss. In einer Programmiersprache müsste ich erst mühsam die Zahl in einen String konvertieren und dann mit einem "Right"-Befehl die restlichen Zahlen links abschneiden. Danach müsste ich das Ergebnis wieder dazu zwingen ein (Long-)Integer zu sein, und das ist garnicht einfach. Diese Methode ist mathematisch inkorrekt und auch nicht gerne gesehen.
Stattdessen bedient man sich des Befehls "Mod". Denn 456215897 Mod 10 ist? Na? Genau. 7! Mod könnte man zum Beispiel benutzen um rauszukriegen, was die letzte Stelle der Trainer-ID ist.
Soweit der logische Bereich. (Qudrat und Wurzel setze ich jetzt mal voraus) Es folgt der binäre.


"<<" = Linksverschiebung (besser bekannt als Leftshift oder Shift Left)

Der erste binäre Operator. Unsere Beispielsrechnung lautet:

0x42 << 0x1 = 0x84

Sieht seltsam aus.
Es findet sich auch keine ordentlicher Gedankenansatz, das zu interpretieren. Konvertieren wir es mal nach binär. (Gute Übung das im Kopf zu machen, statt den Windowscalc herzunehmen...)

0x42 = 01000010-bin
0x3  = 00000011-bin
0x84 = 10000100-bin

Zum besseren Verständnis sollten wir 00000001-bin wieder zu 1(dec) konvertieren. Also lautet unsere Beispielrechnung:

01000010 << 1 = 10000100

Na? Klingelts? Das Ergebnis ist 10000100 also unser erster Wert mit einer 0 hinten dran. Wenn du das Prinzip jetzt verstanden hast, dann kann ich das Ganze jetzt verallgemeinern.

Der Operator „Shift Left“ verschiebt in einer Byte die 8 Bits um einen weiteren angegebenen Wert nach links. Freiwerdende Stellen werden rechts mit 0en ausgefüllt. 1en und 0en die über die erste Stelle hinausgeschoben werden, werden abgeschnitten.

Ein paar Rechnungen, damit du das ganze verstehst:

00110100 << 1 = 01101000
11010100 << 2 = 01010000
11111111 << 8 = 00000000
11011011 << 4 = 10110000

Die nächsten Rechnungen machst jetzt du:

01011001 << 1 = 10110010
00010011 << 2 = 01001100
00010000 << 3 = 10000000
00000010 << 7 = 00000000
11010011 << 4 = 00110000

Schön. Soweit aber nur das Arbeiten mit Shift Left innerhalb von einer Byte. Setzen wir den Bits keine Grenze mehr, bei der sie abgeschnitten werden, werden wir etwas Interessantes feststellen:

1101000010101001111 << 2 = 110100001010100111100
0101110 << 3 = 101110000
011110111111001 << 4 = 0111101111110010000
111001  << 1 = 1110010

"Ah! Öh... Was? Sieht nicht sehr interessant aus. Ich kann da nichts feststellen..."
Kommt dir bekannt vor, der Satz? Genau das hast du gerade gesagt? Mhm... Konvertieren wir doch mal nach Hex. (Gerne auch im Kopf)

0x6854F << 0x2 = 0x1A153C
0x2E << 0x3 = 0x170
0x3DF9 << 0x4 = 0x3DF90
0x39 << 0x1 = 0x72

Sieht immernoch nicht besonders informativ aus. Wie wärs mit Oktal? Näh... Dann lieber das Dezimal-System, das ist manchen Leuten nämlich gebräuchlicher als Hex oder Bin.

427343 << 2 = 1709372
46 << 3 = 368
15865 << 4 = 253840
57 << 1 = 114

Auch hieraus lässt sich nicht viel schlauer werden, aber die letzte Zeile sieht sehr einfach aus.
57 << 1 = 114
...
Das klingt wie 57 * 2 = 114. HEY! Ein logischer Operator, der vielleicht nur durch einen binären ersetzt wurde? Schauen wir uns doch mal das mit der 2 an...

427343 << 2 = 1709372

Auweh. Um das zu verstehen, müssen wir ein paar Dinge ausprobieren. Entweder summiert sich ein Operator mit dem anderen oder er multipliziert sich. Vielleicht quadriert er sich auch? Wir müssen also eine Proportionalität herstellen. Und wie? [...] Durch Ausprobieren! *strahl*

Angenommen die Shift Lefts würden sich aufsummieren müssten wir bei << 2 einfach + 1 mehr malnehmen. Die Rechnung würde also lauten: (Klammern um Punkt vor Strich vorzubeugen)

427343 * (2 + 1) = 1282029 <> 1709372

1282029 <> 1709372 bedeutet 1282029 ist anders als 1709372. Man könnte auch != schreiben. Offensichtlich summiert sich Linksverschiebung nicht. Probieren wir es mit der Multiplikation.

427343 * (2 * 2) = 1709372 = 1709372

Hey! Das passt! Sehr schön. Dann dürfte das für die nächste Rechnung auch zutreffen:

46 << 3 = 368

wird zu

46 * (2 * 3) = 276 <> 368

VERDAMMT! Wieder nicht richtig. Multiplikation schließt sich also auch aus. Jetzt bleibt nur noch eine Möglichkeit.
Der Exponent.

Demnach wird

46 << 3 = 368

zu

46 * (2 ^ 3) = 46 * (2 * 2 * 2) = 368

*cheese* Es stimmt. Schön. Schauen wir mal ob’s für die vorherigen Beispiele auchnoch zutrifft.

427343 * (2 * 2) = 1709372
46 * (2 * 2 * 2) = 368
15865 * (2 * 2 * 2 * 2) = 253840
57 * (2) = 114

Wir können also sagen, dass Shift Left im unbegrenzten Bereich sich immer durch die Formel y << x = y * 2 ^ x ausdrückt. (Potenz vor Produkt, daher keine Klammern.)

@____@ HÄH? *nixmehr checkt* Kann mir mal bitte einer erklären, warum MX da seltsame Zeichen schreibt??? *cry*

Also... Es ist nicht besonders schlimm, wenn du die Ableitung der Formel nicht richtig verstanden hast. Generell wollte ich damit nur zeigen, dass Leftshift im Mathematischen Bereich immer eine Potenz von 2 mit dem Exponent „Wert von Leftshift“ darstellt. Alle Klarheiten beseitigt?
In Zukunft reicht es aus, im Windows-Taschenrechner die Taste "Lsh" (rechts neben "-") zu benutzen.


">>" = Rechtsverschiebung (besser bekannt als Righthift oder Shift Right)

Ich spare mir hier das ganze Prozedere mit Formel ableiten etcetera. Summa Summarum lässt sich über Rechtsverschiebung Folgendes sagen:

Es gibt zwei Arten der Rechtsverschiebung. Die Logische Rechtsverschiebung und die Arithmetische Rechtsverschiebung. Die beiden Operatoren unterscheiden sich lediglich durch die Tatsache, dass beim Arithmetischen das Bit mit dem höchsten Stellenwert in die neuen Leerstellen eingefügt wird. Zwei Beispielrechnungen sollten das anschaulich darstellen:

1100100 >>l 2 = 0011001
1100100 >>a 2 = 1111001

Das erste logische Rightshift schneidet rechts 2 Stellen ab und fügt links zwei 0en hinzu. Das zweite, das arithmetische Rechtsverschieben, füllt stattdessen die neuen Stellen mit dem Bit, das vor der Verschiebung ganz am Anfang steht. (Das ist das MSB, das Most Significant Bit)
Unterm Strich lässt sich sagen, dass ASR (arithmetical shift right) oder LSR (logical shift right) umgekehrt wie Leftshift funktioniert. Das Arithmetische Rechtsschieben war eigentlich mal dazu da, bei Negativ-Divisionen das Zeichen beizubehalten. Der Operator funktioniert also zum Dividieren, gemäß folgender Formel:

y >> x = y / 2 ^ x

Der nicht ganz so langweilige Teil
Puh. Jetzt haben wir die Operatoren erstmal hinter uns gelassen. Hier möchte ich noch Kurz die Verwendung von AR-Codeformaten erklären, wenn man mehr als 8 Bit schreiben will. Folgendes Szenario: Wir wollen an die Adresse 0x02023456 den Wert 0x1234 schreiben. Folgende Arbeitsanweisung:

  1. Der Wert muss byteweise reversed werden. (Das heißt, wir müssen einfach das Byte, das wir zuerst schreiben wollen an die hintere Stelle setzen.
    1234 wird zu 3412
  2. Die Adresse muss den „AR-Switch“ erhalten. Die zweite und die dritte Ziffer müssen ausgetauscht werden.
    02023456 wird zu 00223456
  3. Das Ganze wird zusammengeführt und der Wert erhält seine "0er-Ausfüllung" zu 4 Bytes.
    00223456 00003412
  4. Wir wollen 2 Bytes, also 16 Bit schreiben. Daher müssen die ersten beiden Stellen der Adresse mit der Kennung für 16-Bit-RAM-Write, nämlich 02 überschreiben. (Wollten wir 32 Bit schreiben, müssten wir 04 schreiben.)
    00223456 00003412 wird zu 02223456 00003412
  5. Let´s encrypt it!
    02223456 00003412 wird zu 4CD072DA F1DA727F

Schön. Damit dürften wir jetzt den RAM-Write-Code-Type ganz klar besprochen haben, oder? Es sollte ab jetzt kein Problem mehr darstellen, wenn ich einfach sage: "Mach den 16-Bit-Wert per AR dahin!" Du musst dann wissen was zu tun ist. (Natürlich unter Kenntnis der Adresse und des Wertes)


Auflockerung & Schluss: Gehirn Jogging (Geiles Game btw...) ... (Obwohl... vielleicht krieg ich ne Anklage wegen Urheberrechtsverletzung, wenn ich das hier schreibe. Nehmen wir lieber:) Wissenstest

Nach Klärung der Überschrift werde ich euch hier jetzt 15 Aufgaben stellen. Hier könnt ihr euch selber testen und euer Wissen unter Beweis stellen. Jede Frage bringt 1 Punkt, welcher nur vergeben wird, wenn das Ergebnis exakt übereinstimmend ist. (Klammern dahinter markieren) Demnach gibt es also 15 Punkte. Eine kleine Auswertung folgt. Viel Erfolg!

  1. Wir gehens mal langsam an. Was war gleichwieder die Kennung, die das AR benötigt, wenn du einen 8-Bit-RAM-Write-Code erstellen willst? (Also die zwei Ziffern die mit denen die ersten beiden Stellen überschrieben werden)
    Für Lösung markieren: ( 00 ("0x00" gilt auch) )
  2. Wieviele Bytes schreibt ein 32–Bit-Ram-Write-Code?
    Für Lösung markieren: ( 4 )
  3. Was ist der maximale Wert, den ein Halfword halten kann? (Index 1)
    Für Lösung markieren: ( 65535 )
  4. Konvertiere 1101101111111111 im Kopf (oder auf Papier) nach Hex!
    Für Lösung markieren: ( 0xDBFF (Hier muss das "0x" für die richtige Lösung stehen!) )
  5. Stimmt folgende Gleichung: 0x44 << 1 = 0x44 ?
    Für Lösung markieren: ( Nein. Links steht 0x88. )
  6. Produkt, Summe, Differenz... Die Ergebnisse welcher logischen Operatoren, die du bereits kennst, fehlen?
    Für Lösung markieren: ( "Quotient" und "Ergebnis von Modulo" )
  7. Ist diese Aussage korrekt: y << x = (y * 2) ^ x ?
    Für Lösung markieren: ( Nein. Die Potenz muss zuerst gerechnet werden. )
  8. Traceback: Die Zahl ist der Halbe Rest der Modulation vom einmal arithmetisch rechtsverschoben Hexwert von 7-dec * 8-dec modulo 3-mal Linksverschobenes Quadrat von 12-dec. Wie lautet die Zahl?
    Für Lösung markieren: (
    (((7 * 8) >> 1) Mod (12 ^ 2 << 3)) / 2 =
    = ((111000-bin >> 1) Mod (10010000-bin << 3) / 2 =
    = (111100-bin Mod 10000000-bin) / 2 =
    = (60 Mod 128) / 2 =
    = 60 / 2 =
    = 30
    )
  9. Na, alles easy? Nenne zwei binäre Operatoren!
    Für Lösung markieren: ( << und >> )
  10. Gegeben sei der AR-Code E33E8523 CC325F6D . Entschlüssle ihn mit AR-Crypt und nenne seine Kategorie plus Adresse und Wert der geschrieben wird. BONUS: Weißt du welcher Code das ist?
    Für Lösung markieren: ( Es handelt sich um einen 8-Bit-RAM-Write-Code. Die angeschriebene Adresse ist 0x0202001A und der Wert beträgt 0x02. Es ist der Code, der es ermöglicht überall hinzufliegen. )
  11. Erkläre die Begriffe DMA, LSR und AR !
    Für Lösung markieren: ( DMA steht für Data-Memory-Alignment und verhindert das Schreiben von Daten im RAM durch äußere Manipulatoren wie Action Replays, indem sie die Daten an keine feste Stelle setzt. LSR ist das binäre "logische Rechtsverschieben" (logical shift right) Bei dieser Methode wird beim Rechtverschieben die fehlende Stelle immer durch eine 0 ersetzt. AR ist das Action Replay von Datel. Es ist ein Manipulator für den Random Accessed Memory des Gameboy Advance. )
  12. Schreibe den Wert 15 an die Adresse 0305D722. Konvertiere das Ergebnis ins AR-Format.
    Für Lösung markieren: ( 727E077C CA5CDB1C )
  13. Bringe D5391735 D1A723C3 ins VBA-Format. Ohne führende 0en!
    Für Lösung markieren: ( 020ed72a:f4 )
  14. Beschreibe kurz, wie du einen Code für Unbesiegbarkeit deines Pokemons im Kampf machen würdest!
    Für Lösung markieren: ( Offset mit bekannter Suche auf 16-Bit suchen, welches die Bedingungen des aktuellen Lebens erfüllt. Anschließend kurz mit VBA-Code umpointen. (optional) )
  15. Königsdisziplin: Löse folgende Gleichung!
    0110-bin + (0x56 * 12 ^ 011-bin) / 2 + ((20 Mod 111-bin) >>a (65536 – 1111111111111111-bin))
    Für Lösung markieren: (
    0110-bin + (0x56 * 12 ^ 011-bin) / 2 + ((20 Mod 111-bin) >>a (65536 – 1111111111111111-bin)) =
    = 6 + (86 * 12 ^ 3) / 2 + ((20 Mod 7) >>a (65536 – 65535)) =
    = 6 + (86 * 1728) / 2 + (6 >>a 1) =
    = 6 + 148608 / 2 + 7 =
    = 6 + 74304 + 7 =
    = 74317
    )

Auswertung:
0 – 3 Punkte: Auweh! Du scheinst noch viele Leichtsinnsfehler zu machen. Lies dir auf alle Fälle nocheinmal die Grundlagen durch! Beschäftige dich nocheinmal mit den Codes und führe den Test nocheinmal durch!
4 – 6 Punkte: Du hast ein paar Antworten richtig, allerdings machst du noch viele Fehler, die nicht sein müssten. Lies dir nocheinmal die Basics durch!
7 – 9 Punkte: Du hast die Grundlagen begriffen. Beschäftige dich noch ein bisschen mit Lesson 5 & 6 um noch besser zu werden!
10 – 12 Punkte: Wow! Du hast gute Kentnisse um das Thema ROM-Hacking! Wir sehen uns in Lesson 7!
13 – 14 Punkte: Ich sage: Sauber! Du hast dein Bestes gegeben. Deine Kentnisse vom ROM-Hacking sind jetzt schon sehr ordentlich. Du hast die Grundlagen und auch schon etwas fortgeschritteneres Wissen angesammelt. Sehr Gut!
15 Punkte: So! Und du machst jetzt den Test nochmal, perfekt ist das niemals zu lösen. ^^ Schummeln gilt nicht. (Sollte die winzige, fast 0 betragende Möglichkeit eingetreten sein, dass du ehrlich soweit gekommen bist, dann gratuliere ich dir!) Achja.... und @ Pharao oder loadingNOW: haha! Sehr witzig! Was macht ihr im ROM-Hacking-Grundkurs?????

Das war´s für dieses Mal. In der nächsten Lesson werden wir nochmehr staubtrockene Theorie machen. Ihr dürft gespannt sein! ;-)

"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