Wie funktionieren Trainer?



  • Trainer arbeiten eigentlich - sofern sie mit C++ programmiert wurden - mit:
    - FindWindow
    - GetWindowThreadProcessId
    - OpenProcess
    - Virtual- Alloc/Protect/Query
    - Read/WriteProssecMemory
    - CloseHandle

    - oft mit einer DLL (injection)
    - und meinst auch mit Asm



  • Im ProcessMemory der Anwendung liegt der Code nochmal, dort die entsprechenden Bytes patchen, die sind immer an der gleichen Stelle, du findest sie mit dem MemoryScanner und dem Debugger (Stichwort: AccessBreakpoints).



  • So ich habe mir jetzt sozusagen eine kleine Basis geschaffen: Initialisierungen - Alles ok! Nur bekomme ich immer Errorcode 5 [Access Denied] wenn ich versuche, die Score Adresse zu verändern:

    #include <windows.h>
    #include <iostream>
    
    using namespace std;
    
    int main(int argc, char **argv[])
    {
    	HANDLE hGameProcess;
    	HWND hGame;
    	DWORD dwProcessId;
    	cout<<"-->Initialize Console\t\t";
    	cout<<"[OK]"<<endl;
    	cout<<"-->Find Pinball Game\t\t";
    	hGame = FindWindow("Tetris", "Tetris");
    	if(hGame == NULL)
    	{
    		cout<<"[ERROR]"<<endl;
    		return 1;
    	}
    	else
    	{
    		cout<<"[OK]"<<endl;
    	}
    	GetWindowThreadProcessId(hGame, &dwProcessId);
    	cout<<"-->Open the Pinball Process\t";
    	hGameProcess = OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE, false, dwProcessId);
    	if(hGameProcess == NULL)
    	{
    		cout<<"[ERROR]"<<endl;
    		cout<<"[ERROR CODE]: "<<GetLastError();
    		if(GetLastError() == 5)
    			cout<<" ( Access Denied ) "<<endl;
    		return 1;
    	}
    	else
    		cout<<"[OK]"<<endl;
    
    	int data = 1337;
    	if(WriteProcessMemory(hGameProcess, (LPVOID) 0x00414230, (LPVOID) data, sizeof(data), 0) == false)
    	{
    		cout<<"[ERROR]"<<endl;
    		cout<<"[ERROR CODE]: "<<GetLastError();
    		if(GetLastError() == 5)
    			cout<<" ( Access Denied ) "<<endl;
    		return 1;
    	}
    	CloseHandle(hGameProcess);
    	return 0;
    }
    

    Habe ich hier irgendwas vergessen?

    Ich habe mir diesen MHS heruntergeladen und bin beeindruckt. Muss mich darin noch einarbeiten, jedoch das ausscannen von Adressen usw. klappt schonmal hervorragend. Nur das Problem oben...

    Ausgabe:

    -->Initialize Console [OK]
    -->Find Pinball Game [OK]
    -->Open the Pinball Process [OK]
    [ERROR]
    [ERROR CODE]: 5 ( Access Denied )

    Danke schonmal!



  • OpenProcessToken()
    LookupPrivilegeValue()
    AdjustTokenPrivileges()

    😉



  • Langsam verlier ich den Überblick. Ich soll extra Informationen abrufen, ob mir das System erlaubt, Speicher eines anderen Prozesses auszulesen? Allein die Erweiterung des Codes um diese Zeilen:

    if(OpenProcessToken(hGameProcess, TOKEN_ADJUST_PRIVILEGES, &hToken) == false)
    {
    	cout<<"[ERROR]"<<endl;
    	cout<<"[ERROR CODE]: "<<GetLastError();
    	if(GetLastError() == 5)
    		cout<<" ( Access Denied ) "<<endl;
    	return 1;
    }
    

    löst den Fehler (Access Denied) aus...

    Aktueller Code

    #include <windows.h>
    #include <iostream>
    
    using namespace std;
    
    int main(int argc, char **argv[])
    {
    	HANDLE hGameProcess, hToken;
    	HWND hGame;
    	DWORD dwProcessId;
    	LUID luid;
    	TOKEN_PRIVILEGES tp;
    	int data = 1337;
    
    	cout<<"-->Find Pinball Game\t\t";
    	hGame = FindWindow("Tetris", "Tetris");
    	if(hGame == NULL)
    	{
    		cout<<"[ERROR]"<<endl;
    		return 1;
    	}
    
    	cout<<"[OK]"<<endl;
    
    	GetWindowThreadProcessId(hGame, &dwProcessId);
    	cout<<"-->Open the Pinball process\t";
    	hGameProcess = OpenProcess(PROCESS_VM_READ | PROCESS_VM_WRITE, false, dwProcessId);
    	if(hGameProcess == NULL)
    	{
    		cout<<"[ERROR]"<<endl;
    		cout<<"[ERROR CODE]: "<<GetLastError();
    		if(GetLastError() == 5)
    			cout<<" ( Access Denied ) "<<endl;
    		return 1;
    	}
    	cout<<"[OK]"<<endl;
    	cout<<"-->Open process token\t";
    	if(OpenProcessToken(hGameProcess, TOKEN_ADJUST_PRIVILEGES, &hToken) == false)
    	{
    		cout<<"[ERROR]"<<endl;
    		cout<<"[ERROR CODE]: "<<GetLastError();
    		if(GetLastError() == 5)
    			cout<<" ( Access Denied ) "<<endl;
    		return 1;
    	}
    	cout<<"[OK]"<<endl;
    
    	LookupPrivilegeValue(NULL, SE_SECURITY_NAME, &luid);
    
    	tp.Privileges->Attributes = SE_PRIVILEGE_ENABLED;
    	AdjustTokenPrivileges(hToken, false, &tp, NULL, NULL, NULL);
    
    	if(WriteProcessMemory(hGameProcess, (LPVOID) 0x00414230, (LPVOID) data, sizeof(data), 0) == false)
    	{
    		cout<<"[ERROR]"<<endl;
    		cout<<"[ERROR CODE]: "<<GetLastError();
    		if(GetLastError() == 5)
    			cout<<" ( Access Denied ) "<<endl;
    		return 1;
    	}
    	CloseHandle(hGameProcess);
    	return 0;
    }
    

    Hoffe auf Hilfe
    mfg



  • Versuch das hier:

    void 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);
    }
    

    EnableDebugPrivilege( ); einfach am Anfang deines Codes ausführen.

    Gruß Tobi



  • So ähnlich mach ich das auch, ist wohl so üblich.





  • Was heißt "ist wohl so üblich", dir bleibt keine Wahl. Ok bei manchen alten Programmen funktioniert das Schema auch ohne sich mehr Privilegien zu besorgen, aber heute und gerade unter Vista geht es gar nicht mehr ohne.



  • Ich meine eine Funktion zu schreiben namens EnableDebugPrivilege() ...



  • Einer hats vorgemacht, alle anderen machens nach bzw. Copy und Paste 😉



  • Ich meine eine Funktion zu schreiben namens EnableDebugPrivilege() ...

    Naja, wie willst du die Funktion denn sonst nennen? Franz?


Anmelden zum Antworten