|
You last visited: Today at 12:58
Advertisement
[C++] Write to a Pointer
Discussion on [C++] Write to a Pointer within the C/C++ forum part of the Coders Den category.
03/14/2012, 20:39
|
#1
|
elite*gold: 0
Join Date: Aug 2009
Posts: 127
Received Thanks: 27
|
[C++] Write to a Pointer
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
Code:
DWORD ReadPointer(DWORD offsets[])
{
DWORD Result = 0;
int size = sizeof(offsets) / sizeof(DWORD);
Result = *(DWORD*)(GetBase("_Launcher.exe",GetCurrentProcessId()) + offsets[0]);
for(int i = 1; i != size; i++)
{
Result = *(DWORD*)(Result + offsets[i]);
}
return Result;
}
Nur wie beschreibe ich jetzt die Addresse? stehe gerade aufm Schlauch
|
|
|
03/14/2012, 20:46
|
#2
|
elite*gold: 115
Join Date: Oct 2007
Posts: 9,390
Received Thanks: 12,344
|
Genau so wie du sie ausließt, nur dass du natürlich was links und rechts von dem =-Operator steht vertauschst.
|
|
|
03/14/2012, 20:54
|
#3
|
elite*gold: 50
Join Date: Mar 2010
Posts: 1,373
Received Thanks: 521
|
in etwa so:
Code:
void ReadPointer(DWORD offsets[], DWORD val)
{
DWORD Result = 0;
int size = sizeof(offsets) / sizeof(DWORD);
Result = *(DWORD*)(GetBase("_Launcher.exe",GetCurrentProcessId()) + offsets[0]);
for(int i = 1; i != size; i++)
{
if(i == size)
*(DWORD*)(Result + offsets[i]) = val;
else
Result = *(DWORD*)(Result + offsets[i]);
}
}
|
|
|
03/14/2012, 21:01
|
#4
|
elite*gold: 0
Join Date: Aug 2009
Posts: 127
Received Thanks: 27
|
Code:
if(i == size) *(DWORD*)(Result + offsets[i]) = val;
ist unsinn ich muss ja erst die Endaddresse haben
|
|
|
03/14/2012, 21:06
|
#5
|
elite*gold: 50
Join Date: Mar 2010
Posts: 1,373
Received Thanks: 521
|
Quote:
Originally Posted by theredvex
Code:
if(i == size) *(DWORD*)(Result + offsets[i]) = val;
ist unsinn ich muss ja erst die Endaddresse haben
|
haste ja, wenn i == size ist
|
|
|
03/14/2012, 21:14
|
#6
|
elite*gold: 0
Join Date: Aug 2009
Posts: 127
Received Thanks: 27
|
dann könnt ich das doch genau so gut hinter die Schleife schreiben oder nicht?
|
|
|
03/14/2012, 21:19
|
#7
|
elite*gold: 50
Join Date: Mar 2010
Posts: 1,373
Received Thanks: 521
|
Quote:
Originally Posted by theredvex
dann könnt ich das doch genau so gut hinter die Schleife schreiben oder nicht?
|
Du müsstest dir dir resultierende Adresse irgendwie merken. Dann würde das theoretisch auch funktionieren.
|
|
|
03/14/2012, 22:17
|
#8
|
elite*gold: 115
Join Date: Oct 2007
Posts: 9,390
Received Thanks: 12,344
|
Quote:
Originally Posted by theredvex
Code:
int size = sizeof(offsets) / sizeof(DWORD);
|
Das hier macht übrigens nicht das was du erwartest. sizeof offsets ist immer 4 Bytes in einem 32-Bit-System bzw. 8 Bytes bei 64-Bit groß, da es ein Pointer ist.
Du musst die Länge des Arrays als ein weiteres Argument an deine Funktion weitergeben.
Musst du in der For-Schleife nicht auch bei i = 0 anfangen?
|
|
|
03/14/2012, 23:52
|
#9
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
|
Quote:
Originally Posted by Metin2Spieler97
Das hier macht übrigens nicht das was du erwartest. sizeof offsets ist immer 4 Bytes in einem 32-Bit-System bzw. 8 Bytes bei 64-Bit groß, da es ein Pointer ist.
Du musst die Länge des Arrays als ein weiteres Argument an deine Funktion weitergeben.
Musst du in der For-Schleife nicht auch bei i = 0 anfangen?
|
Doch wird es, der Compiler merkt sich die Größe selbst, es ist ein Array und kein Pointer, da zieht ein Compiler eine ganz klare Grenze.
Die Größe ist zwar der Funktion nicht bekannt, aber an der Stelle, an der du das Array definierst und das merkt sich der Compiler.
Alternativ ginge auch das Makro ARRAYSIZE, welches direkt die Anzahl der Elemente ausgibt.
|
|
|
03/15/2012, 06:30
|
#10
|
elite*gold: 50
Join Date: Mar 2010
Posts: 1,373
Received Thanks: 521
|
Wobei man in gutem C++ std::vector nehmen würde.
|
|
|
03/15/2012, 15:38
|
#11
|
elite*gold: 115
Join Date: Oct 2007
Posts: 9,390
Received Thanks: 12,344
|
Quote:
Originally Posted by MrSm!th
Doch wird es, der Compiler merkt sich die Größe selbst, es ist ein Array und kein Pointer, da zieht ein Compiler eine ganz klare Grenze.
Die Größe ist zwar der Funktion nicht bekannt, aber an der Stelle, an der du das Array definierst und das merkt sich der Compiler.
Alternativ ginge auch das Makro ARRAYSIZE, welches direkt die Anzahl der Elemente ausgibt.
|
char *c und char c[] sind als Parameter genau das selbe.
|
|
|
03/15/2012, 15:40
|
#12
|
elite*gold: 50
Join Date: Mar 2010
Posts: 1,373
Received Thanks: 521
|
Quote:
Originally Posted by Metin2Spieler97
char c* und char c[] sind als Parameter genau das selbe.
|
Nein, das Makro ARRAYSIZE würde beispielsweise nicht mehr funktionieren.
|
|
|
03/15/2012, 15:52
|
#13
|
elite*gold: 115
Join Date: Oct 2007
Posts: 9,390
Received Thanks: 12,344
|
Quote:
Originally Posted by jacky919
Nein, das Makro ARRAYSIZE würde beispielsweise nicht mehr funktionieren.
|
Dann ist das wohl eine Eigenart von Visual C++.
|
|
|
03/15/2012, 15:54
|
#14
|
elite*gold: 50
Join Date: Mar 2010
Posts: 1,373
Received Thanks: 521
|
Das Makro sollte auch mit anderen Compilern funktionieren.
|
|
|
03/15/2012, 16:03
|
#15
|
elite*gold: 115
Join Date: Oct 2007
Posts: 9,390
Received Thanks: 12,344
|
Code:
#include <iostream>
void f(char c[]);
int main(int argc, char *argv[])
{
char c[] = "1234567890";
std::cout << sizeof c << std::endl;
f(c);
}
void f(char c[])
{
std::cout << "inside function: " << sizeof c << std::endl;
}
Sollte bei jedem Compiler 11 und 4 bzw. 8 ausgeben.
Das ARRAYSIZE-Makro macht auch nicht viel anderes als sizeof zu benutzen.
|
|
|
All times are GMT +2. The time now is 12:58.
|
|