Memory aus Spiel auslesen



  • Hallo, ich wollte einen Wert auslesen um in Assetto Corsa die Bremsbalance für jeder Kurve anzupassen, mein Problem ist, dass ich ein absoluter Neuling in Sachen programmieren bin, daher wollte ich mal nachfragen, wieso ich bei einem so kleinen Copy Paste schon ein Error bekomme, das Spiel welches dort im Szenario verwendet wurde ist Counter Strike Souce, mein Gedanke war, dass ich die Bezeichnungen wie zb. Ammo so lasse und nur die Adresse austausche.
    Zu berücksichtigen ist auch, dass ich mir ziemlich sicher bin, dass Counter Strike Source ein 32 bit spiel ist und Assetto ein 64 Bit spiel..., ich wäre für jede Antwort sehr dankbar MfG

    Bild

    #include <iostream>
    #include <Windows.h>
    #include <string>
    using namespace std;
    
    DWORD pid;
    DWORD Ammo = 0x1A2CAD3E44C
    
    int MyAmmo;
    
    int main()
    {
    	HWND hWnd = FindWindowA(0, ("Assetto Corsa"));
    	GetWindowThreadProcessId(hWnd, &pid);
    	HANDLE pHanle = OpenProcess(PROCESS_VM_READ, FALSE, pid);
    	ReadProcessMemory(pHanle, (LPVIOD)Ammo, &MyAmmo, sizeof(MyAmmo), 0);
    	cout << MyAmmo << endl;
    	system ("Pause);
    }
    


  • @Slucks sagte in Memory aus Spiel auslesen:

    ein Error bekomme

    So viele Details, mal nachdenken ...



  • @Slucks sagte in Memory aus Spiel auslesen:

    daher wollte ich mal nachfragen, wieso ich bei einem so kleinen Copy Paste schon ein Error bekomme,

    Weil da ein Fehler ist.



  • @Slucks sagte in Memory aus Spiel auslesen:

    DWORD Ammo = 0x1A2CAD3E44C

    Aus einem kompilierbaren Quelltext heraus kopiert ist das nicht (Semikolon). Ein DWORD ist außerdem 4 Byte breit (unabhängig von x86/x64) und daher passt es schon mal grundsätzlich nicht.
    Returnwertüberprüfung und evtl. Beschaffen von Debug-Privilegien könnten helfen.
    Aber warum nimmst du nicht einfach fertige Software dafür? Wenn man es richtig machen möchte, ist es mit 10 Zeilen Code nicht getan und für ein erstes Projekt auch nicht unbedingt empfehlenswert.



  • @yahendrik danke für deine Antwort, welche Alternative schwebt dir so vor ?



  • Und einfach Cheatengine dafür nutzen möchtest du nicht? Denn Speicher auslesen, umschreiben uvm. ist ja eigentlich genau die Aufgabe davon.

    Falls du mehr als nur dieses eine Beispiel umsetzten willst solltest du dich erstmal mehr mit der Sprache beschäftigen. Wie bei deinem Beispiel mit der WinAPI anfangen ist sicher keine gute Idee 🙂



  • @Zhavok Ja eigentlich ist das ausreichend, nur wenn ich ein Trainer erstelle, dann wird mir nirgendswo ein Value wert angezeigt, daher wollte ich es mit einem Programm machen.



  • @yahendrik sagte in Memory aus Spiel auslesen:

    evtl. Beschaffen von Debug-Privilegien könnten helfen.

    Nicht nur eventuell.



  • Ich muss zugeben, angefangen habe ich auch mit Memory hacking xD

    Ist wie alle schon sagten keine leichte Lektüre und vieles versteht man erst, wenn man sich mit simpleren Sachen oder grundlagen wie Prozessoren beschäftigt (warum zb 0x1A2CAD3E44C überhaupt benötigt wird bzw was das ist).

    Möchtest du nur ein paar Trainer machen empfehle ich dir AutoIT + YoutubeTutorials über MemoryHacking mit AutoIt oder Forums einträge wenn du etwas mit Englisch bewandert bist. (wobei die gesamte Wiki auch auf Deutsch übersetzt wird/wurde)

    Extrem einfach eine GUI zu machen und auch das schreiben eines Hacks (NomadMemory.au3 und anderen vorprogrammierten dingen) und einfachen Bots ist mit nen paar Zeilen Code (bzw Script bevor darüber eine Diskussin entbrent) erledigt. (Natürlich vorrausgesetzt du beheerscht debugger wie CheatEngine o.ä.)

    Aber das geht natürlich auch NUR bei Singelplayer und ungeschützten Multiplayer. Wird es komplizierter solltest du auf zb. DLLs die du mit C++ erstellst wohl zurückgreifen.

    Sollte dir das ganze Spaß machen und du es wirklich lernen wollen, ist C++ aufjedenfall ein richtiger ansatz zum Hacken. Allerdings nicht von heute auf Morgen. Ich bin jetzt 6Jahre dran un lerne immer noch dazu.

    Jetzt zum Code:

    
    
    #include <iostream>
    #include <Windows.h>
    #include <string>
    using namespace std;  
    
    DWORD pid;
    DWORD Ammo = 0x1A2CAD3E44C   
    
    int MyAmmo;
    
    int main()
    {
    	HWND hWnd = FindWindowA(0, ("Assetto Corsa"));
    	GetWindowThreadProcessId(hWnd, &pid);
    	HANDLE pHanle = OpenProcess(PROCESS_VM_READ, FALSE, pid);
    	ReadProcessMemory(pHanle, (LPVIOD)Ammo, &MyAmmo, sizeof(MyAmmo), 0);
    	cout << MyAmmo << endl;
    	system ("Pause);
    }
    

    Zeile 6
    Aus eigner Erfahrung kann ich nur sagen gewöhn dir das ab. Das führt zu total komischen irrationalen fehlern.
    Nutze lieber std::cout, std::cin o.ä.
    Ich hab mal beim schreiben meines Bots deswegen über 4h fehler suche gemacht x.x

    Beispiel von dir:

    //das
    cout << MyAmmo << endl;
    //ändern zu
    std::cout << MyAmmo << std::endl;
    //oder was auch geht
    std::cout << MyAmmo << "\n";
    

    \n ist ein Zeilenumbruch (in ich glaube ASCI). Damit kannst du zb Strings beenden und es wird automatisch ein Zeilenumbruch wie bei endl hinzugefügt.
    Also stadt: "Hallo Welt" -> "Hallo Welt\n" zb.

    Zeile 9
    Dword ist wie schon erwähnt nur 4Byte also 8*4Bits lang. Wobei ein Bit halt 0/1 ist.
    im normalfall schreibt man 1Byte so: XXXX XXXX
    du hast eine Zahl in der Zahlendarstellung Hexadezimal (einfach mal googeln, zahlendarstellung und umrechnung ist wichtig) die wird in Bits umgerechnet. Pro Hex Ziffer (also von 0 bis F wobei 0x nur als erkennung einer Hex zahl dient) kann man 4Bit nehmen (liegt an der Umrechnung). Ergo brauhst du mindestens 44Bits, du hast aber nur 32Bits im DWORD format zum abspeichern. Ergo must du aufjedenfall schon mal das Speicherformat ändern.

    Kannst du nicht deine Adresse direkt in LPVIOD (siehe Zeile18 an der stelle Ammo) Speichern? Wenn nein dann probier es mit einem unsigned int. Ich hab das einfach zu lange nicht mehr gemacht ^^

    Close
    Ich meine du must jeden Prozess den du öffnest auch wieder schliesen mit CloseProcess() o.ä. könnte aber auch sein das ich mich in der Sprache vertuhe.

    Windows Rechte
    Wurde schon erwähnt.

    Grundsetzlich könntest du dir malDLL und DLL Injection for Memory Hacking anschauen. Das macht die sache aufjedenfall einfacher und gibt dir deutlich mehr möglichkeiten, ist aber auch etwas komplexer.