 Also, jetzt begrüße ich euch zu meinem Vortrag zum Thema Gamehacking und Reverse Engineering. Wir kommen dann auch gleich mal zur Agenda, dass ihr mal seht, was euch hier erwartet. Also erstmal erzähle ich ein bisschen was über mich. Dass ihr wisst, warum ich denke, ich könnte etwas über das ganze Thema zählen. Dann kommen ein paar Merksätze zum Thema Gamehacking, die ich mir einfach mal ausgedacht habe, die euch vielleicht so ein bisschen helfen, vielleicht auch mal in das Thema einzusteigen, wenn euch bestimmte Sachen abschrecken. Zum Beispiel könnt ihr euch die Merksätze immer ein bisschen vor Augen halten. Dann ein paar Gamehacks in Detail. Also so die gängigsten Hacks, die existieren, die genutzt werden und wie sie funktionieren. Dann stelle ich euch ein paar Tools vor, die ich nutze, oder die generell halt in dem Bereich gerne genutzt werden, weil sie eben viele Möglichkeiten bieten. Dann komme ich zum Thema Memoryhacking, wo ich ein bisschen erzähle, wo findet man sich überhaupt zurecht im Speicher, wo findet man die Werte, wie sucht man nach ihnen und sowas. Dann erzähle ich euch was über Hux, also was Hux sind, welche Arten von Hux es gibt, wofür sie genutzt werden. Dann spreche ich das Thema Packet Hacking an, was die Vorteile davon sind, was man damit machen kann, wie man da am besten rangeht. Dann zum Thema Reels Engineering wird es jetzt zwar nicht massig viel geben, aber ich versuche halt trotzdem auch das Thema anzusprechen und ich zeige da auch was dazu. Und am Ende hacken wir ein bisschen Space Cutted, da habe ich ein paar Hux vorbereitet und werde ich da ans Zeigen, wie wir da an die Sache rangehen. Kommen wir erst mal zum Blatt über mich. Also ich bin 21 Jahre alt, heiß Freehunt, bin das erste Mal bei der GPN, habe mich aber auch schon gut zurechtgefunden, also eine ziemlich coole Veranstaltung. Wie habe ich begonnen mit dem ganzen Thema Gamehacking? Das hat eigentlich mit 14 Jahren begonnen, wo ich so eigentlich das erste Mal angefangen habe zu talken und so was, da habe ich halt irgendwann im Spiel S4 League so ein paar Hacker gesehen, die mit Speedhack umgerannt sind, Godmode und haben halt alles gewonnen hittet und da habe ich mir schon gedacht, ja, sieht ziemlich cool aus, hat mir gefallen. Dann wollte ich halt auch mal damit anfangen und ja, so hat es eigentlich alles begonnen. Womit habe ich angefangen, eigentlich genau damit, also Speedhacken etc., habe mir in einem Forum Elite PvP erst ein paar Tutorials angeguckt, wie man das Ganze macht und dann bin ich halt immer tiefer reingestiegen, habe auch andere Spiele gehackt, MMORPGs und so und so kamen und habe da eben mein Wissen gesammelt. Da heute gestand es, ich mache meine Ausbildung zum Anwendensentwickler, privat tu ich immer noch Gameshacken, ja, zwar nicht mehr so aktiv, aber das ganze Wissen ist halt trotzdem da und ich könnte eigentlich, sobald ich irgendein Spiel jetzt wirklich anfangen, könnte ich staschen nach den Hecks suchen, die ich eben brauchen. Jetzt kommen wir erstmal zu den Merksätzen. Der erste wäre viele Wege für nach Rom, das heißt, es gibt, egal was sich jemand sagt, es gibt mehrere Wege, etwas Bestimmtes auszulösen und ihr müsst euch da nicht beschränken lassen, darauf, wenn jemand sagt, ja, das geht nicht oder es geht so, macht euch eure eigenen Gedanken dazu und dann findet ihr eben auch kreative Wege etwas zu bewerkstelligen. Jetzt kommt das, was ich vorhin schon angesprochen habe, also es existiert nicht wirklich ein richtiger Weg, das heißt, also es schneidet sich eigentlich mit dem vorigen Merksatz viele Wege für nach Rom, also es existiert nicht der einzige richtige Weg, ihr könnt kreative an die Sache rangehen, findet eben mehrere Wege. Kreativität ist das A und O, also mit ein bisschen Kreativität und Grundwissen kann man halt für viele Hecks verschiedene Wege auswinden. Also eigentlich sind es alles drei dieselben Sachen, aber einfach nur alles verpackt und ja, nicht einen Schüchtern lassen, also egal was, wenn ich jemand sagt, etwas geht nicht oder es ist unmöglich, erliegt, kein System oder Spiel ist sicher. Also das beste Beispiel ist zum Beispiel T Worlds, das ist so ein kleines Spiel, wo alles serverseitig geprüft wird und auch die Position kriegt ihr vom Server, das heißt eigentlich sollte man da nicht zecken können, aber es gibt da zum Beispiel einen Exploit, ich sag nur UDP und kein Handshake, also vielleicht können sich manche da schon denken, was da möglich ist. Hi, Peace Poofing. Ja, jetzt kommen wir zum ersten Hack, das wäre Gamehacks in Detail, zum nächsten Punkt Gamehacks in Detail. Kommen wir erstmal zum Speed Hack, was gibt es da für Methoden? Die erste Methode wäre der Performance Counter. Also ich trecke mich hier lediglich auf Windows, aber dieselben Hecks etc. sind eigentlich so auch unter Linux möglich, also dass ihr da jetzt nicht ein bisschen durcheinander kommt. Performance Counter heißt einfach, dass man vom Prozess die Funktion sozusagen übernimmt, die eben dem Prozess sagt, wie schnell es gerade läuft, beziehungsweise welche Ticks gerade auch getorzt sind etc. Und wenn man die halt manipuliert, kann man dem Prozess vorgaukeln, er wäre schneller als er ist und dadurch halt auch alle Funktionen vom Spiel etc. die orientieren sich eben nach dieser Geschwindigkeit, auch die Animation, deswegen seht ihr halt aus, als würde ihr schneller rennen und die Pakete werden halt auch schneller gesendet, deswegen seid ihr auch schneller, meistens. Im Spiel funktioniert das nicht. Aber gut, Method 2 wäre dem Spiel selbst. Also im Spiel selbst habt ihr natürlich Klassen vom Spieler, wo dann auch drin steht, wie schnell ihr läuft, also was eure Laufgeschwindigkeit ist. Und wenn ihr da die Werte ändert, könnt ihr auch ein Speed-Hack auslösen, indem ihr eben zum Beispiel den Speed-Multi-Ply 1.0 ändern würdet, in 2.0 würde das Spiel eben glauben, wenn es eben zu einer Seite nicht geprüft wird. Der nächste Hack wäre Teleport-Hack. Die erste Methode wäre die Position in der Memory verändern. Also ihr nehmt eure XYZ-Koordinate, die ihr eben findet. Wie man die findet, zeige ich noch später. Aber nehmen wir an, ihr habt die einfach und dann könnt ihr eben über die Memory den Wert verändern. Ja, das wäre eigentlich soweit das. Und Method 2 wäre das Teleport-Packet. Also wenn ihr quasi die Position, die euch der Server mitteilt, nimmt oder die ihr dem Server mitteilt und dann eben sozusagen, beziehungsweise, wenn ihr das Paketen, was der Server euch sendet um euch zu sagen, wo ihr euch hinteleportiert und es eben selbst dem Prozess sendet, wie, das zeige ich vielleicht auch noch später, aber das ist jetzt nur der grobe Grundgedanke, dass ihr wisst, was möglich ist. Also das ist auch eine Methode, dem Spieler zu sagen, wohin er sich teleportieren soll. Der nächste Punkt wäre No-Clip. Also dass man eben rumfliegen kann etc. in die Blickrichtung. Also was man dafür benutzt, um den Hack zu realisieren, erstmal eure eigene Position, eure XYZ-Achseposition und die, also es muss auch veränderbar sein. Aber prüft dann, wird es nicht funktionieren. Euren eigenen Blickwinkel, also pitch and yaw, hoch, runter, links, rechts, dass ihr da eben dann die Offsets drauf rechnen könnt, um eben auf die entsprechende Achse eben die Position draufzurechnen. Ja, der nächste Hack wäre Aimbot. Da braucht man auch ein paar Sachen natürlich. Erstmal die Position des Gegners, auf den ihr schießen wollt. Die kann man eben auch senden, wenn man die Klassen der Spieler hat sozusagen. Dann die eigene Position. Ihr müsst wissen, wo ihr euch befindet, damit ihr eben die richtigen Winkel rechnen könnt, um eben auf den Spieler zu schauen. Dann euren eigenen Blickwinkel wieder, damit ihr eben dann den Winkel ausrechnen könnt, bis ihr zum Objekt schaut sozusagen. Also das sind die drei Sachen, die man braucht. Der nächste Hack wäre ESP Extra Sensory Perception. Das ist einfach ein Hack, also für die, die es nicht wissen. Da seht ihr quasi Objekte oder Spieler eben durch eine Wand mit einer Box umranden. Da kann alles Mögliche gemalt sein. Eine Box, ein Name, eine Distanz, Leben etc. Das kann eben der Hacker alles selbst entscheiden. Was man dafür braucht, ist erstmal die Position des Objekts von einer Granate oder von einem Item. Dann die World Matrix. Das ist quasi von der Game Engine selbst sozusagen eine Matrix, die eben bestimmte Werte mit liefert. Also ich bin so tief, bin ich da nicht drin. Also ich kann nicht da nicht viel zu erzählen. Also die Informationen stehen wie zum Beispiel die Position des Spielers zum Beispiel, in der sich in der Welt befindet. Ja, das ist eigentlich das Einzige, was man da wirklich draus braucht. Jetzt kommt die Kamera Matrix. Die Kamera Matrix gehört eben auch zum Spieler oder zu euch sozusagen. Da stehen dann eben diese Sachen drin. Pitch und yaw, also die Kameraperspektive. Dann der Field of View. Also die Kamera eben braucht, um die Punkte darzustellen. Und eine Möglichkeit zu zeichnen braucht ihr auch. Also zum Beispiel über DirectX könnt ihr dann eben zeichnen. Oder GDI Plus. Da gibt es eben mehrere Wege auf dem Window zu zeichnen. Im Vollbildmodus müsstet ihr vom Spiel selbst die Zeichennethode hucken oder eben übernehmen, dass es halt jetzt nicht zu Problemen kommt. Also meistens eben DirectX zum Beispiel. Aber eigentlich heutzutage kann man alles spielen im Fenstermodus. Also kann man ja eigentlich alles im Fenstermodus spielen. Das ist halt auch so wie im Vollbild für die, die das im Vollbild bevorzugen. Ich sage noch was. Also wenn Fragen entstehen oder so, können die ruhig mittendrin stellen. Also ja, oder im Amende. Also mich stattens nicht. Ja, oder man kann eben zum Beispiel auch über das Fenster ein eigenes DirectX-Device legen. Und dann darauf zeichnen. Zum Beispiel wird eben auch nicht erkannt von einem Anti-Cheat. Kann ich jetzt in dem Bereich nicht so viel sagen, also fürs Zeichnen. Aber es soll eigentlich auch undetected sein, drauf zu zeichnen. Jetzt kommen wir zu ein paar Tools, die ich euch zeig. Das erste Tool wäre Oli Debug. Das ist ein X86 Debugger für Windows. Da kann man sich ein Prozess oder eine Datei eben drin laden und dann eben den Assemblercode anschauen. Es wird halt genutzt zum Reversen des Spiels. Wenn ihr jetzt eine Funktion habt, die zum Beispiel eure Position setzt, dann wollt ihr natürlich da rausfinden von wo es wird sich aufgerufen, was wird da drin gesetzt, etc. Das könnt ihr dann mit dem Debug eben rausfinden. Es wird genutzt, um statische Änderungen vorzunehmen. Wenn ihr zum Beispiel jetzt eine Änderung gefunden habt und das Spiel ist nicht gepackt und ihr sagt, okay, ich will die Änderung so lassen, dann könnt ihr den Assemblercode quasi verändern und es auch so als ausführbare Datei dann eben wieder abspeichern. Also das ist dann auch möglich und pattern erstellen. Also dafür nutze ich auch Olly Debug, weil es hat ein cooles Plugin, um Pattern zu erstellen. Also Pattern, für die, die es nicht wissen sind, quasi eine bestimmte Anzahl an Bytes, die eben so gesucht werden im Prozess und man kann halt auch Sachen, also eine Wildcard, zum Beispiel, das heißt, an der Stelle darf irgend ein Byte stehen. Dadurch kann man sich dann quasi Masken zusammen basteln, die auch über Patches hinweg eure Funktionen wiederfinden. Ja, dafür nutze ich eben Olly Debug. Das nächste Tool wäre IDA. IDA ist, ich wollte es auch in Debugger, aber eher für Statische Analyse gedacht. Man kann es zwar auch wie Olly Debug nutzen, aber ich nutze es halt eher für Statische Analyse. Also warum sollte man es nutzen? Es hat einen coolen Pseudo-C-Generator quasi, also Dunk Hacksurace. Das heißt, ihr könnt euch eine Funktionen-Assembler raussuchen und dann sagen, okay, ich will jetzt den Pseudo-C-Code, dann kriegt ihr quasi rechts in einer Übersicht sozusagen einen C-Code, der, wenn ihr euch das ein bisschen länger anschaut, also ziemlich gut Sinn ergibt und also es ist ein ziemlich cooles Feature. Es unterstützt über 50 Prozessor-Typen, also wenn man jetzt nicht nur X86-Architektur-Reverse oder irgendwas anderes, also wo ich mich jetzt nicht drin bewege, aber dafür ist IDA eben auch gut gedacht und ja, also bietet ziemlich viele Prozessor-Typen an. Die Lizenzkosten sind 500 bis 1200 US-Dollar, ist ziemlich teuer, ist von Russen auch entwickelt, der die Bagger also, aber ich sag mal nichts, also es ist teuer, sagen wir es mal so. Dann kommt das nächste coole Tool, was ich auch gerne nutze, wo sich halt die Geister manchmal scheiden, aber ich finde es eigentlich ziemlich cool. Das Tool ist zwar Cheat Engine, habe ich auch schon von Tag 1 eigentlich an genutzt und ich bin damit quasi in den Bereich reingewachsen. Es ist ein Memory Scanner Editor, das heißt, ihr könnt jetzt, ihr wisst zum Beispiel, habt ein Floatwert von 100.0 zum Beispiel und wollt ihn im Prozess finden, dann könnt ihr damit eben danach suchen und ihr könnt halt auch, wenn eine Änderung stattgefunden hat an dem Wert, könnt ihr sagen, okay, gib mir, filter mir alle Werte raus, die sich jetzt in die Höhe geändert haben oder in die Tiefe sozusagen, also da kann man ziemlich gut seine Werte finden mit dem Programm. Dann kommt auch ein Debugger, den ich auch ziemlich gut finde, also man kann umstellen auf Kernel-Debugging oder VIH-Debugging etc., also da gibt es eigentlich auch viele Einstellungen für. Es ist auf Gamehacking ausgelegt, das heißt, es ist halt wirklich auf dem Bereich spezialisiert, also ihr werdet eigentlich alle nötigen Tools oder Gimmicks finden, die ihr braucht, um jetzt zum Beispiel irgendwas bestimmtes ausführen zu lassen oder passieren zu lassen. Dafür könnt ihr zum Beispiel den Lurescript support nutzen, was euch immer die Position prüft und dann eben bestimmte Ereignisse erzeugen lässt. Dazu zeige ich auch später noch ein Beispiel in Spacecadet, also von Windows Pinball. Hab ich ein paar lustige Lurescripts geschrieben, die ich euch später zeigen werde. Ja, ist damit möglich. Dann der 010 Editor, für die, die nicht kennen, also das ist ein Hexeditor, wie ich jetzt hier aufzähle, ist ein Hexeditor, ihr könnt quasi irgendeine Datei, die ihr habt, irgendein Fall, wo ihr das Format nicht wirklich habt, wo ihr Wersen wollt, könnt ihr da reinpacken und dann eben Analyse betreiben, Strukturen analysieren, dafür nutze ich es auch gern, wenn ich zum Beispiel irgendeine Klasse hab, also die Bytes von der Klasse und ich will jetzt nach und nach die Klasse wieder aufbauen, dann tu ich mir immer die nötigen Werte rauspicken und tu dann eben nach und nach die Struktur von der Klasse nachbauen. Man kann Templates erstellen, zum Beispiel könnt ihr jetzt mit, also ihr könnt sozusagen Templates erstellen, zum Beispiel eine Structure, so wie ihr sie in C++ schreiben würdet und könnt sie dann ausführen lassen sozusagen und dann wird unter eurem Hexcode quasi die Struktur, so wie ihr sie geschrieben habt, angezeigt, also er tut dann die Bytes in der Reihenfolge, in das Format quasi darstellen, was sie eben angibt. Ihr könnt Formate nachbauen, das heißt ihr habt jetzt zum Beispiel von einem Spiel irgendeine Datei und wollt eben herausfinden, und das könnt ihr damit eben auch machen, also das Format der Datei nachbauen. Dann noch ein nettes Tool, Reclass, ist aus unknown cheats von einem User geschrieben worden, ist ein cooles Tool, um eben auch Klassen und Strukturen im Spiel nachzubauen oder nachzustellen. Ich lass ihn noch kurz Foto machen, bevor ich weitergehe und zwar genau, also man kann Klassen und Strukturen analysieren, sich im Speicher durchwühlen, Pointer verfolgen, etc. Habe ich auch hier noch mal aufgeschrieben, also wenn ihr V-Tables habt oder Pointer zu bestimmten Bereichen, dann könnt ihr das eben damit auch verfolgen oder nachbauen. Und ja, man kann Klassenstrukturen erstellen, aufbauen, etc. Und ja, kann damit sozusagen für die Beitregion eine bestimmte Klasse erzeugen und auch wieder Formate nachbauen. Also man kann sich auch eine Datei reinladen sozusagen und dann darf man das Format eben nachstellen oder nachbauen. Das nächste Tool wäre Wireshark, kennen bestimmt einige von euch, das wird ja nicht nur bei Gamehacking gebraucht. Ja, es ist ein Packet Sniffer, ihr könnt Pakete, die eben durch eure Netzwerk-Karte gehen, könnt ihr eben Sniffen, also die eingehenden und ausgehenden. Ja, dafür nutze ich es eigentlich auch zum Pakete analysieren. Also wenn ihr jetzt ein Spiel zum Beispiel gerade am Laufen habt und ihr wollt wissen, was sendet es überhaupt, etc., könnt ihr eben die Pakete davon auch Sniffen und analysieren und eben auch Verschlüsselung prüfen. Das heißt, wenn ihr wissen wollt, verschlüsselt das Spiel seine Pakete oder kann ich einfach so die Pakete raus senden, etc., dann könnt ihr das eben damit feststellen. Und ja, das wäre es eigentlich soweit zu den Tools. Jetzt kommen wir zum Bereich Memory Hacking. Erstmal, was ist das? Memory Hacking ist eben, ihr habt ein Speicherbereich und habt da drin natürlich Werte, die das Spiel nutzt oder auf die das Spiel zugreift und ihr ändert die Werte oder lest sie aus oder arbeitet damit einfach. Und ja, das ist eigentlich grob, was Memory Hacking ist. Was ist damit möglich? Viel. Ihr könnt zum Beispiel in manchen Spielen, die halt relativ schlecht gesichert sind, könnt ihr mit nur wenig Arbeit quasi im Bereich im Speicher finden, wo eure HP drin stehen und euch einfach mal eine Million HP zum Beispiel geben oder sowas, also je nach Typ, also Datentyp, aber es ist halt zum Beispiel möglich, sowas zu machen oder Position verändern, etc. Was ist damit nicht möglich? Ihr könnt damit jetzt nicht einfach ein Wert in der Datenbank vom Spiel ändern. Es ist ja klar, weil ihr befindet euch auf eurem Rechner und also sowas wäre jetzt nicht möglich. Über Umwege könnte man zwar irgendetwas auslösen, was den Server eine bestimmte Mitteilung gibt und dadurch Sachen machen, aber das geht zu tief in die Materie. Aber sagen wir einfach mal, es ist nicht damit möglich über Memory Hacking. Was halt ein Anti-Cheatsysteme davon? Das kommt halt oft aufs Anti-Cheatsystem an und auf den Bereichen, den ihr halt rumwuselt. Wenn ihr jetzt in einem Bereich seid, der sich in der Punkt-Text-Region befindet, also wo der Programmcode vom Spiel zum Beispiel steht, da haben eigentlich viele Anti-Cheatsysteme was dagegen, wen da drin rumfummelt, weil das ist ein Bereich, der sollte sich nicht ändern. Da liegt der Programmcode drin und der ist immer gleich sozusagen zur Laufzeit. Aber ihr könnt zum Beispiel in der Data-Region Sachen verändern. Das ist eben die Region, die ich vor langen Mal so gemeint habe, wenn ich über Memory Hacking rede. Ja, jetzt kommen wir zum Thema Hooks. Da kommen wir erstmal zum gewinnlichen Detour. Was macht ein Detour? Es ersetzt eine Funktion von Beginn an. Ihr habt quasi die Funktion zum Beispiel für das Setzen der Position vom Spiel und setzt euren Detour drüber. Das heißt, die Funktion zeigt zu eurer Funktion. Ihr setzt die Position um oder macht das auch immer ihr damit machen wollt und gibt ihm dann wieder die Originalfunktion zurück oder lässt die Originalfunktion aufrufen. Das ist quasi ein Detour. Die Detection Rate ist bei einem normalen Detour sehr hoch, weil ihr ersetzt quasi den Start der Funktion mit einem Sprung auf eure Funktion und Anti-G-Systeme können sowas eigentlich in der Regel ziemlich leicht erkennen, weil ihr natürlich in der Data, in der Textregion seid und Beids verändert, die eigentlich sich nicht verändern sollten. Es ist eigentlich ein schöner Hook. Das heißt also schön zu schreiben, in C++ zum Beispiel. Ja, so wollte ich auch noch da angemerkt haben, weil es kommt natürlich auch drauf an, womit ihr am liebsten arbeitet. So sieht das ungefähr aus. Es ist eher pseudomäßig gehalten, also es ist nicht 1 zu 1 so, aber das ist eigentlich das Grundprinzip dahinter. Ihr habt links eure Originalfunktion und rechts sozusagen die Funktion, wie sie ja aussehen würde, wenn ihr euren Detour macht. Das heißt, die echte Funktion sieht nicht mehr so aus wie links, sondern es ist quasi die Funktion, die ihr eben als Detour gesetzt habt. In dem Fall ist es einfach ein Return auf meine Detour-Funktion, die ihr unten seht. Also ich return dann statisch immer 1,3,3,7 und oben wird alt einfach gesagt, return mir das, was die Funktion quasi returned. Also so würde es theoretisch aussehen. Ein Detour in der Assembler-Sicht, also wenn ihr euch den Assembler-Code der Funktion anschauen würdet, würde ungefähr so aussehen. Links erstmal der normalen Assembler-Code. Ihr habt das sichern vom Stack-Register etc. Also das ist einfach nur x86 Assembler-Code von der Funktion. Rechts würde es dann so aussehen, dass nicht mehr der Stack gespeichert wird sozusagen, sondern es wird ein direkter Jump zu eurer Funktion gemacht. Das sind eben die Sachen, die ein Anti-Cheat-System erkennt, also diesen Sprung, weil es sind natürlich ganz andere Bytes und ganz unten kommt dann quasi irgendwo im Speicher, steht dann eure Funktion zu, die gesprungen wird und die macht dann eben andere Sachen mit der Funktion. Und dann eben Returned. Und dadurch, dass es ein Jump ist, würde auch nicht nochmal zur Originalfunktion returnen, sondern direkt das, was ihr festlegt würde eben ausgeführt werden. Dann gibt es einen Mitfunktion-Hook. Was ist ein Mitfunktion-Hook? Es huckt quasi mitten in der Funktion. Ihr habt eine bestimmte Stelle in der Funktion. Es muss halt nicht direkt der Anfang sein, sondern irgendwo weiter unten, habt ihr eine Stelle, die ihr eben als Hook nutzt. Das heißt, ihr setzt da den Sprung zu eurer Funktion und die ersten Bytes gar nicht, sondern ihr setzt da eben den Sprung, aber ich zeige es gleich noch. Also ich neigt dazu eben ziemlich schnell zu viel zu erklären, obwohl ich es eigentlich später mache. Deswegen belassen wir es erstmal da, aber ich zeige gleich noch, wie genau Mitfunktion-Hook aussieht. Die Detection-Rate ist relativ hoch. Ihr tut zwar viele Anti-Cheat-Systeme dadurch austricksen, dass ihr die ersten Bytes in Ruhe lässt, weil viele Anti-Cheat-Systeme sagen, denken sich halt okay, ich mache das nicht so richtig, nämlich zu viele Sachen prüfe, sondern ich tue eben nur das nötig zu prüfen. Die prüfen dann eben zum Beispiel von jeder Funktion nur die ersten 7 Bytes. Es ist auch relativ bekannt, dass sie das machen. Und wenn ihr Mitfunktion macht, könntet ihr solche Anti-Cheat-Systeme zum Beispiel umgehen. Es ist ein relativ hässlicher Hook, dadurch, dass ihr eben mit Inline-Assembler sozusagen ein bisschen arbeiten müsst. Ihr könnt nicht einfach nur, wenn ihr die Calling-Convention der Funktion habt, quasi die Funktion so direkt nachbauen, sondern ihr müsst halt im Assembler-Kot einen Sprung setzen zu eurem Kot und es sieht halt relativ hässlich aus. Das wollte ich halt auch angemerkt haben, bevor sich manche denken, okay, nehm ich halt einfach das. So würde es in Assembler aussehen, also eh, nee, nicht in Assembler, sondern es würde quasi direkt wie ein, also es würde auch wieder wie ein normaler Ditto aussehen. Dadurch, dass ihr eben die ersten Bytes in Ruhe lässt, ändert ihr ja nicht den Ditto an sich, also ihr springt ja immer noch zu eurer Funktion. Das heißt, es wird kein Original-Kot ausgeführt, sondern nur dieses Stack speichern etc. Nur das steht ja auch da und wird ausgeführt. Deswegen würde es theoretisch genauso aussehen wie ein normaler Hook. Aber in Assembler, wenn wir uns da den Kot mal ansehen, sehen wir direkt, es sieht anders aus. Die ersten Bytes hab ich jetzt nur aufgeschrieben, weil das eigentlich die wichtigen sind, also die ersten Instruktionen, die ihr links seht. Und nachher würde es eben so aussehen, die ersten Instruktionen werden auch ganz normal ausgeführt, aber danach kommt eben der Sprung zu eurer Funktion. Wie die aussieht, seht ihr dann unten. Ich habe es ein bisschen eingerückt auf die nächste Spalte, damit man das eben noch sehen kann. Also unser Ditto würde dann so aussehen, wir tun das wieder säubern, was von der echten Funktion ausgeführt wurde, also das Pushen von den Registern und die müssen wir halt wieder poppen. Das müssen wir machen, weil die echte Funktion kann es nicht mehr machen, weil wir eben nicht dafür gesorgt haben. Wir könnten natürlich auch sagen, ok springt zu dieser Stelle in der Original-Funktion und dann würde die Original-Funktion wieder das Stack-Säubern machen. Könnte man auch machen. Also die Kreativität, also eigentlich ist da Kreativität gefragt, wie ihr das machen wollt. Also macht niemand, macht niemand jetzt genau eins zu eins gleich. Also ja. Als nächstes kommt eben ein V-Table-Litur. Was ist ein V-Table-Litur? Es setzt den Point dazu, der Original-Funktion in der V-Table. Das heißt, da wo die Adresse der echten Funktion steht, steht nicht mehr die echte, sondern eure. Und dadurch wird eure Funktion aufgerufen. Das ist erstmal Gruppen V-Table-Litur. Die Detection Rat ist sehr gering, dadurch, dass ihr euch nicht mehr in der Textregion befindet, also quasi wo der Programmcode steht, sondern in der Data-Region, wo eben alles möglich an Daten stehen kann. Da liegen die V-Tables, ich sag mal, in der Regel. Es kann auch anders aussehen, also wenn die V-Table immer gleich ist. Also wenn die Funktion immer an derselben Stelle sind, es in der Textregion ist, aber in der Regel ist es in der Data-Region. Dadurch ist die Detection Rat sehr gering. Es ist ein relativ schöner Hook, also wenn ihr den Hook dafür schreibt, sieht es so aus, ihr setzt einfach den Pointer zu eurer Funktion und die Funktion sieht halt genauso aus, wie sie aussehen sogar so, wie ihr sie eben in C einfach schreiben würdet. So sieht es eben theoretisch aus, ihr habt links zum Beispiel eine Klasse, in dem Fall OBS und ihr habt hier eine virtuelle Funktion. Einfach ist lecker, eine Bulienfunktion. Rechts habt ihr einfach mal zwei Funktionen, einmal die Klasse Banane, die sagt, ich will von der Klasse Obst erben und setze dann eben den Wert zu dieser Funktion. Also ich beschreibe die Funktion ist lecker und dadurch wird der Pointer in der V-Table gesetzt. Das heißt, jetzt steht in diesem Pointer also ein Zeiger quasi zu der Funktion, die eben nichts anderes macht als True-Return. In dem Fall Obst wird eben Return Maybe gemacht. C plus ist gleich. Beides macht das selbe. Es ist jetzt einfach im Hintergrund einfach ein Pointer in der V-Table. So würde es eigentlich im Spiel zum Beispiel aussehen. So würdet ihr jetzt zum Beispiel ein V-Table Lito machen. Es sieht vielleicht relativ verwirrend aus, ich wusste auch nicht, wie ich es am besten darstelle. Es ist jetzt einfach irgendeine Funktion vom Spiel. In dem Fall ist sie live. Die sagt einfach, ob der Spieler am Leben ist oder der Gegner. Und da wird ein Funktionscall gemacht auf die Methode GetHealth. Und was wir jetzt machen ist, wir ändern die Adresse von GetHealth zu unserer eigenen. Dafür brauchen wir erstmal die Adresse der V-Table. Die kann man eben auch relativ schnell rausfinden. Wenn man Reverse Engineering betreibt, dann findet man schnell, okay, wo ist der Anfang der V-Table? Es ist generell so, dass es im Speicher in der Klasse an erster Stelle steht. Das heißt, wenn ihr eine Klasse habt, sind die ersten 4 Bytes ein Zeiger auf die V-Table. Und so findet ihr eigentlich generell immer die V-Table von einer bestimmten Klasse. Und dann nehmt ihr die Adressung, rechnet da das Offset zur Funktion drauf. Also zum Beispiel, wenn es die dritte Funktion ist, einfach 3 mal 4 als Offset draufnehmen, dann seid ihr genau bei den Bytes, nach dem Wert auf eure Funktion. Also, ihr entspeichert euch erstmal den echten Pointer, dann wisst ihr erstmal, wo liegt die original Funktion, falls ihr sie aufrufen wollt und setzt einfach eure Funktion dahin. Also die 4 Bytes zur Adresse eurer Funktion, wie ich hier eben gezeigt habe mit dem und. Und dann eben D ist alive. Dadurch würde dann immer unsere Funktion aufgerufen werden, die eben 2 returned. Ja, ist also, dass wir eben quasi, wie es in C aussehen oder C bis Plus aussehen würde, hier nochmal in Assemblersicht. Es ist relativ klein gehalten, weil da gibt es eigentlich nicht großartig viel zu erklären. Und zwar der Call im Assembler-Code, der sieht einfach so aus, dass da nicht normal Call-Adresse steht, sondern da steht eben ein Pointer quasi. Also da gibt mir Call die Funktion, die eben in dieser Adresse liegt. Und der Call sieht immer gleich aus. Also das heißt, er liegt auch in der Textregion vom Programm, auch an die Cheatsysteme prüfen diese Stelle. Und danach, nach Irgendetor sieht die Stelle genauso aus, weil die V-Table ändert er nicht. Die ändert nur ein Wert in der V-Table. Und unten seht ihr zum Beispiel jetzt, ihr könnt euch vorstellen, das wäre eine Stelle in der V-Table. Die Adresse unten links. Da steht vorher die, ein Pointer zu ist alive vom Spiel. Und dann eben der is alive Code, irgendwo. Aber danach sieht es eben so aus, dass an dieser Stelle nicht mehr die echte Funktion steht, sondern Pointer zu eurer Funktion. Und ja, dadurch, dass es eben in einer anderen Region ist, wird es nicht gescannt werden. Jetzt kommen wir zum Thema Packet-Hacking. Erstmal, was ist das? Ihr könnt eben über Pakete, sozusagen Werte an den Server senden, die euer Client gar nicht bestimmt hat. Und dadurch eben Sachen auslösen. Oder ihr ändert Werte, die der Server euch sendet und sagt dem Client einfach, hey, du hast ein Speed-Buff bekommen, und dadurch fändt die auch einmal schneller. Und dann ist es halt möglich, eigentlich alles, was mit dem Client selbst möglich ist, also über Memory-Hacking, weil alles, was euer Client entscheidet und zum Server sendet, wird ja über Packets geschickt. Und dadurch könnt ihr eben genau dasselbe auslösen. Was ist damit nicht möglich? Es ist nicht möglich, Sachen zu zeichnen. Zum Beispiel, so ein ESP wäre damit jetzt nicht möglich. Außer das Spiel selbst bietet irgendwie die Funktion. Zum Beispiel jetzt Call of Duty oder so was. Da gibt es ja irgendeinen Perk, womit man Gegner sehen kann. Das ist halt so was nicht möglich. Oder ein Aimbot im Sinne von ihr seht, wo ihr hinzieht, würde damit auch nicht möglich sein. Was zum Beispiel möglich wäre, ein Invisible Aimbot. Das heißt ihr seht gar nicht, dass ihr gerade jemanden angeschossen habt. Sowas könnte man halt über Packets machen. Aber macht generell nicht viel Spaß. Man will ja auch sehen, wie man gerade umgebracht hat. Vorteile gegenüber Memory-Hacking. Ihr habt weniger Arbeit. Also wenn jetzt bei Memory-Hacking würdet ihr die Funktion hucken, die Stelle finden. Eventuell ein Pattern machen, damit ihr bei einem Update wieder die Stelle findet. Würdet ein Hook schreiben, etc. Das ist viel Aufwand. Bei Memory-Hacking würdet ihr euch einfach den Opcode speichern. Also das erste Beitrag, womit das Spiel erkennt, dass es die Funktion ist. Das würdet ihr euch eben rausschreiben. Das müsstet ihr wissen. Und ihr müsstet eben wirklich nur die Paketfunktion selbst hucken. Das heißt ihr macht einen Hook und könnt damit viele Hacks auslösen. Das würdet ihr für jeden Hack einen eigenen Detour schreiben. Es ist relativ kleiner. Also es ist viel kleiner als ein normaler Memory-Hack. Und es ist relativ leicht zu updaten, weil an den Opcodes selbst, also diese Codes sozusagen für die Funktion, die ändern sich eigentlich so gut wie nie. Also kommt natürlich auch aufs Spiel an. Aber in der Regel ändern sie sich eigentlich nie. Es werden nur neue draufgepackt. Methoden, also welche Methoden gibt es um die Paketfunktion jetzt zu hucken oder eben Pakete zu senden und zu empfangen. Erst mal ein Hook von, also in Windows wäre es jetzt z.B. WSA send oder WSA receive. Also die ganz normale WinRP-Funktion, die eben euch diese Möglichkeit zur Verfügung stellt, Pakete zu senden oder zu empfangen. Wenn ihr die huckt, dann könntet ihr eben Pakete, die aber auch, also wenn sie verschlüsselt sind, würdet ihr auch die verschlüsselten Pakete bekommen. Das heißt, ihr müsstet die erst entschlüsseln. Ihr könnt aber in dem Fall die spieleigene Paketfunktion hucken. Das heißt, wenn das Spiel eine Funktion hat, die Entschlüsselung macht, bla bla bla und dann die WinRP-Funktion aufruft, also WSA sind, dann habt ihr das entschlüsselte Paket, dadurch, dass das ja erst später ausgeführt wird und das ist eigentlich eine relativ coole Methode, weil ihr müsst euch darüber keine Gedanken machen ums Verschlüsseln etc. der Pakete. Dann die dritte Methode wäre WinPicap, ein Treiber, der sozusagen euch die Möglichkeit bietet, die Pakete auszulesen, die gesendet oder empfangen werden. WinPicap wird z.B. von Wireshark genutzt, ist halt einfach ein Treiber. Den gibt es in Unterlinux und halt auch unter Windows. Ja, damit könnt ihr immer die ausgehenden Pakete empfangen oder auslesen und die gesendeten. Was ihr damit nicht machen könnt, ihr könnt jetzt nicht irgendeine Funktion irgendeinen Paket blockieren oder ersetzen. Das heißt, wenn das Spiel der Senat hat, die sei tot, dann könnt ihr das nicht unterbinden. Aber ihr könnt wissen, das ist der Furry 2. Das heißt, das ist ein Nachteil. Darum zerstört halt viele Hex, die damit möglich wären. Jetzt kommen wir zum Bereich Reverse Engineering. Erstmal, was ist das? Viele Wissens von euch, aber ich tust trotzdem ansprechen, für die, die es nicht wissen. Es ist halt einfach, ihr habt irgendeine Funktion im Assembler, also x86 Assembler, habt ihr irgendeine Funktion oder irgendeine Tätigkeit, die ausgeführt wird und ihr wollt natürlich wissen, wer löst die aus oder welche Funktion löst die aus, was genau wird hier überhaupt gemacht. Da müsst ihr eben Reverse Engineering, also quasi die Funktion nach hinten wieder aufbauen. Also ihr müsst quasi Stück für Stück zurückgehen und dann immer wissen, ah okay, hier hat er quasi jetzt den Wert gesetzt und davor hat er das und das Vorbereit, also das ist einfach dieses Rückwärtsdenken der Funktion. Kenntnisse, die man dafür braucht, x86 Assembler Instruktion. Die gängigsten sollte man eigentlich wissen, z.B. Move, also wenn Speicherwert gemove wird oder ein Register oder ja, durch FLD, also wenn Float geladen wird, beispielsweise, also es gibt da halt relativ viele Instruktionen, die halt häufig genutzt werden, die sollte man eben beherrschen. Die anderen kann man sich nach und nach eben aneignen, wenn man eben es braucht. Wofür braucht man das? Klar, wenn man jetzt ein Heck schreiben will, dann muss man eben bestimmte Sachen reversen, also ohne das kommt ja halt nicht ans Ziel und dafür braucht man es natürlich, wenn man eben einen Heck schreiben will. Wie geht man vor? Man hat einen Debugger, z.B. Audi Debug oder den Cheat Engine Debugger und man hat einen Wert und der Wert, ihr wollt wissen, wer setzt diesen Wert, dann setzt ihr einen Breakpoint auf diesen Wert und der Prozessor stoppt eben sozusagen, also wenn dieser Wert aufgegriffen oder eben beschrieben wird, also das könnt ihr entscheiden, ob er bei Write sozusagen bregt oder bei Read und ihr sagt euch, okay, ich will wissen, wer beschreibt das, dann setzt ihr einen Breakpoint für also Write Instruktion, also sobald der Bereich primit und der Prozessor bregt sozusagen dann in dieser Stelle, also er tut einen Flag sozusagen auslösen, also der Debugger weiß dann, okay, jetzt ist an der Stelle dieser Break eingetroffen sozusagen. Also so genau kann ich es nicht beschreiben, es gibt da natürlich Fachbegriffe, aber das ist eigentlich ein Grund, wie es passiert, also der Break wird ausgelöst und ihr könnt dann sozusagen jetzt steppen, also quasi immer ein Stück nach vorne gehen, Werte vorher verändern, bevor sie ausgeführt werden und darüber wird dann quasi reversen. So würde es z.B. aussehen, ihr habt jetzt den Assembler-Code von einer Funktion und der Break ist bei Move ECX 14, EDX eingetroffen, dann wisst ihr, okay, der Wert der draufgeschrieben wurde liegt im EDX-Register und die Adresse, die beschrieben wurde, steht im ECX-Register auf Z14 z.B., das könntet ihr daran schon erkennen. Und dann könntet ihr auch erkennen, okay, woher nimmt er sich den Wert aus dem ECX-Register, also den Wert, der draufgeschrieben wird und das seht ihr eben eine Zeile oben drüber, er wird aus dem EBP-Register auf Z8 geholt und dann geht er natürlich im Schritt weiter. Jetzt müsstet ihr z.B. wissen, was liegt im EBP-Register und ihr müsst immer einen Schritt nach hinten gehen. In dem Fall würde halt einfach nur eine Funktion aufgerufen werden und der Parameter der Funktion würde sozusagen als Wert genutzt werden. Der zweite Parameter und ja, das ist halt, wie es aussehen würde. Zu unserem Szenario jetzt, wir wollen Spacecut attacken. Da haben wir erstmal Bereitungen zu treffen und zwar was wollen wir hacken, da machen wir uns erstmal Gedanken dazu. Zum Beispiel, was ist möglich? Wir haben die Position des Balls und wir haben eine Punktezahl. Also mehr ist mir da erstmal nicht eingefallen. Aber es kann ja jedem noch was anderes einfallen und dann machen wir uns natürlich erstmal Gedanken dazu. Jetzt suchen wir uns einen Anhaltspunkt. Wie können wir z.B. die Position des Balls finden? Wir müssen natürlich erstmal wissen, okay, wir haben eine Position und die kann sich ändern. Hoch- rechts. Das heißt, wir suchen uns irgendeinen unbekannten Floatwert sozusagen und würden dann eben suchen, also den Ball kurz bewegen lassen und dann eben den Wert suchen von den Werten, der sich geändert hat. Und das heißt, solche Anhaltspunkte brauchen wir einfach um überhaupt einen Wert zu finden. Oder die Punktzahl, die wir aktuell haben, ist ein Anhaltspunkt. Wir suchen nach diesem Wert, ändern ihn und suchen nach dem Wert, der sich geändert hat. Wir können es z.B. schon mal also Pinball in IDR laden lassen, wenn wir IDR haben um eben, falls wir jetzt eine Funktion haben und wollen wissen, okay, was steht denn hier aus, also ein Pseudo-C-Code, also wenn ihr wissen wollt, was da als Pseudo-C-Code da steht, solltet ihr IDR schon mal laufen lassen, weil es kann je nach Größe der Zeit ziemlich lang dauern, bis er da alles gemacht hat. Deswegen nimmt man sich am besten die Zeit und macht es schon von Anfang an. Erster Schritt, wir wollen die Position suchen. Das würde so aussehen, wir suchen erstmal einen unbekannten Floatwert. Z.B. Ja, wir sind ganz unten rechts beim Start und dann suchen wir einen unbekannten Floatwert. Jetzt erhöhen wir den Wert oder erniedrigen ihn sozusagen, also wir ändern ihn einfach. Wir tun einfach mal Leertaske durchhalten, der Ball springt hoch und jetzt wissen wir, okay, der Ball hat sich geändert. Dann suchen wir einen Floatwert, der sich geändert hat, Sheet Engine Filter dient. Also wir arbeiten jetzt mit Sheet Engine, also müsst ihr euch gedammt die Vorge halten und dann ändern wir die Ballposition nochmal. Also wir lassen es wieder laufen, der Ball fliegt höher, wir stoppen, dann suchen wir den Wert, der sich jetzt wieder geändert hat und nach und nach filtert ihr das eben runter. Hier habe ich es einfach so veranschaulich, einfach go to Suchstad, also wiederholt es im Prozess, bis ihr eben die Werte habt, die ihr braucht, um ihm vorher zu filtern. Danach nehmen wir mal, ihr habt fünf Werte und die Werte unterscheiden sich nicht mehr groß. Also sie ändern sich alle. Dann müsst ihr jetzt die Position des Balls beeinträchtig. Dann könnt ihr Folgendes machen, ihr setzt einfach nach und nach mal ein Wert auf 10, geht ins Spiel, guckt ob sich die Ballposition geändert hat. Wenn nicht nächsten Wert auf 10 setzen, das macht ihr mit allen Werten und irgendwann habt ihr den Wert, der wirklich die Position im Spiel ändert. Dadurch filtert ihr dann nochmal den richtigen Wert raus. Danach würden wir einen Breakpoint auf die Y, in dem Fall habe ich jetzt Y Position des Balls genommen, würde ich den Breakpoint da draufsetzen und danach gucken, wo setzt der Wert ein. Wenig Reversen habe ich jetzt einfach geschrieben damit ihr wisst, jetzt würden wir quasi ja uns die Funktion einfach anschauen um zu prüfen was wird da gemacht. Es war in dem Fall ziemlich einfach, deswegen habe ich das jetzt nicht gezeigt. Es war einfach eine Funktion, die die Position aus den Parametern gesetzt hat. Wenn wir die Position gefunden haben die Funktion gefunden haben, die die Position setzt, dann schauen wir es uns mal in die IDA an und ich habe es natürlich nicht von Anfang an gemacht deswegen habe ich erstmal mir den Assemblercode angeschaut sozusagen, darüber die Funktion gefunden und als ich mir dann in die IDA angeschaut habe ich auch links, ich weiß nicht ob man es hier erkennt, habe ich dann gesehen ok, die Symbole der Datei waren schon drin, also das heißt links konnte ich mir alle Funktionsnamen anschauen, alle Klassennamen etc. Das heißt, ich hätte eigentlich Arbeit sparen können aber hat mir dann später viel Arbeit weggenommen, als ich dann die Funktionsnamen hatte. So würde es jetzt in IDA aussehen, rechts habe dir den Pseudocode, ich kann mal reinsuchen, soll ich mal reinsuchen? Also es ist erstmal nicht wirklich viel zu erkennen, ihr habt zum Beispiel den Wert plus 8e, da müsstet ihr wissen, ok was ist das, das sagt euch natürlich IDA nicht, aber ihr müsst dann halt einfach mal zu der Adresse vom ThisPointer gehen und dann das Offset 8e nehmen und dann wisstet ihr, welcher Wert da drin liegt. Aber ihr könnt euch halt viel Funktion davon quasi selbst ausdenken, also in dem Fall wüssten wir zum Beispiel, ok es werden FloatWerte multipliziert, wahrscheinlich ist da ein Multiplayer für die Ball-Position also wenn der Ball sich gerade bewegt dann gibt es ja ein Multiplayer, der die Position ändert und der sitzt wahrscheinlich da rechts, also das ist dann wahrscheinlich die Direction oder sowas, also das könnten wir eben daraus lesen und ja, das war halt einfach die Funktion die eben die Position des Ball-Sets und am Ende wird eben Render Ball Set aufgerufen und der ist halt einfach fürs Render des Balls zuständig ja, danach können wir die Klassen analysieren weil IDA hat uns ja nicht die Funktion die Wert-Namen gesagt, also er sagt uns nicht, ok das ist die Y-Achse, das ist die X-Achse, müsst ihr selbst rausfinden das könnt ihr halt einfach machen, indem ihr die Adressen nimmt, sie mal in SheetEngine öffnet und dann halt einfach mal ändert und dann schaut euch an, was im Spiel passiert und darüber würdet ihr dann nach und nach quasi die Werte sozusagen aus der Klasse rausfinden können danach machen wir uns Gedanken, was können wir damit machen wir haben jetzt bestimmte Sachen gefunden in dem Fall haben wir die X und Y Position des Balls gefunden dann die X und Y Direction also die Richtung in die der Ball sich bewegen wird und die Velocity des Balls wie schnell er sich bewegen kann haben wir auch rausgefunden und die aktuelle Punktzahl des Spielers das sind jetzt einfach mal die Werte, die wir gefunden haben und jetzt machen wir uns Gedanken was können wir damit hacken ich habe mir ein paar Gedanken dazu gemacht und der erste Hack habe ich einfach mal DerbScore genannt weil ich fand, das sind ziemlich lustige Name und zwar was wir da machen ist, wir speicheln uns die Position des Balls die X und Y Position wir prüfen immer, ändert sich der Score wenn er sich ändert, dann setzen wir die Position wieder auf den vorigen Wert das heißt, wir gehen irgendwo mit dem Ball machen wieder ein Score, der Ball geht immer wieder zurück Profit, haben wir was davon? wer weiß, es macht Spaß ja den Hack kann ich euch mal zeigen ich tue mal kurz die Slideshow beenden das muss ich jetzt mal hier testen so, das ist jetzt einfach das beliebte Spacecutted das öffne ich im Moment die ist mal rechts rein hier so, jetzt öffne ich Cheat Engine so und was ich jetzt mache in Cheat Engine ich tue quasi Cheat Engine an den Prozess attachen das heißt, ich muss hier hingucken weil ich sehe es nicht auf dem Bildschirm ich suche mir jetzt den Prozess aus den ich ihm brauche in dem Fall ist es die Pinball-Achse und jetzt könnte ich z.B. hier die Werte suchen ich weiß nicht, ich interessiere dich das, wie man die Werte sucht weil dann könnte ich das auch noch kurz zeigen das habe ich nämlich nicht mit Bildern geregelt das tut mir leid aber dann kann ich es jetzt machen wir können uns jetzt hier z.B. mal ein Float Wert raussuchen wir ändern hier den Wert of writable also, wir setzen ihn einfach auf das heißt Cheat Engine hat da verschiedene Einstellungen wenn wir nur den Haken setzen würden dann würde er uns eben nur die Bereiche suchen die auch writable sind es gibt ja verschiedene Flex-Dean-Bereiche hat im Speicher wenn wir ihn anchecken, dann würde er gar nicht diese Bereiche durchsuchen und wenn wir es eben auf ich weiß nicht, wie man es nennt, Gray also, wenn er diese Funktion hat dann interessiert sich nicht ob es writable oder nicht writable ist er würde halt alles suchen deswegen setze ich meist die Werte mal so hier unten bei Fast scan können wir eben in 4 bytes springst du jetzt weiter in dem Fall sind es 4 bytes, das heißt er würde alle 4 bytes als Wert nehmen und jetzt suchen wir einfach mal einen unbekannten Float Wert dafür will ich hier um quasi unknown Initial Value aus, machen First Scan so, jetzt habe ich hier 10 Millionen Funde, das sind alles Float Werte ich weiß natürlich nicht, welcher Wert ist jetzt meine X-Position deswegen macht das Sound hört man jetzt nicht, aber ah doch, müsste man gleicher das ist quasi eine Komma Zahl, also zum Beispiel ja, aber es ist kein Integer also ja, es könnte ja, es könnte halt auch sein aber meistens wird halt für die Position Float genutzt, deswegen habe ich halt direkt Float genommen tut mir leid, das hätte ich auch noch ganz frech, aber gut, dass du das ansprichst also ich habe mir halt einfach Gedanken gemacht, okay, welchen Typ könnte jetzt die Position haben, wie gesagt Float, also eine Komma Zahl, deswegen habe ich das hier halt einfach als ersten Wert genommen ich könnte aber jetzt auch Integer raussuchen aber ich bleibe jetzt einfach mal bei Float jetzt ändere ich mal den Wert und pausiere das Spiel mit F3 jetzt hat sich der Wert geändert und jetzt will ich mal hier aus Change It Value also der Wert hat sich geändert, wir wissen nicht ob es ins positive oder negative gegangen ist deswegen suchen wir jetzt einfach mal noch einen Exkern, jetzt wurden die Werte gefiltert das sind jetzt alles Werte, die sich überhaupt geändert haben das heißt, da kann alles Mögliche drin liegen es können auch Speicherbereiche sein die gar kein Float sind, sondern einfach nur Bites aber Cheat Engine sieht erst mal alles als diesen Typ an das heißt, es gibt alle Werte aus, die sich geändert haben jetzt können wir es weiterlaufen lassen es ist jetzt nach unten gegangen jetzt suchen wir einfach mal wieder Change weil wir wissen halt, wie gesagt, nicht in welche Achse sich geändert auf ins positive oder negative jetzt klicken wir einfach mal ins Spiel, machen gar nichts die Position hat sich nicht geändert jetzt suchen wir Unchanged Value das heißt, er sucht mir jetzt alle Werte aus die sich gar nicht geändert haben und so würde ich nach und nach meine Werte filtern das werde ich jetzt wahrscheinlich paar mal machen müssen so, jetzt hat sich wieder geändert der Ball dann Change Value jetzt habe ich unten 123 Funde klicken wir wieder so, mal ein Moment so, alles unten, Change Value klicken wir ins Spiel rein Unchanged, also es ist ein relativ mühsiger Prozess das immer zu machen aber man muss sich halt daran tassen an den Wert, anders geht es halt nicht jetzt gehe ich mal wieder hoch Change so jetzt nee, also das Spiel setzt die Position immer wieder zurück auf diesen Wert das heißt, es kann sein, dass sich in der Komma ein bisschen geändert hat, also dass der Ball ein bisschen nach unten gezogen wurde, dadurch ändert sich auch der Wert, weil das sind ja 16 Nachkommasstellen zum Beispiel ich glaube 10, so genau weiß ich das gar nicht aber es ändert sich halt generell der Wert und das Spiel setzt ihn ja immer wieder hoch das heißt, es kann sich halt schon ändern, deswegen lass ich es einfach gepausiert weil da ändert sich gar nichts und deswegen habe ich es so gemacht also man muss halt einfach so Gedanken darüber machen, wie kann ich den Wert am besten aber das ist eine Sache, die tut man sich nach einer Zeit aneigen und man weiß wie meistens die Reaktion auf eine bestimmte Sache ist und ja, muss man einfach mal mit rumspielen jetzt nehme ich mir einfach mal die Werte weil ich sage jetzt einfach mal viel großartig viel werde ich jetzt auch nicht filtern können also das ist jetzt einfach eine Entscheidung, die ich einfach mal treffe und jetzt gucken wir uns mal die Werte an wir nehmen jetzt einfach mal uns einen Float Wert der keine ja, also keine Potenz hat jetzt nehmen wir einfach mal die hier nehmen wir uns einfach mal ein paar Werte den Wert ah nee, das ist zu hoch also ich entscheide jetzt einfach mal dass 111.000 viel zu große Zahl ist deswegen nehme ich die mal raus ah fuck ok, wir gehen jetzt noch mal ran es tut mir leid, wenn ich jetzt Zeit quasi stehen ich würde es einfach mal zeigen so, nehmen wir uns einfach mal die Werte was wir jetzt machen ist links habt ihr eine Checkbox die sagt, soll der Wert gefreezed werden also soll dieser Wert beibehalten werden wir machen jetzt einmal einen Haken jetzt dürfte sich, wenn wir den richtigen Wert gefunden haben die Position nicht ändern tut sie aber, deswegen wissen wir das rechts kann, da kann nicht die Y-Achse drin stehen was wir jetzt machen ist, wir machen den Haken wieder raus und tun jetzt einfach mal die Werte raus äh, brauchen sie nicht mehr jetzt suchen wir uns mal von unten noch ein paar Werte raus das ist zu groß das kann ich auch machen, aber ich weiß halt nicht, also ich habe mir keine Gedanken jetzt gemacht, wie groß der Wert sein könnte weil das bleibt im Spiel selbst überlassen es könnte sagen, ok, ganz unten ist zwischen 11.000 und ganz oben ist nee, nicht 11.000, aber zwischen 1.000 oder 100 ja, das kann man machen also man kann, was man alles aussehen kann ist genau, also man kann sagen, die Zahl ist größer als das, was ich festlege die Werte sind größer als 100 ich könnte sagen, ok, der Wert hat sich einfach nur zum letzten Scan in die Höhe geändert ich könnte sagen, es hat sich verkleinert es hat sich um 10% verkleinert, könnte ich mit Increased Value beisagen ich könnte sagen, hat sich überhaupt nicht geändert das sind halt die Entscheidungen die ich treffen könnte aber ich bleibe jetzt einfach mal dabei weil ich habe jetzt unten meine Werte und deswegen tun wir jetzt einfach mal weitersuchen ich nehme die Zahl hier da ja wo? das wissen in dem Sinne nicht, weil wir wissen nicht wo welcher Bereich ist wir sehen zwar die Adresse aber wir wissen nicht, ob das jetzt ins Deck ist ob es einfach irgendein Buffer ist ob es irgendeine Spielklasse ist das können wir anhand der Adresse nicht wirklich feststellen die Funktion haben, die Position nutzt und dann eben gucken wo liegt die Adresse vom Deck oder woher nimmst du die überhaupt die Adresse, nimmst du sie aus dem Deck oder aus einer Klasse also die, das kann man jetzt nicht wirklich daraus sagen man kann halt die Adresse sehen aber wirklich sagen wirklich eine Entscheidung kann man dadurch nicht also wir haben jetzt nur noch 6 Minuten deswegen würde ich das jetzt einfach mal beschleunigen wenn ich jetzt den wird oh, egal wir lassen den Wert jetzt einfach so viel kann jetzt auch nicht passieren wir nehmen uns einfach mal ein paar Werte so, jetzt friezen wir die mal gucken ob sie was ändert ok, da liegt die Adresse auch nicht bei ich tue mich ein bisschen beeilen hm könnte ich auch machen das ist auch eine Idee, aber ich habe mir halt schon ein bisschen darum gespült und ich habe halt gesehen, ok ja, kann nicht mehr machen wir es einfach mal so, die Hälfte moment dann ja, jetzt sehen wir, der Ball setzt sich immer wieder zurück da wissen wir, ok, er ist nicht in der oberen Hälfte ja nehmen wir das einfach mal alles weg hm, sehen wir die die Hälfte ok, da ist es nicht, weil der Ball hat sich halt gelegt, deswegen ist es da auch nicht, also ist es da nicht so, jetzt probieren wir die Werte mal aus ok, da drüben so löschen wir die oben mal also, na, waren ziemlich wenig Werte so, jetzt nehmen wir einfach mal hier ein paar Werte raus ja, der hat das ja, also falls ich wundere, warum das so ruckelt, das liegt einfach daran dass das freezing, in dem Sinne nicht wirklich ein freezing ist, sondern einfach sheet engine merkt sich den Wert und setzt ihn in einem bestimmten Delay zurück in dem Fall sind es glaube ich 300 Millisekunden deswegen sieht es halt so komisch aus ok, jetzt haben wir 3 Werte genommen ich entscheide jetzt einfach mal, dass es der hier ist weil die anderen beiden eben so angeben sind ah, nee, falsche Entscheidung der hier? auch nicht? der hier? ja, der ist es ok, ja es kann sein, dadurch, dass ich viel beid als oh, ich hab ihn wieder anfrießt oh, jetzt hab ich aussehen der 4 gedrückt tut mir leid um das meine Maus ersetzt sich immer wieder auf den Wert also so würdet ihr quasi nach dem Wert suchen dadurch, dass ich jetzt nicht viel Zeit hab kann ich jetzt sein, also oder wie viel Zeit hab ich noch, wenn wir überziehen so viel ok ich zeig da einfach noch schnell, wie es aussieht, wenn ich einen Breakpoint auf die Adresse leg in sheet engine wird es so aussehen ich könnte jetzt sagen, find out what writes to this address hey, beschreibst du den Wert und wenn ja, dann würde er mir das in dieser Box hier anzeigen die jetzt hier auf dem Bildschirmaschine ist so, und jetzt lasse ich das Spiel weiterlaufen jetzt haben wir hier oben paar Funde gefunden, also hier sehen wir ok, der Wert, die Adresse hat z.B. 360 mal drauf geschrieben es sieht relativ aus, also es sieht schon so aus, dass es sein könnte und es nutzt auch FSTP also es ist eine Instruktion, die mit float arbeitet gehen wir jetzt einmal zu der Adresse, die wir stoppen diese Session sozusagen und zeigen uns die Adresse mal das ist ein Laden, der ist jetzt auch wieder hier so, jetzt wissen wir ok an der Stelle wurde die Position beschrieben und ja, hier wurde der Wert drauf gerechnet, das sehen wir am fad und ja, dann wissen wir ok, in erx liegt jetzt die Adresse wo eben nur noch Werte drauf gerechnet würden das heißt in erx würde jetzt wahrscheinlich in Adresse liegen, wo nach der x-Achse kommt die y-Achse das ist unser Fund, deswegen plus 4 und danach würde wahrscheinlich die Direction kommen das können wir aber noch nicht wirklich sagen, aber das könnten wir hier raus erkennen hier oben ist der Anfang der Funktion was wir jetzt machen können, wir setzen hier einen Breakpoint, das habe ich mit der 5 gemacht und lasst mal kurz das Spiel weiterlaufen ja, jetzt hat er schon gebrakt, jetzt könnten wir uns hier die Register anschauen, hier unten sehen wir den Stack, ich zeig jetzt mal den ganzen Stack an, als erstes sehen wir den Return Pointer, die Adresse zu der eben return, also die Adresse, wo der Call stattfindet, das wäre dann quasi hier, hier wird der Aufruf gemacht und hier wird eben auf die Parameter Werte geschrieben und so würden wir uns nach und nach quasi die Funktion anschauen, ich habe noch ein paar Hex, deswegen würde ich jetzt gleich dazuspringen, was ich gesammelt habe, weil das ist auch ziemlich interessant ich habe mir jetzt mal in Lua für Cheat Engine ein paar Hex zusammengeschrieben, jetzt lasst mal das hier weiterlaufen okay, der Breakpoint ist noch da okay, in Cheat Engine würde ich hier auf Tools, dann Lua Engine gehen dann habe ich jetzt hier ein Fenster, wo ich Lua Code reinschneiden kann und ausführen kann Lua würde das, Cheat Engine würde den Lua Code dann für mich ausführen, jetzt habe ich hier einen Code, ich schreibe eigentlich nie in Lua, also aber für den Zweck habe ich jetzt was in Lua geschrieben sieht vielleicht für manche ein bisschen kacke aus aber tut mir leid was der Code macht, das ist jetzt die Spoiler, Spoiler das ist ein anderer Hex der Hex, den ich gezeigt habe war genau der, der immer zurückspringen, also Derb Score zum Moment Derb Score, ja ich speichere mir oben quasi den Pointer zur Ballklasse, wo die Werte aus für den Ball drin stehen der Ball Pointer unten habe ich einfach eine Funktion wofür ich ein Timer gesetzt habe, ich habe keinen Loop gemacht weil sonst würde Cheat Engine auch in dieser Schleife hängen deswegen habe ich einfach ein Timer gemacht der alle 300 Millisekunden die Funktion aufruft sonst würde ganz Cheat Engine hängen so jetzt tu ich mal den Code in die Engine packen und ausführen mit F3 beendigt das ganze dass ich da jetzt auch ein Stuck besetzen kann es würde vielleicht ein bisschen kacke ausführen weil dadurch das 300 Millisekunden jetzt einfach irgendein Wert also wenn ich den Wert noch kleiner machen würde dann würde es wahrscheinlich nicht wirklich zuverlässig funktionieren, weil die Position so nah am Score ist, dass er wahrscheinlich drüber springen würde und diese Scoreerkennung gar nicht mehr machen würde deswegen habe ich einen Wert genommen, der realistisch ist und 300 Millisekunden habe ich jetzt einfach mal Pimal Daumen genommen ich komme mal, was der Ball macht es sieht ziemlich kacke aus es gibt eine Stelle, wo der Ball ziemlich oft was Lustes macht aber wahrscheinlich wieder sieht man mal kennt, also er springt ziemlich komisch drin ja jetzt ist er wieder zu besprungen und jetzt hängt er irgendwie fest also irgendwie ein komischer Pack ja, das wäre der erste Heck man könnte jetzt mit dem Wert von 300 Millisekunden spielen oder es nicht in Cheat Engine machen, sondern einen Cheat schreiben das wäre dann wahrscheinlich sogar zuverlässiger mit F3 habe ich jetzt den Code beendet ich tu jetzt einfach einen Neustart den habe ich in anderen Code reinschieben den habe ich jetzt auch noch kurz zeige so ja, komm ja, das ist der Nacht, wenn man viel geklickt macht ja, das ist der Nacht, wenn man viel geklickt macht Moment, ich tu jetzt einmal hier den nächsten Heck aussuchen der zweite Heck ich zieh das einfach mal das Fenster hier rein der zweite Heck wäre KenStopMe, ein kreativerer Name ist mir nicht wirklich eingefallen was wir nehmen ist die Velocity des Balls und friesen sie einfach auf eine bestimmte Geschwindigkeit das heißt der Ball ist ständig in Bewegung und ja, da habe ich auch mal den OberhiekenStopMe genommen man könnte jetzt Wetten abschließen wie lang der Ball überlebt wo er überall reinspringt wäre vielleicht eine Idee Profit, was bringt es einem weiß ich nicht, Spaß vielleicht jetzt nehme ich mal einfach den Lua-Code und zeig ihn, wobei es ist gar kein Lua-Code sondern was ich jetzt habe ist ich habe einfach einen Wert und den kann ich ja friesen in Cheat Engine deswegen machen wir das mal ich öffne mir hier eine Cheat Table das kann ich nämlich auch machen nee, die Werte brauchen wir nicht mehr und da eben meine Werte drin speichern ich habe jetzt einfach mal Pinball Cheat Table genommen da liegen jetzt ein paar Werte drin da liegt die X-Position, X-Direction, Velocity das sind alles die Werte die ich eben habe ich will mal kurz nochmal Cheat Engine, weil ach so, weil der Ball noch nicht spawnet jetzt wird eigentlich der Konzept ausführt werden jetzt sehen wir rechts die Werte und jetzt friesen wir einfach mal auf 10 also 10 war ein ziemlich lustiger Wert oh, ich habe mich ja, moment jetzt habe ich hier die Halbseite von Cheat Engine geöffnet so 10 so oh man, wo ist denn die Maus hier so, jetzt gucken wir mal was der Ball macht so also jetzt springt er erst mal oben er wird sich gleich prüfen und jetzt springt er halt weiter ja, also er bleibt immer konstant auf 10, deswegen irgendwann solltet er auch mal ein Sandbox machen ja, okay manche macht doch ich warte eigentlich auf eine Sache die er oft macht die ziemlich lustig ist manchmal springt er rechts rein ich probier es auch mal zu wie viel Zeit habe ich noch? okay, dann warten wir mal kurz hm? das habe ich nicht ganz verstanden ah, dann würde er da oben hängenbleiben das habe ich schon mal gemacht 10 ist eigentlich ein ziemlich guter Wetter da bewegt er sich manchmal und springt wieder raus wenn ich jetzt zum Beispiel 20 machen würde würde er da oben immer klar, klar, klar, immer da hängenbleiben deswegen lassen wir es einfach mal wieder auf 10 und es würde gar nicht wirklich passieren ich warte eigentlich, dass er nämlich hier oben rechts oder oben links von springt dann löst er nämlich unten diesen Effekt quasi aus ich hoffe er macht es noch weil wirklich er zwingt gar nicht ziemlich könnte ich machen, aber ich tue, ja, da müsste ich Frechzeit komm springt rein bitte das habe ich gemeint mit Wettenabfließen ja, guck, ja jetzt ach nein mach doch bitte oh nee, er will nicht ich probiere es mal kurz ich mache mal die Spring Freestylake und probiere mal meine tollen Timball Skills F3 komm jetzt setzen wir mal den Speed auf 10 ich hoffe mal der Sound ist jetzt nicht zu laut er will jetzt wieder die ganze Zeit den Sound abspielen ah, jetzt aber wenn er nicht mehr rein spielen wieder hat er die ganze Zeit diesen schwierigen Geräusch gemacht er hätte nicht gedacht, dass der Ball noch da unten ist fand ich ziemlich wichtig deswegen wollte ich das euch zeigen naja, ich zeig ja mal einfach noch einen anderen Heck aber den fand ich auf jeden Fall lustig deswegen habe ich ihn noch gezeigt wo ist denn meine Präsentation hier nein ne? eine Frage ach so wo ist denn meine Folie im Hintergrund wo ist die Folie gerutscht machen wir mal Cheat Ender ein kleiner wo ist meine Folie jetzt ist sie irgendwo rausgeschritten ach so, die hat sie irgendwie da oben ich mache mal kurz hm oh man tut mir leid testen ne moment ah ok nee der hat es jetzt nur kurz nee ich probiere mal kurz zu maximieren nee da sind eigentlich nur noch zwei Hecks die kann ich euch dann auch so erklären das nächste wäre Death Skip das wäre das Lurescript was Death Skip macht es tut meine Punktzahl meine Y Position nehmen und sobald ich einen bestimmten Wert überschreite das heißt sobald ich jetzt sterben sollte tut er meine Y Direction invertieren das heißt ich springe immer vom Tod quasi weg das gucken wir uns mal an wir nehmen den Lure Code packen den Lure Engine so Execute Pinball ja ok, da ist schon die Position also er sollte gleich zum Selbstrausprachen also er spielt jetzt quasi er unterschreitet jetzt nicht diese Achse deswegen also ich hab dann auf die Velocity nochmal ein Offset draufgerechnet wenn ich ständig den gleichen Speed hat deswegen sollte er irgendwann sollte er irgendwann befreit, dass ich also er wird da jetzt den Zeit lang glaub ich drin bleiben nee, der will da nicht mehr raus nee kann ich machen Velocity 100 das was ich vorhin erzählt hab er wird auch nicht mehr rauskommen dafür ist er zu schnell ja also er wird das jetzt den ganzen Tag machen und wir benden jetzt einfach mal das Kippen ja ok, jetzt sollte er eigentlich langsamer werden tut er aber nicht und der letzte Hack den ich vorbereitet hab der Magnet Ball was der Magnet Ball macht er nimmt meine also er tut auch wieder den Score prüfen und sobald er sich erhöht tut er auch wieder meine Direction invertieren das heißt, wenn ich da abprall und einen Score mach dann sollte ich eigentlich abprallen, aber ich gehe wieder zurück und das kann ziemlich lustig aussehen das schauen wir jetzt jetzt am besten mal an also da ist halt auch komplett gefragt was hier für Ideen habt und das waren so meine Ideen so Pinball, na komm so so, jetzt schießen wir ihn einfach mal also da fällt er auch irgendwann ab aber da unten geht es gleich weiter ja, wenn ich, moment komm, geh doch dahin, warte ich fahr es eigentlich nur darauf, dass er hier links geht also es ist eigentlich dasselbe nur das Ende ist das ja invertieren dem fällt er auch noch ein Stück nach unten von unserem Score übertreffen ja, den wir testet machen wir es mal minus, aber ich denke mal er wird sich ganz normal bewegen, denke ich mal aber halt nur in die für ihn rückwärts also er wird sich wahrscheinlich rückwärts bewegen aber probieren wir es mal minus 10, habe ich es richtig schenken minus 10 oh ja hm ah ok ja ich weiß es nicht moment, wir lassen probieren es jetzt einfach mal aus, also danach können wir immer, oh ja also moment, ich habe ja Magnet Boy nicht ausgeschaltet, das mache ich mit F3 ja doch bei uns die ganze Zeit zurück, also ja das macht dabei minus 10, jetzt wissen wir es ja also ich denke mal wenn ich ihn hochschieße und dann minus 10 macht, dann würde er sich wahrscheinlich in die andere Richtung bewegen und sich ansonsten genau gleich verhalten, denke ich mal aber das könnten wir testen, wenn wir noch Zeit haben ich weiß nicht wie es aussieht nicht? ok, dann wäre es das mit meinem Vortrag ja danke für die Aufmerksamkeit