[C++] Basepointer von Solitär!?

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • [C++] Basepointer von Solitär!?

      Hiho,
      brauche etwas Hilfe bei meinem Problem. Habe versuch den Basepointer von Solitär herauszufinden und bin dabei leider gescheitert.
      Ohne Pointer, sprich dynamisch, kann ich mit diesem Code prima den Punktestand verändern. Sobald ich jedoch dem vermeintlichen Basepointer die Offsets hinzufüge, hörts dann auf.

      C-Quellcode

      1. #include <iostream>
      2. #include <Windows.h>
      3. #define DEBUG
      4. int main() {
      5. HWND solitaire;
      6. DWORD basepointer, id, offset[2], score, value;
      7. HANDLE processHandle;
      8. basepointer = 0x000BAFA8;
      9. offset[1] = 0x50;
      10. offset[2] = 0x14;
      11. while (1) {
      12. solitaire = FindWindow(0, L"Solitär");
      13. if (solitaire) {
      14. std::cout << "Ein aktiver Solitaer Prozess konnte gefunden werden!" << std::endl;
      15. GetWindowThreadProcessId(solitaire, &id);
      16. std::cout << "Process ID: " << id << std::endl;
      17. processHandle = OpenProcess(PROCESS_VM_WRITE | PROCESS_VM_OPERATION | PROCESS_VM_READ, false, id);
      18. ReadProcessMemory(processHandle, (LPVOID)basepointer, &value, sizeof(int), NULL);
      19. #if defined(DEBUG)
      20. std::cout << value << std::endl;
      21. #endif
      22. value += offset[0];
      23. #if defined(DEBUG)
      24. std::cout << value << std::endl;
      25. #endif
      26. ReadProcessMemory(processHandle, (LPVOID)value, &value, sizeof(int), NULL);
      27. #if defined(DEBUG)
      28. std::cout << value << std::endl;
      29. #endif
      30. value += offset[1];
      31. #if defined(DEBUG)
      32. std::cout << value << std::endl;
      33. #endif
      34. ReadProcessMemory(processHandle, (LPVOID)value, &value, sizeof(int), NULL);
      35. std::cout << "Aktueller Punktestand: " << value << std::endl;
      36. std::cout << "Neuer Punktestand: ";
      37. std::cin >> score;
      38. WriteProcessMemory(processHandle, (LPVOID)value, &score, sizeof(int), NULL);
      39. std::cout << "Der Punktestand wurde veraendert." << std::endl << std::endl << "--------------------------" << std::endl << std::endl;
      40. std::cin.get();
      41. } else {
      42. std::cout << "Es konnte kein Solitaer Prozess gefunden werden." << std::endl
      43. << "Druecke Enter um es erneut zu versuchen." << std::endl;
      44. std::cin.get();
      45. }
      46. }
      47. }
      Alles anzeigen


      Auf dem Screenshot unten kann man sehen, wie ich auf die Punktestand-Adresse komme. Soweit klappts auch. Nur wie ich das solitaire.exe+BAFA8 in Programmiersprache umsetze, hab ich noch nicht so ganz geschnallt.. irgendwer eine Erklärung?



      mfg
    • Werbung zur Unterstützung des Forums ( Bitte AddBlocker deaktivieren )

    • Du musst dir das Handle ran holen, mit nem Prozess Inject o.ä und dann via GetModuleHandle das Handle abfragen und dann einfach dein Offset addieren.
      Alternativ musste nicht Injecten sondern nimmst halt die WinApi FindWindow.

      Pointer = Handle + 0x00******;

      Das war in deinem CE als Solitaire.exe Angezeigt wird, ist in CE zbsp das Handle.
      Hier nochmal ein Beispiel:

      stackoverflow.com/questions/11…nter-to-edit-a-value-in-c
    • Danke für den Hinweis. Habe leider das Problem, dass man dazu nicht sonderlich viel findet und mir GetModuleHandle momentan nur 0 zurückliefert.

      Quellcode

      1. moduleHandle = (DWORD)GetModuleHandle(L"Solitaire.exe");


      Irgendwas falsch gemacht?

      €: Habe mal weiter geschaut.. eine Alternative wäre es, eine DLL zu injecten und dann per GetModuleHandleA(0) die Basisadresse zu bekommen.. aber eig müsste es doch auch so klappen?
    • Du verwechselst da GetModuleHandle mit FindWindow,
      Das ModuleHandle kannst du nur beziehen, wenn du eine DLL Bastelst die
      sich den Speicher mit der Anwendung teilt.

      FindWindow schaut so aus:

      HWND hWnd = FindWindow(NULL, TEXT("Unbenannt - Editor"));
      HANDLE pHandle;
      DWORD pid;

      if(hWnd != 0) {
      cout << "Notepad gefunden";
      GetWindowThreadProcessId(hWnd, &pid);
      pHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); // Handle beziehen
      }
      else {
      cout << "Notepad nicht gefunden";
      }

      getchar();


      Hab dir das mal eben erstellt:
      pastebin.com/9UFpupTB
    • Synaptic;315802 schrieb:

      Du verwechselst da GetModuleHandle mit FindWindow,
      Das ModuleHandle kannst du nur beziehen, wenn du eine DLL Bastelst die
      sich den Speicher mit der Anwendung teilt.

      FindWindow schaut so aus:



      Hab dir das mal eben erstellt:
      [C++] // xxx.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung. // #in - Pastebin.com

      Ok, lag ich mit meiner Annahme doch richtig - schaue ich dann mal, dass ich eine DLL injecte.

      Das mit dem Fenster war halt so eine Idee, weil ich nicht wusste, was für Parameter diese Funktion braucht (ja, mit LPCTSTR lpModuleName kann ich leider nicht soviel anfangen) und das irgendwo stand.

      Ansonsten danke ich dir für deine Hilfe - werde ich dann mal schauen^^