|
You last visited: Today at 13:50
Advertisement
Write/Read ProcessMemory() - Multilevel pointer
Discussion on Write/Read ProcessMemory() - Multilevel pointer within the General Coding forum part of the Coders Den category.
04/07/2013, 16:35
|
#1
|
elite*gold: 0
Join Date: Mar 2013
Posts: 11
Received Thanks: 0
|
Write/Read ProcessMemory() - Multilevel pointer
Hallo!
Ich habe für ein Spiel den BasePointer gefunden.
Sein Adresse ist: FF96AFA8, das erste Offset ist:14, das Zweite ist 50!
PHP Code:
DWORD BasePointer = 0xFF96AFA8; WORD offset = 0x0014; WORD offset2 = 0x0050; ReadProcessMemory(solHandle,(LPCVOID)(BasePointer+offset2+offset),&pointed, 4, NULL);
Wie muss es richtig sein. Die Funk. Readp... gibt eine NULL aus. Alles andere bis auf die Pointer - Offset Geschichte ist in Ordnung.
|
|
|
04/07/2013, 17:19
|
#2
|
elite*gold: 724
Join Date: Mar 2011
Posts: 10,479
Received Thanks: 3,318
|
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.
|
|
|
04/07/2013, 17:39
|
#3
|
elite*gold: 0
Join Date: Mar 2013
Posts: 11
Received Thanks: 0
|
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!
|
|
|
04/07/2013, 17:46
|
#4
|
elite*gold: 724
Join Date: Mar 2011
Posts: 10,479
Received Thanks: 3,318
|
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.
|
|
|
04/07/2013, 17:52
|
#5
|
elite*gold: 0
Join Date: Mar 2013
Posts: 11
Received Thanks: 0
|
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?
|
|
|
04/07/2013, 18:01
|
#6
|
elite*gold: 724
Join Date: Mar 2011
Posts: 10,479
Received Thanks: 3,318
|
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.
|
|
|
04/07/2013, 18:20
|
#7
|
elite*gold: 0
Join Date: Mar 2013
Posts: 11
Received Thanks: 0
|
PHP Code:
#include <iostream> #include <windows.h>
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."
|
|
|
04/07/2013, 18:27
|
#8
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
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.
|
|
|
04/07/2013, 18:36
|
#9
|
elite*gold: 0
Join Date: Mar 2013
Posts: 11
Received Thanks: 0
|
Quote:
Originally Posted by MrSm!th
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:
PHP Code:
OpenProcess (PROCESS_ALL_ACCESS | PROCESS_VM_READ | PROCESS_VM_WRITE, false, ProcessID);
muss ich die ja die Rechte in den Parametern übergeben. Muss ich bei diesem Problem ähnlich heran gehen?
|
|
|
04/07/2013, 18:38
|
#10
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
ReadProcessMemory
|
|
|
04/07/2013, 18:58
|
#11
|
elite*gold: 724
Join Date: Mar 2011
Posts: 10,479
Received Thanks: 3,318
|
"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.
|
|
|
04/07/2013, 19:19
|
#12
|
elite*gold: 5
Join Date: Sep 2006
Posts: 385
Received Thanks: 218
|
Quote:
Originally Posted by snow911
"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.
Siehe:
|
|
|
04/08/2013, 18:06
|
#13
|
elite*gold: 0
Join Date: Mar 2013
Posts: 11
Received Thanks: 0
|
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?
|
|
|
04/08/2013, 18:17
|
#14
|
elite*gold: 0
Join Date: Dec 2012
Posts: 255
Received Thanks: 110
|
Quote:
Originally Posted by H4rtzer
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?
|
Nö ists nicht. Schau dir mal  an.
|
|
|
04/08/2013, 18:22
|
#15
|
elite*gold: 0
Join Date: Mar 2013
Posts: 11
Received Thanks: 0
|
Das hilft mir leider nicht weiter, aber trotzdem Danke!
|
|
|
 |
|
Similar Threads
|
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
|
All times are GMT +1. The time now is 13:51.
|
|