Wie funktionieren Trainer?
-
Hi, ich habe mal eine Frage bezüglich von Trainern. Ich habe schon viele Trainer gesehen, die einfach bestimmte Daten im Spiel ändern. Jedoch ist es doch immer unterschiedlich, in >welcher< Adresse sich der Wert (z.B.) Leben befindet. Wenn ich jetzt z.B. mehrere Level in dem Spiel gespielt habe, so wird sich der Lebenswert doch immer an einer anderen Adresse befinden oder nicht (freigeben und neu reservieren)? Ich kenne auch ein Programm, was mit dem Suchprinzip funktioniert [Anfangswert -> Adressen kopieren -> Neuer Wert -> Alte Adressen Verwerfen -> ...]. Das Funktioniert so gut wie immer, nur wie machen die Trainer denn das jetzt? Diese Suchfunktion durchzuführen würde doch viel zu Lange dauern oder nicht?
mfg
-
Also eigentlich gehört so ein Post in ein Hacker-Forum
Das was du suchst nennt sich Dynamic Memory Address(DMA), kannste ja mal nach suchen im Web und wie man mit MemoryScannern arbeitet kannst du ja mal hier nachfragen http://www.memoryhacking.com/forums/index.phpGruß Tobi
-
Wie man mit ihnen Arbeite ist mir klar, aber wie sie intern arbeiten ist mir nicht klar^^
Danke jedoch für deine Hilfe.
-
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.
-
Dazu gibts sogar Tutorials:
Teil 1: http://www.spieleprogrammierer.de/phpBB2/viewtopic.php?t=9538
Teil 2: http://www.spieleprogrammierer.de/phpBB2/viewtopic.php?t=9544
-
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?