[C++] Write to a Pointer

03/14/2012 20:39 theredvex#1
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 ms​#2
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 jacky919#3
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 theredvex#4
Code:
if(i == size)             *(DWORD*)(Result + offsets[i]) = val;
ist unsinn ich muss ja erst die Endaddresse haben
03/14/2012 21:06 jacky919#5
Quote:
Originally Posted by theredvex View Post
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 theredvex#6
dann könnt ich das doch genau so gut hinter die Schleife schreiben oder nicht?
03/14/2012 21:19 jacky919#7
Quote:
Originally Posted by theredvex View Post
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 ms​#8
Quote:
Originally Posted by theredvex View Post
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 MrSm!th#9
Quote:
Originally Posted by Metin2Spieler97 View Post
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 jacky919#10
Wobei man in gutem C++ std::vector nehmen würde.
03/15/2012 15:38 ms​#11
Quote:
Originally Posted by MrSm!th View Post
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 jacky919#12
Quote:
Originally Posted by Metin2Spieler97 View Post
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 ms​#13
Quote:
Originally Posted by jacky919 View Post
Nein, das Makro ARRAYSIZE würde beispielsweise nicht mehr funktionieren.
Dann ist das wohl eine Eigenart von Visual C++.
03/15/2012 15:54 jacky919#14
Das Makro sollte auch mit anderen Compilern funktionieren.
03/15/2012 16:03 ms​#15
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.