Daten aus einem Spiel(fifa11) auslesen



  • Danke für das TuT..

    Aber auch nach langem probiern pack ich es einfach nicht, den speicher zu finden... könnte es sein das es bei fifa nicht geht? 😮



  • Babylon5 schrieb:

    Hi,

    wie finden den diese Spiele-Trainer nach einem Neustart des Spiels die richtige Adresse des zu ändernden Wertes (z.B leben) wenn sich die Pointer jedesmal ändern?

    Man hat sogenannte statische Adressen, zu denen man berechnete Offsets addiert, um auf die gesuchte Speicherstelle zu kommen.
    Ich beschäftige mich seit 2 Tagen damit und habe bisher auch im Speicher von verschiedenen Spielen gepfuscht.



  • Wie es bei fifa konkret weiß ich nicht. Problematisch wirds immer wenn es nicht einen festen Zeiger auf die Speicheradrese gibt,
    sondern die Speicheradresse kompliziert berechnet wird. Ich habe es auch bei einigen Spielen versucht und bin bei vielen gescheitert.

    Bei einem Spiel bekomme ich diese Stelle als Zugriff auf die Lebenspunkte
    mov [esi+00000488],eax //Zugriff auf die Lebenspunkte

    Hier sieht man das der Wert des registers esi + einem Offset als Speicheradresse verwendet wird. Jetzt habe ich natürlich im Assembler die Stellen vorher angesehen. Leider wird der Wert im register esi kompliziert berechnet mit mehreren Werten aus Speicherstellen deren Positionen ebenfalls wieder kompliziert berechnet werden. An diesem Spiel bin ich gescheitert einen dauerhaften Zeiger, also einen Zeiger der bei jedem Neustart auf die Lebenszahl zeigt zu finden.

    In einem günstigen Fall findet man aber sowas wie:
    mov esi,0000a488h
    ...
    mov [esi],eax //Zugriff auf die Lebenspunkte

    Dann hat man mit 0000a488h einen einen festen Zeiger gefunden.

    Ab Windows Vista (und natürlich Windows 7) muß man besonders aufpassen:
    In früheren Windows Versionen begann die Speicherposition für jedes programm an einer festen Speicherstelle 0x400000. Feste Zeigerpositionen zu finden war also leicht möglich. Ab Windows Vista gibt es "address space layout randomization".
    Hierbei wird diese Startposizion zufällig verändert.
    Jetzt fragt man sich wie das Programm selbst die Speicherstellen findet wenn es doch z.B. feste zeiger verwendet. Hierzu wird bei der Ausführung beim Zugriff auf eine Speicherstelle die Differenz von 0x400000 zu dem zufällig gewählten Wert hinzuaddiert.
    Warum wird das nun so gemacht?
    Damit angriffe die auf Pufferüberläufe Zielen um Code einzuschleusen erschwert werden. Denn diese pufferüberläufe treffen jetzt zufällige Speicherstellen. So ist es sehr schwer mit dem Pufferüberlauf code in Speicherstellen zu schreiben die als ausführbares Programm interpretiert werden.

    Ich habe rausgefunden, dass diese neue zufällige Startposition des Speichers als "base adress" bezeichnet wird und so ausgelesen werden kann:

    HANDLE hModuleSnap = INVALID_HANDLE_VALUE; 
    MODULEENTRY32 me32; 
    hModuleSnap = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, process_ID ); 
    Module32First(hModuleSnap , &me32 );
    
    do 
    { 
    				_tprintf( TEXT("\n\n     MODULE NAME:     %s"),             me32.szModule ); 
    				_tprintf( TEXT("\n     executable     = %s"),             me32.szExePath ); 
    				_tprintf( TEXT("\n     process ID     = 0x%08X"),         me32.th32ProcessID ); 
    				_tprintf( TEXT("\n     ref count (g)  =     0x%04X"),     me32.GlblcntUsage ); 
    				_tprintf( TEXT("\n     ref count (p)  =     0x%04X"),     me32.ProccntUsage ); 
    				_tprintf( TEXT("\n     base address   = 0x%08X"), (DWORD) me32.modBaseAddr ); 
    				_tprintf( TEXT("\n     base size      = %d"),             me32.modBaseSize ); 
    
    } while( Module32Next(hModuleSnap, &me32 ) );
    

    Hierbei ist process_ID die ID die man mit GetWindowThreadProcessId (hwnd, &process_ID); bestimmt wie man sie ja auch zum Speicherzugriff benötigt.
    Der gesuchte wert steht in der Ausgabe die zur *.exe des programms gemacht wird in me32.modBaseAddr. (Die Ausgabe für die +exe ist meistens 8immer?) die erste Angabe in der do while Schleife.



  • Dbof schrieb:

    Babylon5 schrieb:

    Hi,

    wie finden den diese Spiele-Trainer nach einem Neustart des Spiels die richtige Adresse des zu ändernden Wertes (z.B leben) wenn sich die Pointer jedesmal ändern?

    Man hat sogenannte statische Adressen, zu denen man berechnete Offsets addiert, um auf die gesuchte Speicherstelle zu kommen.
    Ich beschäftige mich seit 2 Tagen damit und habe bisher auch im Speicher von verschiedenen Spielen gepfuscht.

    Warst du erfolgreich?
    Wenn ja bei welchen Spielen?



  • MisterX schrieb:

    Dbof schrieb:

    Babylon5 schrieb:

    Hi,

    wie finden den diese Spiele-Trainer nach einem Neustart des Spiels die richtige Adresse des zu ändernden Wertes (z.B leben) wenn sich die Pointer jedesmal ändern?

    Man hat sogenannte statische Adressen, zu denen man berechnete Offsets addiert, um auf die gesuchte Speicherstelle zu kommen.
    Ich beschäftige mich seit 2 Tagen damit und habe bisher auch im Speicher von verschiedenen Spielen gepfuscht.

    Warst du erfolgreich?
    Wenn ja bei welchen Spielen?

    Bisher hab ich es bei Risen und Prototype versucht.
    Du musst dich erstmal ernsthaft mit CheatEngine auseinandersetzen. Am besten führst du das Tutorial durch, was sich im Programmordner befindet.

    Hier habe ich mal ein kleines Beispiel zusammengestellt. Es ist ein Spiel namens "PikaBall" und der "Hack" (mit Code) dabei.
    http://www.mediafire.com/download.php?unuh3me7ctkp97s



  • danke aber ich kann nur c#
    damit hab ich leider nichts angefangen 😞


Anmelden zum Antworten