Pointer Adresse zuweisen :)



  • Hi, wie kann ich einem Int Pointer zb.

    Folgende Adresse zuweisen ??

    003F6154 ??

    Gruss

    BlackNight



  • int main()
    {
        int *pointer = reinterpret_cast<int*>(0x003F6154);
    }
    

    EDIT: Die Frage ist allerdings, was du damit genau bezwecken willst. Unter WIndows kannst du zum Beispiel nicht einfach über einen Zeiger auf den Speicher einer anderen Anwendung zugreifen.



  • Wieso nicht, wie muss ich es denn machen ?? :xmas1:



  • Weiss niemand wie dass geht ??, wäre echt froh wenn mir jmd. helfen kann 😞



  • Hab ein bisschen gegooglet, und hab mir Folgnedes zusammengebaut:

    int main()
    {
    	int *money;
    	int moni = 10000;
    	int size = sizeof(moni);
    
    	money= reinterpret_cast<int*>(0x00B7CE50);
    
    	HWND hWndAndreas = FindWindow(NULL,"GTA: San Andreas");
    
    	if(hWndAndreas==NULL)
    	{
    		exit(2);
    	}
    
    	SendMessage(hWndAndreas,PROCESS_VM_WRITE,NULL,NULL);
    
    	WriteProcessMemory(hWndAndreas,money,&moni,sizeof(moni),(SIZE_T*)&size);
    
    	printf("Money auf 10000 Gesetzt");
    }
    

    Funktioniert aber leider nicht 😞 😞



  • BlackNight007 schrieb:

    SendMessage(hWndAndreas,PROCESS_VM_WRITE,NULL,NULL);
    

    Das funktioniert so nicht. Um schreibend auf den fremden Prozess zugreifen zu können, musst du PROCESS_VM_WRITE und PROCESS_VM_OPERATION Zugriff auf diesen haben. SendMessage ist dafür aber gar nicht zuständig. Du musst also ein Handle auf diesen Prozess erzeugen, welches den entsprechenden Zugriff erlaubt. Das machst du mit OpenProcess. Zudem erwartet WriteProcessMemory als ersten Parameter ein Prozess Handle (welches du eben von OpenProcess erhälst) und kein Fenster Handle. Für eine ausführlichere Erklärung schaust du zB mal hier nach.

    btw:
    "Funktioniert nicht" ist keine ausreichende Problembeschreibung. Und warum ist size nicht vom Typ SIZE_T, wenn es doch der erforderliche Typ ist. Es gibt mehr als int, und Casts sind nicht dazu da, solche Unsauberkeiten zu umgehen. Das führt sehr schnell zu fehlerhaften Anwendungen.



  • Gibts keine Cheats für GTA? Immer dieses Schreiben in fremde Prozesse... tz... Wenn ich ein Programm wäre würds mich ganz schön ärgern wenn jemand in mich reinschreiben würde...



  • groovemaster schrieb:

    Und warum ist size nicht vom Typ SIZE_T, wenn es doch der erforderliche Typ ist. Es gibt mehr als int, und Casts sind nicht dazu da, solche Unsauberkeiten zu umgehen. Das führt sehr schnell zu fehlerhaften Anwendungen.

    1. Wodurch sollen da unbedingt Fehler entstehen? Ich benutze eigentlich auch immer int anstatt size_t und hatte noch nie Probleme...

    2. Wo siehst du da einen cast?



  • Phoemuex schrieb:

    1. Wodurch sollen da unbedingt Fehler entstehen?

    Wenn SIZE_T eine andere Grösse als int hat, was zB unter Win64 der Fall ist, dann wird mehr Speicher beschrieben, als die Variable tatsächlich besitzt ➡ undefiniertes Verhalten.

    Phoemuex schrieb:

    Ich benutze eigentlich auch immer int anstatt size_t und hatte noch nie Probleme...

    Dann solltest du das überdenken. Da du vermutlich nur unter gängigen 32 Bit Systemen (Windows, Linux) programmierst, ist es dir bisher noch nicht auf die Füsse gefallen, da dort beide Typen zufälligerweise gleich gross sind. Aber selbst dort gibt es Probleme, da zB int vorzeichenbehaftet ist und SIZE_T nicht.

    Phoemuex schrieb:

    1. Wo siehst du da einen cast?

    hier

    WriteProcessMemory(hWndAndreas,money,&moni,sizeof(moni),(SIZE_T*)&size);
    


  • groovemaster schrieb:

    [...] und Casts sind nicht dazu da, solche Unsauberkeiten zu umgehen. [...]

    Ich bin noch nie ohne Casts ausgekommen, das liegt aber daran, dass es mindestens 10 verschiedene Typen gibt, die aber alle ein int sind.



  • Badestrand schrieb:

    Ich bin noch nie ohne Casts ausgekommen, das liegt aber daran, dass es mindestens 10 verschiedene Typen gibt, die aber alle ein int sind.

    Das ist aber ein Widerspruch in sich. Für ein Alias brauchst du keinen Cast. Und wenn du ohne Casts nicht auskommst, machst du irgendwas falsch. Ich tippe einfach mal darauf, dass deine Typstrategie nicht so wirklich passt. Casts braucht man in den seltensten Fällen, und oftmals auch nur, weil die verwendete API nicht ganz sauber ist. Aber das ist jetzt schon zu sehr Offtopic.



  • Hast Recht, komme aber trotzdem nicht ohne Casts aus :p



  • Hi, hab mir jetzt einen passenden Quellcode zusammengebaut 🙂

    Aber versthe noch nicht so ganz was Intern abläuft.

    Könnte mir dass jemand erklären ??

    #include <stdio.h>
    #include <windows.h>
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    	int money = 10000;
    	DWORD idAndreas;
    	DWORD size = 4;
    
    	unsigned adress = 0x00B7CE50;
    
    	HWND hWndAndreas = FindWindow(NULL,"GTA: San Andreas");
    
    	if(hWndAndreas==NULL)
    	{
    		exit(2);
    	}
    
        GetWindowThreadProcessId(hWndAndreas,&idAndreas);
    
    	HANDLE hProcAndreas = OpenProcess(PROCESS_ALL_ACCESS,false,idAndreas);
    
    	WriteProcessMemory(hProcAndreas,(LPVOID)adress,&money,sizeof(money),&size);
    
    	CloseHandle(hProcAndreas);
    
    	printf("Money auf 10000 Gesetzt");
    
    	Sleep(20000);
    }
    

    PS: Sollte in WinApi verschoben werden, passt besser :xmas1:



  • Hallo,

    Die genaue Erklärung steht doch hier:
    http://www.egocrew.de/programmierung/c_c_und_c/speicherzugriff_tutorial_teil_1

    Aber eine andere Frage:
    Kann ich den Zugriff durch ein anderes Programm auch irgendwie verhindern?
    Welche nützlichen Programme verwenden eine solche externen Speicherzugriff
    oder sogar Speichermanipulation?

    Gruß,
    *Cpp-Anfänger*



  • Cpp-Anfänger schrieb:

    Welche nützlichen Programme verwenden eine solche externen Speicherzugriff
    oder sogar Speichermanipulation?

    Nunja, "nützlich" ist sicherlich ein recht interpretierbarer Begriff. Verwenden kann man sowas zB bei Spiele Bots. Oder vorstellbar wäre auch, eine recht effiziente Interprozesskommunikation damit zu realisieren. Obwohl es dafür sicherlich elegantere Wege gibt.



  • Irgendjemand hatte mal geschrieben, dass StyleXP es benutzt. Und irgendwo (CodeProject?) hatte ich mal ein Tutorial gesehen, das erklärt, wie man mit der Speichermanipulation das nervige 5-Sekunden-Warten ausstellen kann, wenn man im Explorer eine offene Datei löschen will.
    Sind ja 2 nützliche Beispiele, aber ich persönlich wage mich an sowas nicht ran, man will ja doch eine gewisse Sicherheit garantieren 😃


Log in to reply