Memory-Such-Funktion, habe keinen Zugriff auf die Adresse



  • Ich möchte den Speicherbereich zwischen 0x080000B0 und 0x08FF00B0 nach einem String
    absuchen, aber ich kann die Adresse nicht vergrößern

    Aber seht selbst:

    LPVOID current = (LPVOID)0x080000B0;
    	bret=ReadProcessMemory(hopen, current, &data, 5, 0);
    	current++;
    
    LPVOID current = (LPVOID)0x080000B0;
    	bret=ReadProcessMemory(hopen, current, &data, 5, 0);
    	current += (LPVOID)0x00010000;
    

    Der Compiler sagt

    error C2036: 'LPVOID' : unknown size
    

    Aber es hat ja ne size, wie spreche ich denn den Pointer selbst an?

    Danke schonmal 🤡



  • Listing schrieb:

    error C2036: 'LPVOID' : unknown size
    

    Aber es hat ja ne size, wie spreche ich denn den Pointer selbst an?

    Nein. 'LPVOID' ist 'void*' und das hat eben keine Größe und kann daher auch nicht in Zeigerarithmetik verwendet werden. Verwende 'BYTE*', um in Einerschritten hochzuzählen ('BYTE' sollte unter Windows die kleinste adressierbare Einheit darstellen).



  • Konrad Rudolph schrieb:

    Listing schrieb:

    error C2036: 'LPVOID' : unknown size
    

    Aber es hat ja ne size, wie spreche ich denn den Pointer selbst an?

    Nein. 'LPVOID' ist 'void*' und das hat eben keine Größe und kann daher auch nicht in Zeigerarithmetik verwendet werden. Verwende 'BYTE*', um in Einerschritten hochzuzählen ('BYTE' sollte unter Windows die kleinste adressierbare Einheit darstellen).

    Wie soll das denn Funktionieren?
    Die Funktion "ReadMemory" verlangt LPVOID als Adressen-Paramenter,
    könttest du bitte ein Beispiel machen, damit ich dir folgen kann?
    Danke schonmal für deine Hilfe 🙄



  • Listing schrieb:

    Wie soll das denn Funktionieren?
    Die Funktion "ReadMemory" verlangt LPVOID als Adressen-Paramenter

    Das ist doch egal, Du brauchst doch eh ein 'reinterpret_cast', da kannst Du zwischen den Zeigern hin- und hercasten, wie Du lustig bist. Und nach 'void*' kann man eh implizit casten:

    BYTE* current = reinterpret_cast<BYTE*>(0x080000B0);
    bret = ReadProcessMemory(hopen, current, &data, 5, 0);
    current++;
    


  • Das klappt nicht so ganz:

    while(true)
    	{
    	 //LPVOID current = (LPVOID)0x08??00B0;
    	 BYTE* current = reinterpret_cast<BYTE*>(0x00450000);
    	 bret=ReadProcessMemory(hopen, current, &data, 10, 0);
    	 current++;
    	 cout << "At the offset: " << current << hex << " the Data is: ";
    	 cout << hex << data << endl;
    	  if(current == reinterpret_cast<BYTE*>(0x00450100))
    	    {
    	      bret=CloseHandle(hopen); 
    	      return 0;
        	} 
    	}
    

    ergibt eine Endlosschleife...

    Ausgabe:

    At the offset:  the Data is: 0
    At the offset:  the Data is: 0
    At the offset:  the Data is: 0
    At the offset:  the Data is: 0
    At the offset:  the Data is: 0
    At the offset:  the Data is: 0
    At the offset:  the Data is: 0
    ..............
    


  • Listing schrieb:

    ergibt eine Endlosschleife...

    Ja, Du setzt ja auch in jedem Schleifendurchlauf 'current' auf seinen Startwert zurück ...

    BYTE* current = reinterpret_cast<BYTE*>(0x00450000);
    
    while (current != reinterpret_cast<BYTE*>(0x00450100)) {
        bret = ReadProcessMemory(hopen, current++, &data, 10, 0);
        cout << hex << data << endl;
    }
    bret=CloseHandle(hopen);
    

    /Edit: um Dir die Adresse von 'current' ausgeben zu lasse:

    cout << static_cast<void*>(current) << endl;
    


  • Konrad Rudolph schrieb:

    Listing schrieb:

    ergibt eine Endlosschleife...

    Ja, Du setzt ja auch in jedem Schleifendurchlauf 'current' auf seinen Startwert zurück ...

    BYTE* current = reinterpret_cast<BYTE*>(0x00450000);
    
    while (current != reinterpret_cast<BYTE*>(0x00450100)) {
        bret = ReadProcessMemory(hopen, current++, &data, 10, 0);
        cout << hex << data << endl;
    }
    bret=CloseHandle(hopen);
    

    Sorry, das ist ein Fehler der mir , manchmal passiert 🙂
    Jetzt geht es

    Dankeschön 🙂


Anmelden zum Antworten