Das ist nicht zufällig ein Spiel mit der CryEngine, oder?
Hier ein Beispiel für die Position mit Multi-Level-Pointern: (extra für dich kommentiert und der Code geht bestimmt besser, aber egal)
Code:
DWORD *baseAddress = (DWORD *)((DWORD)hCryAction + baseCoordOffset); // äquivalent zum BasePointer
DWORD *offset1 = (DWORD *)(*baseAddress + COORD_1); // Adresse, die in baseAddress ist + 1. Offset
DWORD *offset2 = (DWORD *)(*offset1 + COORD_2); // Adresse, die in offset1 ist + 2. Offset
DWORD *content= (DWORD *)(*offset2 + COORD_3); // Adresse, die in offset2 ist + 3. Offset
struct coordinates *st = (coordinates *)(*content + COORD_X); // und hier die Verwendung: Einen Struct-Pointer auf den Inhalt von content + COORD_X (das ist bei mir 0x0 und ist nur zur Übersichtlichkeit da)
Genauso musst du es auch mit ReadProcessMemory machen. BasePointer auslesen und den Wert + offset auslesen usw.
Danke für deine Antwort. Ist nur Solitär. Aber das hilft mir nur bedingt weiter. Es wäre nett, wenn du dich direkt aus Solität beziehen könntest. ...Ich bin nämlich gerade am Verzweifeln!
Bei Solitär ist das der selbe Weg, mal auf meinen Code umgeschrieben (ich habe eine DLL, weshalb ich kein ReadProcessMemory() benötige, du musst natürlich immer den Weg über ReadProcessMemory() gehen)
Code:
DWORD *baseAddress = (DWORD)*0xFF96AFA8; // nicht sicher, ob man auch die Base Address des Programms braucht
DWORD *offset1 = (DWORD *)(*baseAddress + 0x14); // Adresse, die in baseAddress ist + 1. Offset
DWORD *content = (DWORD *)(*offset1 + 0x50); // Adresse, die in offset1 ist + 2. Offset -> da drinnen ist der Content.
Das Prinzip von Multilevelpointern ist halt, dass in einer Adresse & einem Offset eine neue Adresse hinterlegt ist, die + ein weiteres Offset ergibt eine Adresse, in der eine Adresse ist (= ein Pointer) usw.
Danke, das erscheint mir schon logischer.
(DWORD)*0xFF96AFA8 ...Hier gibt es die Fehlermeldung: Der Operand muss ein Zeiger sein.
Ich meine, wenn ich auf meine statische Basisadresse die Offsets addiere, dann müsste ich auf die (dynamische)Adresse kommen in der der gewünschte bzw. der auszulesende Wert steht. Oder?
Hoppla, Tippfehler. Natürlich muss der Pointer-Cast das Asteriks-Dings (*) beinhalten. (DWORD*) statt (DWORD)* löst das ganze.
Ne, du hast in der statischen Basisadresse eine (wahrscheinlich) variable Basisadresse. Diese + das Offset ergibt wieder eine variable Adresse (die über die variable Adresse in der statischen Adresse + das immer gleich bleibende Offset bekommt), mit der + dem 2. Offset kommt man wieder auf eine variable Adresse, in der der Wert liegt.
Bisschen kompliziert, aber wenn man mal das Prinzip der Pointer verstanden hat, ist es eigentlich relativ leicht.
using namespace std; int a; int main () { DWORD *baseAddress = (DWORD*) 0xFF96AFA8; // nicht sicher, ob man auch die Base Address des Programms braucht DWORD *offset1 = (DWORD *)(*baseAddress + 0x14); // Adresse, die in baseAddress ist + 1. Offset DWORD *content = (DWORD *)(*offset1 + 0x50); // Adresse, die in offset1 ist + 2. Offset -> da drinnen ist der Content.
cout << *content << content << endl; cin >> a;
return 0; }
Ich habe das mal kompiliert und erhalte nun einen neuen seltsamen Fehler.
"Unbehandelte Ausnahme bei 0x76f815de in test5.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xff96afa8."
Beschäftige dich nochmal mit der Sprache und lerne, wie Pointer funktionieren.
Kleiner Tipp nebenbei: Dein Programm und Solitair teilen sich nicht denselben Adressraum, du kannst Pointer nicht direkt dereferenzieren.
Beschäftige dich nochmal mit der Sprache und lerne, wie Pointer funktionieren.
Kleiner Tipp nebenbei: Dein Programm und Solitair teilen sich nicht denselben Adressraum, du kannst Pointer nicht direkt dereferenzieren.
Danke für den Tipp. Wie kann ich also in den anderen Adressraum "übergreifen"? Bei der Funktion:
"du musst natürlich immer den Weg über ReadProcessMemory() gehen"
und lass das mit "4" bei der size & nutze sizeof(type), sonst hast du ein Problem, wenn das Programm auf einem System läuft, das eine andere Größe für DWORD hat.
"du musst natürlich immer den Weg über ReadProcessMemory() gehen"
und lass das mit "4" bei der size & nutze sizeof(type), sonst hast du ein Problem, wenn das Programm auf einem System läuft, das eine andere Größe für DWORD hat.
Da er hier mit Windows arbeitet, ist das egal ob er "4" nimmt oder "sizeof(DWORD)", da DWORD auf allen Windows Systemen eine größe von 4 Bytes hat. Und sobald er auf einen Unixoiden wechselt kann er ReadProcessMemory eh nicht mehr verwenden.
Problematisch ist eher, dass er DWORD zum Auslesen von Pointern benutzt. Das geht nur so lange gut, wie er sich in einer 32 bit Umgebung befindet. Erstellt er sein Programm für x64, sind die Pointer plätzlich 8 Bytes groß und er ließt dann Müll aus, weshalb er lieber DWORD_PTR nehmen sollte. Dann greift auch wieder das Argument, dass er nicht sizeof(4) sondern sizeof(DWORD_PTR) machen soll, weil das hier einen wirklichen Unterschied macht.
In meinem BasePointer (solitaire.exe+BAFA8) steht solitaire.exe. Wie komme ich an die Adresse für solitaire.exe! Ich dachte gehört zu haben, dass solitaire.exe dem Prozesshandle entspricht. Ist das richtig?
In meinem BasePointer (solitaire.exe+BAFA8) steht solitaire.exe. Wie komme ich an die Adresse für solitaire.exe! Ich dachte gehört zu haben, dass solitaire.exe dem Prozesshandle entspricht. Ist das richtig?
Multilevel Pointer hacken per Array [Fehlersuche] 05/06/2012 - AutoIt - 12 Replies Hi
Den Wert folgendes Level4-Pointers möchte ich mit einem Autoit-Script hacken:
Base: 1073EF88
Offset1: 1C
Offset2: 10
Offset3: 4
Offset4: DE4
Dazu habe ich dieses Tutorial gefunden, was beschreibt, wie man den Pointer per Array verwendet:
[C++] Write to a Pointer 03/18/2012 - C/C++ - 26 Replies Nabend liebe Epvp-Community,
ich schreibe ja wie manche wissen einen Bot für Eden Eternal.
Leider hat sich die Movement-Funktion seit dem Update geändert und lässt das direkte aufrufen nicht zu wegen dem Stack.
Nun will ich den Wert auf die Addresse schreiben und dann in die Read->Check->Move-Function springen.
ich habe mir eine Funktion erstellt um einen Pointer auszulesen
DWORD ReadPointer(DWORD offsets)
{
DWORD Result = 0;
CE 13* multilevel pointer with some skills... 05/13/2011 - Kal Online - 2 Replies Hi guys, i got a little problem, mby u can help me out.
I used CE and created most of the pointer that able to ( speed, ug, F1 , charcount , setframe (well yeah r11 standart disabled it but anyway ) , Health(useless) , Mana(useless) , Otp(useless), Eva(useless) , Berserk , EmergencyEscape , Commander calls , Commander elastic shield.
Skills are 13x multilevel pointers and also dont know how to get the pointer of skills that u attack monsters... (not like zerk,shields,EE) like...
Multilevel Pointer 12/03/2010 - General Coding - 3 Replies Heyho ePvpers,
since i'm learning c++, i developed an application with multilevel pointers and a tricky algo.
i wanted to know if somebody could find the static pointer.
btw its a console app
Todo:
Try to find the static pointer of the number and post your solution if you got it.
VirusTotal Scan
Please write Pointer 08/27/2010 - 4Story - 9 Replies Please write the table cheat in Cheat Engine for here this 4story Welcome to 4story Online