Totaler Noob versucht Arbeitsspeicher auszulesen und scheitert an Zeile 15



  • Miikku schrieb:

    Wie der Titel schon sagt: Bin ein Noob, der vor zwei Jahren mal angefangen hatte c++ zu lernen und versucht ein Programm zu schreiben, dass Zugriff auf den gesamten Hauptspeicher hat und dort bestimmte Werte verändern können soll.

    Also, wenn Windows es einem so einfach macht, auf den GESAMTEN Arbeitsspeicher aus einem x-beliebigen Programm zuzugrifen und darin Daten zu verändern (!!!) wundert mich gar nix mehr... (Normalerweise sollte man nur Zugriff auf den Speicherbereich des eigenen Prozesses Zugriff haben)

    Neben dem dass du als vollkommener Noob, wie du selber sagst, so etwas komplett lassen solltest. Wenn du selbst mit Konvertierungen elementarer Typen Probleme hast, solltest du so LowLevel-Zeugs bleiben lassen...

    Erstmal bei Adam und Eva anfangen mit nem netten Buch.

    Zu guter letzt ist das eher WinApi und kein Stückchen C++, und da gibt es ein eigenes Unterforum.



  • Miikku schrieb:

    char messg;
    sprintf(&messg, "Arbeitsspeicher: %d", statex.dwMemoryLoad);
    

    Was glaubst Du, was Du hier tust bzgl messg, &messg und sprintf?



  • Nap schrieb:

    Ich weiß nur, wie du Speicher eines bestimmten Prozesses Lesen/Schreiben kannst.

    Das reicht mir im Grunde für's erste auch schon^^

    Der mit dem Vader schrieb:

    Also, wenn Windows es einem so einfach macht, auf den GESAMTEN Arbeitsspeicher aus einem x-beliebigen Programm zuzugrifen und darin Daten zu verändern (!!!) wundert mich gar nix mehr... (Normalerweise sollte man nur Zugriff auf den Speicherbereich des eigenen Prozesses Zugriff haben)

    Hm... hier muss ich dich enttäuschen, denn DASS man es kann und wie prinzipiell auch, weiß ich.

    Der mit dem Vader schrieb:

    Neben dem dass du als vollkommener Noob, wie du selber sagst, so etwas komplett lassen solltest. Wenn du selbst mit Konvertierungen elementarer Typen Probleme hast, solltest du so LowLevel-Zeugs bleiben lassen...

    Ich habe nur mit Sprachelementen ein paar Probleme. Die Programmierung und Konzepte sind mir geläufig, schließlich programmiere ich regelmäßig Ruby, Java, RGSS, PHP und JavaScript. Von daher habe ich nicht schon bei einfachen Sachen Probleme, sondern eher NUR bei einfachen Sachen 😉

    Sebastian Pizer schrieb:

    Miikku schrieb:

    char messg;
    sprintf(&messg, "Arbeitsspeicher: %d", statex.dwMemoryLoad);
    

    ´
    Was glaubst Du, was Du hier tust bzgl messg, &messg und sprintf?

    Ich dachte das läuft so:

    Erst ein mal sollte das die Variable des Typs "char" namens "messg" deklarieren, von der die Funktion "sprintf()" aber nix wissen will, weil der erste Parameter vom Typ "char *" sein soll. Also ein Pointer. Entsprechend übergebe ich dann im ersten Parameter die Adresse von "messg" an die Funktion. Als zweites eine Zeichenkette die die Formatierung angibt in der die danach aufgelisteten Parameter miteinander zu einer Zeichenkette verknüpft und in "messg" geschrieben werden, in der das "%d" für eine Zahl (ich glaub in diesem Fall einen int) steht. Der letzte Parameter ist das, was dann bei "%d" erscheinen sollte.

    Ist schon gut möglich, dass da irgendein Fehler dran ist...
    Ich schätze mal dass das aber nur einer von vielen Fehlern ist oder?



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Du kannst den Arbeitsspeicher nicht auslesen. Was sollte das auch bringen, du weißt doch gar nicht, was da gerade drin ist.



  • Okay... ich hab's jetzt auf folgende Art hinbekommen:

    LPCWSTR charToLPCWSTR(LPCSTR ansistr){
    	int len = MultiByteToWideChar(CP_ACP, 0, ansistr, strlen(ansistr)+1, NULL, 0);
    	LPWSTR unicodestr = (LPWSTR)malloc(len);
    	int a = MultiByteToWideChar(CP_ACP, 0, ansistr, strlen(ansistr)+1, unicodestr, len);
    	return((LPCWSTR) unicodestr);
    }
    
    int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){
    
    	MEMORYSTATUSEX statex;
    	statex.dwLength = sizeof(statex);
    	GlobalMemoryStatusEx(&statex);
    	char messg[100];
    	sprintf(messg, "Arbeitsspeicher: %d", statex.dwMemoryLoad);
    	LPCWSTR  messgout = charToLPCWSTR((LPCSTR) messg);
    	MessageBox(0, messgout, L"Fehler", MB_OK);
    }
    

    Der 4. Parameter von "MultiByteToWideChar()" musste die Länge der Zeichenkette sein... Naja und Naps Link hat mir jetzt auch geholfen: THX Leute 😃



  • @M@st3rhack3r
    warum sollte man den arbeitsspeicher nicht auslesen können...

    man kann es und man kann sogar werte darin verändern...

    kuck dir mal das Memory Management unter anderem die funktionen ReadProcessMemory & WriteProcessMemory an...

    @Miikku
    hier noch 2 links die dich brennend interesieren dürften
    Teil 1
    Teil 2



  • @rT!f@Ct schrieb:

    @M@st3rhack3r
    warum sollte man den arbeitsspeicher nicht auslesen können...

    man kann es und man kann sogar werte darin verändern...

    kuck dir mal das Memory Management unter anderem die funktionen ReadProcessMemory & WriteProcessMemory an...

    Damit kannste nur den virtuellen Adressraum anderer Prozesse auslesen. Das ist nicht das gleiche.



  • Ich habe mir mal dieses Tutorial angeschaut doch wenn ich das "Opferprogramm" starte und danach das hier (in C umgeschrieben) erkennt er den Prozess nicht.

    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    
    main(){
        HWND hWnd; 
    
        hWnd = FindWindow(0,"Opfer"); 
        if(!hWnd){ 
           printf("Prozess nicht gefunden\n"); 
        }
        else{ 
           printf("Prozess wurde gefunden"); 
        }
        Sleep(10000);
    }
    

    Kann mir einer sagen woran das liegt?



  • heist den dein programm dessen werte du verändern willst als Fenstername auch "Opfer"?



  • Ja es heißt so. Ich habs auch schon mit Opfer.exe versucht und es auf 2 weiteren Rechners ausprobiert aber auch ohne Erfolg.



  • LOL 😃
    habs doch gewusst.
    wenn du es so gemacht hast wie in dem tutorial beschrieben, dann kann dein memorytool NIX finden denn dein Opfer programm heist nicht OPFER sondern zB.
    C:\Pfad\zum\Opferprogramm\Name_des_Opferprogramm.exe

    wenn du dein opferprogramm startest, kuck auf die NonClientArray (der blaue balken) das was dort geschrieben steht ersetzt du für "Opfer" in FindWindow

    hWnd = FindWindow(0,"C:\\Pfad\\zum\\Opferprogramm\\Name_des_Opferprogramm.exe");
    

    und lies dir mal durch was unter FindWindow in der MSDN steht vieleicht verstehst du's dann eher.



  • Ich danke dir. 🙂
    Vielleicht hätte ich vorher mal googlen sollen. 😃
    Auf jeden Fall tolles Forum 👍 👍 👍



  • Hä? FindWindow braucht doch einen Fenstertitel, nicht die .exe Datei und Pfad?!



  • Ja das stimmt. Aber in diesem Fall ist es eine Konsolenanwendung und somit der Name = Pfad.



  • Oops, sorry, verpennt.


Anmelden zum Antworten