Solitär Punktestad verändern Hilfe bitte



  • Guten Tag zsm ich befasse mich noch nicht alzulange mit C++,allerdings habe ich einige Tuts gefunden um bei Solitär seinen Punktestandt verändern zu können.
    Ich bin jetzt auch schon zml "weit" damit ,allerdings habe ich i-wo noch einen Fehler sei es nun im Quelltext oder bei den Adressen darum wäre meine Frage ob sich den Quelltext mal jmd angucken könnte und mir bei evtl gemachten Fehlern vlt nen Tipp geben könnte was ich da besser machen kann,oder was daran ganz einfach Falsch ist.
    SO hier ist dann auch mal der Quelltext :
    #include "stdafx.h"

    #include <windows.h>
    #include <iostream>

    using namespace std;

    int main()
    {
    HWND hwnd; // Unsere Variable die das Fensterhandle speichert.
    hwnd = FindWindow(0,L"Solitär");

    // Der Fenstertitel vom Solitärfenster ist "Solitär". Das erste Parameter ist der "ClassName" den wir aber getrost ignorieren können. Das zweite Parameter ist unser Fenstername. Das "L" steht für eine Typkonvertierung..
    DWORD Id; // Die ID wird in einer Variable des Typ's DWORD gespeichert.
    HANDLE ProcessHandle;

    unsigned adress = 0x000BB038;
    unsigned offset1 = 0x5B4;
    unsigned offset2 = 0x30;
    unsigned adress2 = 0;
    unsigned adress3 = 0;
    unsigned adress4 = 0;
    int value ; // Der Wert den wir schreiben wollen.

    if(!hwnd)
    {

    cout << "Solitär nicht gefunden!" << endl;
    }
    else // ansonsten...
    {
    cout << "Solitär gefunden!" << endl;
    cout << "Fensterhandle: " << hwnd << endl; // Wir können uns das Handle auch nochmal angucken ...
    GetWindowThreadProcessId(hwnd,&Id); // Mit GetWindowThreadProcessId kann man die ID herausfinden. Das erste Parameter ist unser Fensterhandle. Das zweite gibt an, wo die ID gespeichert werden soll.
    cout << Id << endl;
    ProcessHandle = OpenProcess(PROCESS_VM_WRITE |PROCESS_VM_OPERATION ,false,Id);
    cout << "ProcessHandle: " << ProcessHandle << endl;
    ReadProcessMemory(ProcessHandle,(LPCVOID)adress,&adress2,sizeof(adress2),0); //Read what is in "address" and store it in "value", then what is the size of what we are going to read which is "value",and finally the number of bytes read, but I dont care about that so I put a 0, or NULL
    adress2 = adress2 + offset1;
    ReadProcessMemory(ProcessHandle,(LPCVOID)adress2,&adress3,sizeof(adress3),0);
    adress3 = adress3 + offset2;
    ReadProcessMemory(ProcessHandle,(LPCVOID)adress3,&adress4,sizeof(adress4),0);

    cout << &adress3 << endl;
    cout << adress3 << endl;
    cout << "How much points to add? ";
    cin >> value;

    fflush(stdin);

    WriteProcessMemory(ProcessHandle,(LPVOID)adress4,&value,sizeof(int),NULL); // Den Wert schreiben !
    cout << "Wert geschrieben" << endl;
    }

    cin.get(); //Damit sich unser Programm nicht sofort schließt...
    }

    Den Process findet er einwandfrei und das handle geht auch ,nur wenn ich dann in die Adresse den Wert schreiben will von value passiert einfach nichts ,deshalb vermute ich ,dass ich entweder i-was bei dem addieren der Offsets falsch gemacht habe oder bei den adressen schlicht und einfach ,da ich aber absolut keinen Fehler finde und leider noch ein relativer neuling bin wärs echt nett wenn sich das jmd von euch mal angucken würde .
    Und nein ich lerne ganz sicher nicht C++ nur um hacks zu schreiben aber sowas ist natürlich ein kleiner ansporn den Solitär "hack" dann auch auszubauen und mich mit gui anwendungen zu beschäftigen usw 😃



  • Verstehe ich richtig, du willst Solitär modden/hacken?



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Wie wäre es denn mal, die Rückgabewerte zu prüfen und im Fehlerfall GetLastError aufzurufen? Für WriteProcessMemory brauchst du wahrscheinlich auch Debugprivilegien. Außerdem sind feste Adressen seit Vista dank Address space layout randomization nur in 1/256 Fällen die Richtigen.
    Besser ist es, den Benutzer den momentanen Wert eingeben zu lassen, diesen Wert im Adressraum zu suchen und das Spiel so lange zu wiederholen, bis die richtige Adresse gefunden ist.



  • mapper schrieb:

    Wie wäre es denn mal, die Rückgabewerte zu prüfen und im Fehlerfall GetLastError aufzurufen? Für WriteProcessMemory brauchst du wahrscheinlich auch Debugprivilegien. Außerdem sind feste Adressen seit Vista dank Address space layout randomization nur in 1/256 Fällen die Richtigen.
    Besser ist es, den Benutzer den momentanen Wert eingeben zu lassen, diesen Wert im Adressraum zu suchen und das Spiel so lange zu wiederholen, bis die richtige Adresse gefunden ist.

    Vielen Dank schonmal für die Hilfe,
    Ja das mit den festen Adressen geht leider nichtmehr bei mir wie es früher war,daher wurde mir gesagt ich muss die Base Adresse finden, mittels ReadProcessmemory auslesen was in ihr steht , und die Offsets dazu addieren , dann würde ich eine Adresse erhalten in welche ich schreiben kann,da es aber nicht klappt hast du recht,ist es wohl besser den derzeitigen Wert vom benutzer eingeben und vom Programm dann suchen zu lassen,das ganze hab ich allerdings noch nie gemacht ,sondern die Addressen immer mit Cheat Engine gesucht werd ich mir jetzt aber mal angucken wie ich das so lösen kann wie du es beschrieben hast.



  • Ne, du musst einfach eine fixe Adresse in der exe finden. Entweder ne globale, oder im code segment suchen, wo die Adresse des Wertes verwendet wird.
    Generell ist ASLR kein Hindernis. Man kann einfach mit moduloffsets arbeiten.

    Tool: http://cheatengine.org



  • Du kannst dir auch einfach mit Cheat Engine den Disassembly anschauen und dann schauen was die Base Adresse ist.
    Falls dir das zu umständlich ist würde ich dir einen Pointer Scann empfehlen.
    Wenn du darauf auch kb hast dann mach einfache eine Code oder DLL Injection (Stichwört: Dll Injection 😃 , Function Hooking) .

    Hier ein kleines beispiel um die Punktzahl auf 2000 zu halten:

    Original Function:

    jmp SetValue   
    
    .... irgendwelcher code
    .... irgendwelcher code
    .... irgendwelcher code
    
    SetValue:
             mov [ebp-24],eax
    

    Code aus DLL bzw. Code Injection

    jmp CustomFunction  ; Springt zu einer Funktion die deinen Injecteten Code aufruft
    
    .... irgendwelcher code
    .... irgendwelcher code
    .... irgendwelcher code
    
    CustomFunction:
                  mov eax,2000
                  mov [ebp-24],eax
    

    DerNoob1993 schrieb:

    nur wenn ich dann in die Adresse den Wert schreiben will von value passiert einfach nichts

    Dann fang mal an zu Debuggen und schau was du da machst.^^

    - Kannst du Assembler?
    Wenn nein dann lern es.

    - Kennst du dich mit Reverse Code Engineering aus?
    Wenn nein dann lernen.

    Einen Einstieg ins Reverse Code Engineering bekommst du hier:
    http://tuts4you.com/download.php?list.17

    Den Kommentaren in deinem Quelltext nach zu urteilen hast du den Code 1:1 aus einem Tutorial übernommen, und somit wohl auch diese Adressen:

    unsigned adress = 0x000BB038; 
    unsigned offset1 = 0x5B4; 
    unsigned offset2 = 0x30; 
    unsigned adress2 = 0; 
    unsigned adress3 = 0; 
    unsigned adress4 = 0;
    

    Wobei wenn der Autor das selbe Solitär verwende hat sowie du sollte es mit den Pointern eigentlich keine Probleme geben.



  • Bassmaster schrieb:

    Du kannst dir auch einfach mit Cheat Engine den Disassembly anschauen und dann schauen was die Base Adresse ist.
    Falls dir das zu umständlich ist würde ich dir einen Pointer Scann empfehlen.
    Wenn du darauf auch kb hast dann mach einfache eine Code oder DLL Injection (Stichwört: Dll Injection 😃 , Function Hooking) .

    Hier ein kleines beispiel um die Punktzahl auf 2000 zu halten:

    Original Function:

    jmp SetValue   
    
    .... irgendwelcher code
    .... irgendwelcher code
    .... irgendwelcher code
    
    SetValue:
             mov [ebp-24],eax
    

    Code aus DLL bzw. Code Injection

    jmp CustomFunction  ; Springt zu einer Funktion die deinen Injecteten Code aufruft
    
    .... irgendwelcher code
    .... irgendwelcher code
    .... irgendwelcher code
    
    CustomFunction:
                  mov eax,2000
                  mov [ebp-24],eax
    

    DerNoob1993 schrieb:

    nur wenn ich dann in die Adresse den Wert schreiben will von value passiert einfach nichts

    Dann fang mal an zu Debuggen und schau was du da machst.^^

    - Kannst du Assembler?
    Wenn nein dann lern es.

    - Kennst du dich mit Reverse Code Engineering aus?
    Wenn nein dann lernen.

    Einen Einstieg ins Reverse Code Engineering bekommst du hier:
    http://tuts4you.com/download.php?list.17

    Den Kommentaren in deinem Quelltext nach zu urteilen hast du den Code 1:1 aus einem Tutorial übernommen, und somit wohl auch diese Adressen:

    unsigned adress = 0x000BB038; 
    unsigned offset1 = 0x5B4; 
    unsigned offset2 = 0x30; 
    unsigned adress2 = 0; 
    unsigned adress3 = 0; 
    unsigned adress4 = 0;
    

    Wobei wenn der Autor das selbe Solitär verwende hat sowie du sollte es mit den Pointern eigentlich keine Probleme geben.

    Danke auch dir für die Antwort,und nein ich habe den code nicht 1:1 übernommen.
    Ich habe schon verstanden was die verschiedenen Funktionen bewirken,und habe die Parameter auf meinen Quelltext angepasst ,und die Adressen hab ich erst recht nicht ausm Tut übernommen wo wäre da der sinn?Das würde ja zu 99,9999% nicht gehen vor allem da das Tut mit nem win xp betriebssystem erstellt wurde 🙂 .
    Ich habe mir verschiedene Tuts angeschaut und versucht es zu verstehen was gemacht wird und habe dann meinen Quelltext aus verschiedenen Tuts zusammengebastelt ( aber natürlich hab ich die Parameter,Adressen usw auf meinen Quelltext angepasst ,so blöd bin ich dann auch nicht 😃 )
    Ich wollte es eigentlich auch erstmal ohne dll injektion versuchen, aber ich denke mal es wird noch i-was mit den Adressen falsch sein weil am Quelltext selbst hat ja i-wie noch keiner nen groben Fehler gefunden woran es liegen könnte wenn ich das richtig sehe.An Debug rechten kann es nicht liegen ,da ich auch ohne mit WriteProcessmemory in eine Adresse schreiben kann( z.b. in eine der Adressen des Punktesads von Solitär,da sich die nach jedem Neustart aber natürlich verändert versuche ich das wie ichs jetzt mache mit Offsets und ner Base Adresse aber da wird wohl mein Fehler liegen schätze ich (Bei den Adressen).
    Ich habe es auch wie du oben erwähnt hast immer mit einem Pointer scan gemacht,und danach solitär neugestartet und geguckt ob der Pointer immernoch funktioniert.Dann hab ich die Adresse + die Offsets des Pointers miteingebunden aber es klappt nicht,Ich hab mal nen screenshot gemacht von dem mit Cheat engine gefundenen Pointer und den Offsets:
    http://epvpimg.com/OeaGb

    Die von mir Blau markierte Adresse sollte ja die Base adresse sein ,die Offsets 0x5B4 und 0x30 sieht man ja auch dort,dieser mit Cheat Engine gefundene Pointer funktioniert auch nach mehrfachen neustart von Solitär sollte also der richtige sein was mache ich nur falsch-.-



  • mapper schrieb:

    ....... Für WriteProcessMemory brauchst du wahrscheinlich auch Debugprivilegien. ........ .

    Nein braucht er nicht!

    @DerNoob1993
    Du solltest immer die Rückgabewerte prüfen!
    Und Du solltest OpenProcess so aufrufen.

    OpenProcess(PROCESS_VM_READ | PROCESS_VM_OPERATION | PROCESS_VM_WRITE , FALSE, pid);

    Ansonsten hast Du keine Rechte aus dem Zielprocess zu lesen.

    Um C++ zu lernen ist dass das falsche....



  • was ist der vorteil von dll injection gegenüber writeprocessmemory?



  • Lass dein Programm doch einfach mal die ganzen Zwischenschritte ausgeben und vergleiche mit dem was Cheat Engine anzeigt.
    Vermutlich ist 0xBB038 schonmal falsch. 0xBB038 ist < 1 MB, d.h. da musst du wohl noch die Load-Address draufaddieren (0x100000).



  • groderich schrieb:

    was ist der vorteil von dll injection gegenüber writeprocessmemory?

    Der das mann sich nicht erst das Handle und die Process Id holen muss ,und sich die anderen Rechte holen muss,da man dann direkt im Speicher ist(so habe ich es zumindest verstanden).



  • DerNoob1993 schrieb:

    Der das mann sich nicht erst das Handle und die Process Id holen muss ,und sich die anderen Rechte holen muss,da man dann direkt im Speicher ist(so habe ich es zumindest verstanden).

    o_O

    Also an einer DLL Injection gefällt mir das ich nicht mit den Opcodes rumhantieren muss.

    Beispiel:

    Angenommen du willst an die Adresse 401000 folgendes schreiben:

    jmp 12ff90
    

    In Assembler sieht das ja noch sehr übersichtlich aus, aber bei einer Code Injection schreibt man halt direkt die Opcodes an die passenden Adresse. Die richtigen Opcodes wäre in diesem Fall:

    E98BEFD2FF
    

    E9 steht für einen long jmp.

    Woher weiss man welche Opcodes man hier braucht?

    Manuelel Code Injection mit Cheat Engine oder einem Debugger seiner wahl machen und die Opcodes einfach abschreiben.^^

    Oder man rechnet folgendes: (Zieladresse - Quelladresse)-5

    Bsp:

    Zieladresse: 12ff90
    Quelladresse: 401000

    ( 12ff90 - 401000 ) -5 = FFFFFFFFFFD2EF8B
    Jetzt erst mal etwas formatieren: FF D2 EF 8B
    Und jetzt muss der Kram ins little endian Format, was ganz rechts steht schreibst du einfach an den Anfang also so: 8B EF D2 FF
    Wie du ja weisst steht E9 für einen long jump um das ganze zu vervollständigen schreibt man jetzt einfach: E9 8B EF D2 FF



  • Aber wie macht man das dann per dll-injection?



  • fischVegetarier schrieb:

    Aber wie macht man das dann per dll-injection?

    Tja, das würdest du wohl gerne wissen was. 😃

    1. In der MSDN allen möglichen kram über DLL´s lesen und hoffen das man selber drauf kommt. (Zeitintensiv)

    2. Kurz Googeln (Nicht Zeitintensiv)
    Ich hab mal für dich gegoogelt:

    http://www.elitepvpers.com/forum/tutorials/446037-code-dll-injection-tutorial.html

    http://www.elitepvpers.com/forum/coding-tutorials/1327704-c-game-hacking-via-dll-injection.html

    http://damiproductions.darkbb.com/t494-c-dll-injection-tutorial


Anmelden zum Antworten