#1 27. März 2011 Crysis 2 Trainer +1 Inkl. Pointer Scanner In Zeiten von halbfertigen Spielen, die erst beim Kunden zur Endversion mutieren sollte man Pointer Scanner in den Trainer einbauen um völlig unabhängig von irgendwelchen Patches zu sein. Dieser Trainer fügt 100 Nano catalyst Punkte hinzu, er funktioniert mit allen bereits erhältlichen Patches und wird auch in Zukunft noch funktionieren. Außerdem Kopierschutz/Crack unabhängig. Code: #include <stdio.h> #include <string.h> #include <windows.h> #include <tlhelp32.h> #define PROCESS "Crysis2.exe" #define START_POINTER_SEARCH 0x01000000 #define DATA_BUFFER 0x5000 #define SEARCH_PATTERN "\x74\x32\x80\x78\x45\x01\x75\x2C\x80\x78\x44\x00\x75\x26\xC6\x40\x44\x01\x8B\x40\x3C\xF7\xD8\x50" #define SEARCH_PATTERN_MASK "xxxxxxxxxxxxxxxxxxxxxxxx" #define NANO1 0x194 #define NANOCATALYST1 0x4A0 #define NANO2 0xB0 #define NANOCATALYST2 0x100 DWORD pid = 0; DWORD nanoCatPointer = 0; DWORD nanoCatHUDPointer = 0; DWORD gamePointer = 0; DWORD magicValue = 0; bool once = true; DWORD getProcessByName(char * processName); void addNanoCatPoints(int value); void getNanoCatPointer(); void pointerScanner(); bool findPointerPattern(HANDLE hProcess, DWORD_PTR address, PBYTE data); DWORD_PTR findPattern(DWORD_PTR startOffset, DWORD size, PBYTE pattern, const char * mask); void readInformationFromResult(DWORD_PTR result); int main(int argc, char *argv[]) { printf("Crysis 2 Trainer +1\n\nF1 - add 100 nano catalyst points\nF3 - exit me\n\n"); printf("[+] Waiting for game...\n"); while (1) { if (pid != 0) { if ((GetAsyncKeyState(VK_F1)&1)==1) { if (once) { getNanoCatPointer(); once = false; } addNanoCatPoints(100); } } else { pid = getProcessByName(PROCESS); if (pid != 0) { printf("[+] Game found\n\n"); pointerScanner(); if (gamePointer == 0 || magicValue == 0) { printf("[+] Sorry I can't find the pointer :-(\n"); break; } } } if ((GetAsyncKeyState(VK_F3)&1)==1) { break; } Sleep(300); } return 0; } void addNanoCatPoints(int value) { DWORD rBuf = 0; DWORD currentValue = 0; HANDLE hProcess = OpenProcess(PROCESS_VM_WRITE|PROCESS_VM_OPERATION|PROCESS_VM_READ, NULL, pid); if(!hProcess) { pid = 0; printf("Error OpenProcess %u\n",GetLastError()); return; } BOOL rpmRet = ReadProcessMemory(hProcess,(LPCVOID)nanoCatPointer,¤tValue,4,&rBuf); if (!rpmRet) { printf("Error ReadProcessMemory %u\n",GetLastError()); return; } printf("[+] You have currently %d nano catalyst points, I'm adding %d points\n",currentValue,value); currentValue += value; BOOL wpmRet = WriteProcessMemory(hProcess,(LPVOID)nanoCatPointer,¤tValue,4,&rBuf); if (!wpmRet) { printf("Error WriteProcessMemory %u\n",GetLastError()); return; } wpmRet = WriteProcessMemory(hProcess,(LPVOID)nanoCatHUDPointer,¤tValue,4,&rBuf); if (!wpmRet) { printf("Error WriteProcessMemory %u\n",GetLastError()); return; } CloseHandle(hProcess); } void getNanoCatPointer() { DWORD rBuf = 0; DWORD value1 = 0, value2 = 0; HANDLE hProcess = OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ, NULL, pid); if(!hProcess) { pid = 0; printf("Error OpenProcess %u\n",GetLastError()); return; } BOOL rpmRet = ReadProcessMemory(hProcess,(LPCVOID)gamePointer,&value1,4,&rBuf); if (!rpmRet) { printf("Error ReadProcessMemory %u\n",GetLastError()); return; } rpmRet = ReadProcessMemory(hProcess,(LPCVOID)(value1 + NANO1),&value2,4,&rBuf); if (!rpmRet) { printf("Error ReadProcessMemory %u\n",GetLastError()); return; } nanoCatHUDPointer = value2 + NANOCATALYST1; rpmRet = ReadProcessMemory(hProcess,(LPCVOID)(value1 + NANO2),&value2,4,&rBuf); if (!rpmRet) { printf("Error ReadProcessMemory %u\n",GetLastError()); return; } nanoCatPointer = value2 + (magicValue*4) + NANOCATALYST2; CloseHandle(hProcess); } DWORD getProcessByName(char * processName) { HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); PROCESSENTRY32 pe32; pe32.dwSize = sizeof(PROCESSENTRY32); if( !Process32First( hProcessSnap, &pe32 ) ) { printf("Error getting Process\n"); CloseHandle( hProcessSnap ); return 0; } do { if(!_stricmp(pe32.szExeFile, processName)) { CloseHandle(hProcessSnap); return pe32.th32ProcessID; } } while(Process32Next(hProcessSnap, &pe32)); CloseHandle(hProcessSnap); return 0; } void pointerScanner() { MEMORY_BASIC_INFORMATION memBasic = {0}; SIZE_T bufferSize = 0; DWORD_PTR address = 0; HANDLE hProcess = OpenProcess(PROCESS_VM_WRITE|PROCESS_VM_OPERATION|PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, NULL, pid); if(!hProcess) { pid = 0; printf("Error OpenProcess %u\n",GetLastError()); return; } if (VirtualQueryEx(hProcess,(LPCVOID)START_POINTER_SEARCH,&memBasic,sizeof(MEMORY_BASIC_INFORMATION)) != sizeof(MEMORY_BASIC_INFORMATION)) { printf("VirtualQueryEx failed %u\n",GetLastError()); return; } address = (DWORD_PTR)memBasic.BaseAddress; PBYTE data = (PBYTE)malloc(DATA_BUFFER); //printf("RegionSize %X BaseAddress %X\n",memBasic.RegionSize,memBasic.BaseAddress); for (DWORD_PTR i = 0; i < memBasic.RegionSize; i+=DATA_BUFFER) { if (findPointerPattern(hProcess,address + i,data)) { break; } } free(data); CloseHandle(hProcess); } bool findPointerPattern(HANDLE hProcess, DWORD_PTR address, PBYTE data) { DWORD_PTR result = 0; DWORD rBuf = 0; if (!ReadProcessMemory(hProcess,(LPCVOID)(address),data,DATA_BUFFER,&rBuf)) { printf("Error ReadProcessMemory %u\n",GetLastError()); return false; } result = findPattern((DWORD_PTR)data,rBuf,(PBYTE)SEARCH_PATTERN, SEARCH_PATTERN_MASK); if (result == 0) { return false; } else { readInformationFromResult(result); return true; } } void readInformationFromResult(DWORD_PTR result) { result += strlen(SEARCH_PATTERN_MASK) + 1; gamePointer = *((DWORD_PTR *)(result)); magicValue = *((PBYTE)(result+11)); printf("[+] Found pointer: %X\n",gamePointer); printf("[+] Found magic value: %X\n",magicValue); } DWORD_PTR findPattern(DWORD_PTR startOffset, DWORD size, PBYTE pattern, const char * mask) { DWORD pos = 0; size_t searchLen = strlen(mask) - 1; for(DWORD_PTR retAddress = startOffset; retAddress < startOffset + size; retAddress++) { if( *(BYTE*)retAddress == pattern[pos] || mask[pos] == '?' ) { if(mask[pos+1] == 0x00) { return (retAddress - searchLen); } pos++; } else { pos = 0; } } return 0; } + Multi-Zitat Zitieren
#2 29. März 2011 AW: Crysis 2 Trainer +1 Inkl. Pointer Scanner schönes tool hab es mal für lernzwecke auseinander genommen danke bitte mehr davon + Multi-Zitat Zitieren
#3 3. April 2011 AW: Crysis 2 Trainer +1 Inkl. Pointer Scanner Diese Aussage kannst du niemals treffen. Was würde passieren, wenn sich die Struktur so verändert, dass dein Pattern ungültig wird? Ansonsten schönes Ding, auch wenns langsam langweilig wird + Multi-Zitat Zitieren
#4 3. April 2011 AW: Crysis 2 Trainer +1 Inkl. Pointer Scanner Schon möglich, aber eher unwahrscheinlich. Bei einem Patch sollten Fehler beseitigt oder eben neue Features hinzugefügt werden. In der Regel macht man das aber so, dass man den vorhanden Code so wenig wie möglich ändert. In jedem meiner geposteten Trainer sollte man neue oder andere Elemente finden, so dass es eigentlich nie langweilig werden sollte. Den Pointer Scanner hab ich auch nur deshalb eingebaut. Der Code für die Trainer stammt in der Regel von meinen anderen Projekten, deswegen ist der Code meist auch unsauber^^ Aber der Punkt ist, ich lerne daraus nichts und poste das Zeug nur aus Freundlichkeit, wenn es also langweilig ist, lass ich es halt. + Multi-Zitat Zitieren
#5 3. April 2011 AW: Crysis 2 Trainer +1 Inkl. Pointer Scanner Ändert nichts an meinem Statement. So meinte ich das nicht. Ich meine generell den Bereich. Bin mir sicher, dass du auch andere interessante Sachen kannst Das der Pointer-Scanner "neu" ist, ist mir schon aufgefallen. + Multi-Zitat Zitieren
#6 3. April 2011 AW: Crysis 2 Trainer +1 Inkl. Pointer Scanner Na doch^^ ich denke das ist so wahrscheinlich, wie wenn ich behaupten würde "Crysis hat maximal 10 Bugs". Crysis 2 hat sicherlich über eine Millionen Zeilen Quellcode, da ist es einfach extrem unwahrscheinlich, dass die Entwickler da grad an dieser einen Code Stelle rumpfuschen, die ich für das Pattern verwendet habe. Achso :] Naja was anderes ist schwer, weil ich nicht so viele legale Projekte habe^^ + Multi-Zitat Zitieren
#7 6. April 2011 AW: Crysis 2 Trainer +1 Inkl. Pointer Scanner Der SearchPattern und NANO1 und NANO2 sind im Speicher die Adressen für den Wert für Nano oder? Also läuft das im Endeffekt in einer Endlosschleife über den Wert und setzt ihn immer wieder auf 100 ? Sehe ich das richtig ? Gruß + Multi-Zitat Zitieren
#8 7. April 2011 AW: Crysis 2 Trainer +1 Inkl. Pointer Scanner NANOn stellt einen Offset dar und der Pattern dient dazu, die passende Adresse zur Signatur zu finden um dann letztendlich die Speicherstelle mit den Nano-Punkten ausfindig zu machen. Ist das getan, werden per F1 jedesmal 100 Nano-Punkte hinzugefügt. + Multi-Zitat Zitieren