Werte der RAM Adressen verändern



  • Hallo,
    ich habe mir letztens ein wenig übers 'Cheaten' Gedanken gemacht. Ich kannte von der Funktion her Cheat-Engine, jedoch habe ich eine Zeit überlegt und wollte mal fragen, ob es möglich ist, auch in C++ eine Cheat Engine zu programmieren, ganz simpel, die anzeigt, was sich im Speicher befindet und ob und noch wichtiger, wie man so etwas verändern kann. Ich nehm jetzt mal ein ganz primitives Spiel wie Minecraft, dort habe ich Slots, in welchen sich die Items befinden, wenn ich nun diesen Wert der Anzahl der Items in diesem Slot verändern will, wie mach ich das (nur als Verdeutlichung) und was mich jetzt speziell noch fürs Network interessiert: würde sowas auf Servern auch funktionieren?
    MfG



  • Lies dich schlau darüber wie Computer so funktionieren.
    Was ist die CPU und was macht sie, wie funktionieren Programme, was bedeuten Begriffe wie Speicher (RAM), virtueller Speicher, Prozess (=das was ein Betriebssystem als "Prozess" bezeichnet) etc.
    Ein wenig Assembler sollte auch dabei sein, also du solltest zumindest fähig sein einfache Assemblerkonstrukte zu lesen und zu verstehen was sie machen (und wie sie es machen).

    Wenn du das alles intus hast, sollten sich die Fragen die du hier gestellt hast auch geklärt haben.
    Und ohne dass du das alles intus hast, ist es reichlich mühsam (=mir zu mühsam) zu erklären.

    Du darfst natürlich auch gerne darauf warten ob es jmd. anderem nicht zu mühsam ist.

    ps: Wie ein sog. "moving garbage collector" funktioniert könnte evtl. auch wichtig werden. Und zwar weil Minecraft in Java programmiert ist, und die Java Runtime eben so einen "moving garbage collector" verwendet. Und der macht alles ein wenig schwieriger für so Cheat Engines.



  • Ich will mal mein Glück mit der Antwort versuchen auch wenn mich die Pros hier dann vielleicht fertig machen^^

    Also... Jedes Programm darf prinzipell nur sein eigenen Speicher ansehen und manipulieren. Nur das Betriebssystem hat die Macht in alle RAM-Speicher von allen Programmen reinzugehen.

    Aber es gibt da paar Tricks:

    Möglichkeit 1: Du schreibst eine Dll. Du schiebst die Dll Minecraft unter. In den moment bist du nun ein Teil vom Minecraft-Programm. Nun darfst du dort im Speicher rumwühlen.

    Möglichkeit 2 (Hier bin ich mir nicht sicher ob das geht): Du schreibst ein Treiber, welcher unter Betriebssystemrechten läuft. Dieser Treiber darf dann nun auch auf Minecraft zugreifen.

    Möglichkeit 3: Über ein Debugger einklinken. Bei C# und vermutlich auch bei Java kann man sich an Processe Attachen. Darüber kann man dann einerseits den Quelltext sehen, wenn du die pdb-Dateien (bei C#) hast und anderseits da Ärger treiben.

    Die Schierigkeit: Rausfinden, welcher Speicheradresse/Programmzeile du überhaupt manipulieren musst.

    Außerdem könntest du auch die Exe-Datei direkt manipulieren -> Stichwort: Dissassembler.

    Übers Netzwerk funktioniert das ganze natürlich auch^^ Einfach den Server, auf dem das läuft mit Buffer-Overlow-Angriff austricksen und dann dort dein Code einschleusen.

    Aufgaben für dich:

    Was ist virtueller Speicher? Wieso sieht jeder Prozess nur seinen Speicher? -> Virtuelle Speicherverwaltung googeln

    Was ist eine Dll? Was ist ein Linker? Was bedeutet frühe und späte Bindung?



  • Vielen Dank erstmal für diese schöne Erklärung. Zu dem anderen Post, also Assembler kenne ich lediglich (ich habe schon in Assembler 'programmiert') die Z80 und dessen Kommandos und die Speicherverwaltung des ZX81.
    Ok, also unter virtuellem Speicher versteht man: einen Adressraum, der unabhängig vom realen Speicher ist und der dem Betriebssystem für Programme zugeteilt wird. Ich glaube das der Prozess nur seinen Speicher sieht hat einen wichtigen aber simplen Grund. Mein PCI Lehrer meinte mal, jetzt sind wir bei Assembler, bei den alten Computern waren gewisse Sektionen nicht geschützt, das konnte dazu führen, dass man falsche Speicheradressen wählte und möglicherweise den Computer zerstörte. Ich kannte das vom ZX81. Beispielsweise in einem Assembvlerprogramm, was man von BASIC aus aufrief,wenn man dort RET (FF) vergaß, konnte das zu unangenehmen Crashs führen 😃

    DLL's sind Bibliotheken, die erst während des Programmes in den Speicher geladen werden. Es scheint so zu sein, als nutze man sie wie Header, jedoch auch übergreifend auf andere Programmiersprachen. Korrigiere mich, wenn ich falsch liege. Ein Linker, so kenne ich ihn vom Compilerbau verknüpft Programmsegmente miteinander, um daraus eins zu machen. Bei frühe und späte Bindung kann ich nur spekulieren. Ich glaube das ist, je nachdem wie man das Programm kompiliert, wann etwas verlinkt wird. Korrigiere mich ggf. wenn ich falsch liege.

    Was ist dieser Buffer-Overflow-Angriff? Funktionieren nach diesem Prinzip diese Hackmods für Gameserver, die diese Skript-Kiddies verwenden 😃 ? Oder was macht das System dann?

    Vielen Dank, dass du mir hilfst.
    MfG!



  • XMAMan schrieb:

    Übers Netzwerk funktioniert das ganze natürlich auch^^ Einfach den Server, auf dem das läuft mit Buffer-Overlow-Angriff austricksen und dann dort dein Code einschleusen.

    Supertip von jemandem, der nichtmal buffer overflow richtig schreiben kann.

    @Christoph-C++:
    buffer overflow attacks sind was für die großen Jungs. Lass es dir einfach von XMAMan erklären wie es funktioniert. 😉



  • Buffer Overflow-Angriff geht so, dass du einem Programm, was eine Eingabe erwartet, mehr Daten sendet, als wie es damit zurecht kommt.

    Beispiel: Programm erwartet, dass du dein Name eingibst. Zum einlesen wird ein Char-Array angeben, was z.B. 100 Zeichen lang ist. Wenn der Nutzer nun 101 Zeichen angibt, dann lande das letzte Zeichen außerhalb des Arrays. Du kannst damit nun andere Variablen des Programms überschreiben. Wenn du weit genug über die Array-Grenze hinaus gehst, dann landest du vielleicht wieder im Programmspeicher (wenn er denn dahinter liegt). So kannst du dann dein eigenes Zeug einschleusen.

    Alles kein Hexenwerk wie du siehst^^



  • Anfänger vom Dienst

    eben.

    https://tuts4you.com/download.php?list.65
    ist wohl hilfreicher.

    Oder:
    https://www.youtube.com/watch?v=gT92xtcdz78



  • @Christoph-C++
    Weisst du wie die sog. "Cheat-Engines" grundsätzlich funktionieren? Was Zeiger sind und wie man damit arbeitet? Und wie "VM-Sprachen" wie Java so funktionieren?

    Kleiner Tip noch: Java Referenzen sind im Speicher oft keine Zeiger sondern liegen dort "kodiert" vor.
    D.h. mit einer klassischen Cheat-Engine hast du bei nem Java Programm keine Chance.
    Wenn dann wäre eine auf Java spezialisierte Cheat-Engine nötig.
    Und sowas ist ... vermutlich schon recht krass selbst zu entwickeln, glaube nicht dass du das hinbekommst.

    => Such dir besser ein "native" Spiel aus, also eines das nicht Java/.NET/... verwendet.

    Und was XMAMan geschrieben hat würde ich gleich mal wieder vergessen. Ist mMn. so ziemlich alles uninteressant. Zum Cheaten ala Cheat-Engine brauchst du eigentlich bloss ReadProcessMemory und WriteProcessMemory - alles andere wäre da denke ich unnötig kompliziert.



  • Naja mit CheatEngine bei Java Werte ändern geht schon. MineCraft und ein Spiel von nem Kumpel konnte man einfach knacken.



  • Naja, ich weiss nicht wie das zuverlässig funktionieren sollte.

    Die Java Runtime verschiebt Objekte beim Collecten. D.h. der einzig zuverlässige Weg die Objekte nach einer Collection wiederzufinden wäre sich von einem GC-Root ausgehend wieder zum Objekt durchzukämpfen.
    (Vorausgesetzt man kann überhaupt einen passenden GC-Root finden.)
    Und das kann mMn. eben nur mit einem auf die Java Runtime getrimmten Programm gehen, da die Java Runtime wie gesagt Referenzen nicht als normale Zeiger ablegt. Wenn man einfach nach der Adresse eines Objekts sucht, findet man die Referenzen im Speicher halt nicht.

    Natürlich kann es mit Glück ne Zeitlang funktionieren. z.B. wenn die Runtime die letzte Heap Generation lange genug nicht collected.



  • XMAMan schrieb:

    Alles kein Hexenwerk wie du siehst^^

    Cool.
    Dann erklär mir mal wie man mit nem Buffer-Overflow eigenen Code zur Ausführung bringt.


  • Mod

    hustbaer schrieb:

    XMAMan schrieb:

    Alles kein Hexenwerk wie du siehst^^

    Cool.
    Dann erklär mir mal wie man mit nem Buffer-Overflow eigenen Code zur Ausführung bringt.

    lass dich nicht auf das mobbing niveau von EOP runterziehen. XMAMan mag das nicht perfekt kennen, aber dann reicht auch ein hinweis. ihn hier blossstellen zu wollen ist nicht wofuer dieses forum da ist. (das ist kein vorwurf, EOP ist mit seinen einzeilern relativ effektive auch in anderen unterforen anzutreffen).



  • Ich hatte irgendwie das Gefühl es würde mit Zeigern funktionieren, dann wäre das C++ Programm 'recht' simpel. Normalerweise, wenn man eine Variable in C++ deklariert, wird die in einem Speicherbereich abgelegt. Dann kann man mit *variable den jeweiligen Zeiger abrufen, damit man weiß, wo die Variable liegt. Jedoch habe ich mich mit Zeigern noch nicht intensiv beschäftigt, darum weiß ich nicht, wie man diese Zeiger dann manipuliert. Spezielle Header-Datei?
    Welche Spiele wären denn einfacher zu knacken?
    Gruß



  • Dieser Hustbaer hat ein schönes Schlüsselwort gegeben. Mit ReadProcessMemory geht das anscheinend sehr einfach:

    http://tpforums.org/forum/threads/5863-ReadProcessMemory-C-Sample-code-amp-Question-for-advanced-C-users

    Dieser Befehl wird vermutlich auch vom Debugger verwendet.

    Also einfach zuerst die Startadresse vom Mainmodul finden.

    Console.WriteLine(Convert.ToString(Process.GetProcessesByName("Tibia")[0].MainModule.BaseAddress));

    Dann dort bei der StarAdresse einfach alles auslesen und schauen, wie sie die Zahlen verändern, wärend das Programm läuft:

    #include "stdafx.h"
    #include <Windows.h>
    #include <iostream>
    #include <string>

    using namespace std;

    int _tmain(int argc, _TCHAR* argv[])
    {
    HWND hwnd = FindWindow(L"TibiaClient",NULL);
    int value = 0;
    DWORD addr = 0x104E1E0;
    DWORD pid;
    cout << "Handle : " << hwnd << endl;
    cout << "Address: " << addr << endl;
    GetWindowThreadProcessId(hwnd,&pid);
    HANDLE phandle = OpenProcess(PROCESS_VM_READ,0,pid);
    cout << "Success: " << ReadProcessMemory(phandle, (void*)addr, &value, sizeof(value), 0) << endl;
    cout << "Read : " << value << endl;
    cout << "Error : " << GetLastError();
    cin.get();
    return 0;
    }

    Daraus kannste dann Rückschlüsse ziehen, welche Zahl was bedeutet. Oder halt systematisch probieren.

    Eine Sache, die ich als Problem sehe: Es gibt ja Stack-Variablen (Variablen die du innerhalb einer Funktion anlegst). Der Stack verändert sich ja immer je nachdem, in welcher Funktion du gerade bist. D.h., je nachdem zu welchen Zeitpunkt du auf den Stack zugreifst, haben die einzelnen Adressen <->Variablenzuordnung ja dann eine andere Bedeutung.

    Beim Heap-Speicher (new/Malloc) müsste es etwas besser aussehen. Wenn dort ein Minecraft-Objekt liegt, dann liegt es vermutlich auch so lange dort, wie das Objekt im Spiel/auf der Karte zu sehen ist. Dort kannste du also schon eher Schindluder treiben^^

    Vielleicht sagen ja die fachlich besseren Leute hier, ob meine Idee so funktionieren kann.



  • XMAMan schrieb:

    Beim Heap-Speicher (new/Malloc) müsste es etwas besser aussehen. Wenn dort ein Minecraft-Objekt liegt, dann liegt es vermutlich auch so lange dort, wie das Objekt im Spiel/auf der Karte zu sehen ist. Dort kannste du also schon eher Schindluder treiben^^

    Dieser Hustbaer hat auch dazu schon was geschrieben.
    Dieser XMAMan scheint es bloss nicht gelesen oder glatt ignoriert zu haben.



  • Ich sehe, du verwendest die VC++ Header <stdafx.h>
    ich aber verwende *shame on me* MacOS.. darum wird mir das nichts nützen, weil Microsoft ja so kapitalistisch einfach ihre Programme bis auf Office nicht für mac überträgt ...
    Naja, ginge das auch in NetBeans? xCode kann ich nicht installieren, da ich noch nicht erwerbsfähig bin und ohne Kreditkarte kann man sich nicht im Appstore registrieren.



  • hustbaer du Stenkerbolzen. Ständig machst du micht fertig^^

    Was soll jetzt Christoph hier über uns denken wenn wir uns wie Waschweiber aufführen?

    @Christoph: Veränderungen während der Laufzeit sind anscheind etwas schwerer, da dort der Garbage Collector mit reinspielt.

    Wie siehts mit Java-Decompliler aus? Du hast das Programm doch lokal bei dir liegen oder? Schau einfach mal, ob du mit jad lesbaren Quelltext bekommst.



  • rapso schrieb:

    lass dich nicht auf das mobbing niveau von EOP runterziehen.

    Wenn ich mobbe, dann auf relativ hohem Niveau.
    Grundsätzlich würde ich es aber eher als kommentieren bezeichnen.


Log in to reply