Werte der RAM Adressen verändern



  • @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.


Anmelden zum Antworten