[C/C++] Crysis 2 Trainer +1 Inkl. Pointer Scanner

Dieses Thema im Forum "Projekte / Codes" wurde erstellt von N0S, 27. März 2011 .

  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,&currentValue,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,&currentValue,4,&rBuf);
     if (!wpmRet) {
     printf("Error WriteProcessMemory %u\n",GetLastError());
     return;
     }
    
     wpmRet = WriteProcessMemory(hProcess,(LPVOID)nanoCatHUDPointer,&currentValue,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;
    }
     
  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
     
  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
     
  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.
     
  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.
     
  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^^
     
  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ß
     
  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.
     
  9. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.