Daten aus einem Spiel(fifa11) auslesen



  • blup schrieb:

    Ja, ReadProcessMemory... da müsste EA aber erst mal gesagt haben.. "Kommt Leute, lassen wir unseren Prozess einfach zum Spaß mal mit PROCESS_VM_READ" laufen"
    Und für WriteProcessMemory wäre auch noch PROCESS_VM_WRITE + PROCESS_VM_OPERATION notwendig

    Also in CSS kann man mit meinem Beispiel z.b. svcheats auf 1 setzen.^^
    ( Hab ich jedensfall letdens Jahr mal getestet. )

    Ich hab's nicht probiert, deshalb kp... aber ehrlich gesagt klingt das schon seeeehr merkwürdig. Prozesse haben ja nicht zum Spaß ihren eigenen Speicherbereich und der ist auch nicht umsonst standardmäßig vor externem Zugriff - z.B. per ReadProcessMemory - geschützt. Oder würdest du dich als Applikationsentwickler freuen, wenn irgendeiner in deinem Speicher liest/schreibt? 😉



  • Also, wo hier jetzt eh schon alles "verraten" wird 😉

    So fordert man Debug rechte für sein programm an.
    Dann klapts auch mit dem Speicher des Nachbarn ^^
    (Des anderen programms)

    bool EnableDebugPrivilege() 
    { 
    	TOKEN_PRIVILEGES priv; 
    	HANDLE hThis, hToken; 
    	LUID luid; 
    
    	hThis = GetCurrentProcess(); 
    
    	OpenProcessToken(hThis, TOKEN_ADJUST_PRIVILEGES, &hToken); 
    
    	LookupPrivilegeValue(0, "seDebugPrivilege", &luid); 
    
    	priv.PrivilegeCount = 1; 
    	priv.Privileges[0].Luid = luid; 
    	priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
    
    	AdjustTokenPrivileges(hToken, false, &priv, 0, 0, 0); 
    
    	CloseHandle(hToken); 
    	CloseHandle(hThis); 
    
    	return true; 
    }
    


  • Ich konnte zwar die debug Privilegien beitragen, habe aber auch selbst eine Frage:

    Wenn man so eine Adresse gefunden hat, ändert die sich bei jedem Programmstart?
    (Ist die also relativ zum Programmspeicher oder absolut angegeben?)



  • MisterX schrieb:

    Ich konnte zwar die debug Privilegien beitragen, habe aber auch selbst eine Frage:

    Wenn man so eine Adresse gefunden hat, ändert die sich bei jedem Programmstart?
    (Ist die also relativ zum Programmspeicher oder absolut angegeben?)

    Die ist natürlich immer anders. Du hast es immer mit virtuellen Adressen zu tun.

    MisterX schrieb:

    Also, wo hier jetzt eh schon alles "verraten" wird 😉

    So fordert man Debug rechte für sein programm an.
    Dann klapts auch mit dem Speicher des Nachbarn ^^
    (Des anderen programms)

    Ja, debug mode. Aber auch nur solange der Speicher nicht geschützt wird (protected memory segments). Vermutlich werden aber nicht alle oder wenige, keine Ahnung, diesen Aufwand treiben.



  • [quote="GPC"]

    MisterX schrieb:

    Ich konnte zwar die debug Privilegien beitragen, habe aber auch selbst eine Frage:

    Wenn man so eine Adresse gefunden hat, ändert die sich bei jedem Programmstart?
    (Ist die also relativ zum Programmspeicher oder absolut angegeben?)

    Die ist natürlich immer anders. Du hast es immer mit virtuellen Adressen zu tun.

    Wenn man eine Adresse gefunden hat sagen wir mal X und die Startadresse des Programms kennt sagen wir mal Y. Und man rechnet Z = X - >
    Ist dann beim nächsten Programmstart die Stelle wieder bei Y + Z zu finden?



  • Ich meinte Z = X - Y



  • gelöscht, habs rausgefunden



  • MisterX schrieb:

    Wenn man eine Adresse gefunden hat sagen wir mal X und die Startadresse des Programms kennt sagen wir mal Y. Und man rechnet Z = X - >
    Ist dann beim nächsten Programmstart die Stelle wieder bei Y + Z zu finden?

    Nein, auch das ist nicht garantiert.

    Edit: Zitat eingefügt



  • 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?



  • 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?

    Ich weiß es nicht, weil ich keine Spieletrainer kenne und auch keine brauche 😃 Was seid ihr eig. für n00bs? :p Ne, im Ernst. Ich hab ka ob diese Spieletrainer dann ein Interface oder eine Skriptsprache eines Spiels nutzen. Oder ob sie im Speicher rumlesen und sich auf undefiniertes Verhalten verlassen.



  • Das geht so:
    http://www.x-simulator.de/wiki/Cheat_engine#Finding_static_game_values_.28integer_and_float_as_sample.29

    Aber einfach ist das wirklich nicht.
    Man muß erst eine ganze Menge über Speicherverwaltung lernen !



  • 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