Daten aus einem Spiel(fifa11) auslesen



  • Hallo Leute,

    ich hätte mal ne Frage:
    Ist es möglich, das man ein Programm schreibt, das wenn man in Fifa ein Tor schießt dann in eine Txt schreibt: "1:0 England vs Deutschland".

    Leider bin ich noch nicht sehr erfahren, wie schwer ist so etwas?

    lg ande



  • FIFA ist eine in sich geschlossene Applikation und wenn die nicht zufällig irgendwelche Logfiles schreibt, oder eben besagte Information in irgendwelchen Dateien speichert, dann sieht es schlecht für dich aus.



  • Ja sollte gehen.

    Versuch mit Cheat Engine die Speicheradresse zu finden welche die Tore speichert.

    Dann mit ReadProcessMemory einfach die Speicherstelle beobachten.

    Stell das Spiel auf ganz leicht mach immer Tore dann guck mit Cheat Engine immer nach den sich ändernden Werten.

    Aber das klappt nicht bei jedem Spiel so einfach.

    #include <windows.h>
    #include <iostream>
    using namespace std;
    
    void read_addr ( HANDLE );
    void write_to_addr ( HANDLE   );
    
    int main()
    {
    
    HWND hwnd = 0;
    DWORD ID = 0;
    HANDLE handle = 0;
    
    int auswahl = 0;
    char win_title[256] = "0";
    
    cout<<"Fester Titel von zu Manupulierendem Programm eingeben: ";
    cin.getline ( win_title , 256);
    
    	hwnd = FindWindow(NULL, win_title );
    
    	if(!hwnd)
    	{
    	        cout<<"Fehler Programm konnte nicht gefunden werden !"<<endl;
    		system("PAUSE");
    		return 0;
    	}
    
    	GetWindowThreadProcessId(hwnd, &ID);
    	handle = OpenProcess(PROCESS_ALL_ACCESS, false, ID);
    
    while (1)
    {
    system("CLS");
    
            cout<<"(1) Adressen lesen"<<endl;
            cout<<"(2) Wert an Adresse schreiben"<<endl;
            cout<<"Auswahl: ";
            cin>>auswahl;
    
            switch ( auswahl )
            {
                    case 1:
                            read_addr ( handle );
                    break;
    
                    case 2:
                            write_to_addr ( handle );
                    break;
    
                    default:
                            cout<<"Falsche eingabe 1 oder 2 eingeben !"<<endl;
                            system("PAUSE");
                    break;
            }
    }
    
    system("PAUSE");
    
    CloseHandle(handle);
    return 0;
    }
    
    void read_addr ( HANDLE handle  )
    {
    unsigned adresse = 0;
    int puffer = 0;
    
    system("CLS");
    cout<<"Zu lesenden Adresse eingeben: ";
    cin>>adresse;
    
    	ReadProcessMemory(handle, (  LPCVOID  )adresse, &puffer , sizeof(puffer) , 0);
            cout<<"Adress Wert: " << puffer << endl;
            system("PAUSE");
    }
    
    void write_to_addr ( HANDLE handle )
    {
    
    int wert = 0;
    int puffer = 0;
    
    unsigned addr = 0;
    
    DWORD rw  = 0;
    
    system("CLS");
    
            cout<<"Speichadresse eingeben an die die Daten geschrieben werden sollen: ";
            cin>>addr;
    
            cout<<endl;
    
            cout<<"Wert eingeben welcher an die Speicheradresse geschrieben werden soll: ";
            cin>>wert;
    
            WriteProcessMemory(handle, (LPVOID)addr, &(puffer = wert ), sizeof(int), &rw);
    
    }
    

    Versuch mal von diesem Programm den Wert 19 zu ändern also so das dass Programm nicht mehr den Wert 19 sondern z.b. 4 ausgibt.

    cout<< &var; <-- Speicheradresse von der Variable int var

    Kannst ja mit einer for Schleife einen einfachen Counter machen der runterzählt und dann die Werte versuchen mit Cheat Engine zu finden.

    #include <windows.h>
    #include <iostream>
    
    int main()
    {
    
    SetConsoleTitle("test programm");
    int var = 19;
    
            while (1)
            {
            system("CLS");
                    std::cout<< var << "    " << &var << std::endl;
            	Sleep(1500);
            	std::cout<< var << "    " << &var << std::endl;
            	Sleep(1500);
            }
    
    }
    


  • Ach ja noch was Reverse Engineering wäre auch noch eine möglichkeit. Das ist dann aber schon schwerer.



  • Danke für eure Antworten, aber ich denke das ich das noch nicht schaffe.. 😃
    außer dem kann ich nur c#.. :S

    lg



  • blup schrieb:

    Ja sollte gehen.

    Versuch mit Cheat Engine die Speicheradresse zu finden welche die Tore speichert.

    Dann mit ReadProcessMemory einfach die Speicherstelle beobachten.

    Stell das Spiel auf ganz leicht mach immer Tore dann guck mit Cheat Engine immer nach den sich ändernden Werten.

    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 👍



  • GPC schrieb:

    blup schrieb:

    Ja sollte gehen.

    Versuch mit Cheat Engine die Speicheradresse zu finden welche die Tore speichert.

    Dann mit ReadProcessMemory einfach die Speicherstelle beobachten.

    Stell das Spiel auf ganz leicht mach immer Tore dann guck mit Cheat Engine immer nach den sich ändernden Werten.

    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 doch sehr schwer?
    Ich hab sowas schon mal gesehen, aber der wollte mir nicht sagen, wie man das macht



  • ande1255 schrieb:

    Also doch sehr schwer?
    Ich hab sowas schon mal gesehen, aber der wollte mir nicht sagen, wie man das macht

    Natürlich sehr schwer. Wenn ein Spiel bzw. eine Applikation im Allgemeinen kein Interface nach außen anbietet, sei es in Form von einer API oder einer Skriptsprache, wird es sehr knifflig. Ok, klar, man kann natürlich auch immer iwelche Sicherheitslücken nutzen und darüber Code einschleusen, aber auch das ist nicht ohne Weiteres möglich.



  • 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. )
    Und dann gibts ja diesen Konsolen Befehl wo man die Playmodels als Gitternetz sieht und man sieht die
    dann auch durch Wände.
    ( Ja ging beim Online Spielen hab ich aber nicht auf VAC Servern getestet. ^^ )

    @ ande1255

    Guck mal bei www.elitepvpers.de da findest du mehr Infos zu so Themen.



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


Log in to reply