WriteProcessMemory funktioniert nicht richtig



  • Hi,

    ich versuche gerade einen Integer eines anderen Programms zu verändern. Hier ist mein Code:

    MEMORY_BASIC_INFORMATION mbi;
    	SYSTEM_INFO sysinfo;
    	unsigned long FromAddress = 0x00000000;
    	bool Break = false;
    
    	GetSystemInfo(&sysinfo);
    	do
    	{
    		VirtualQueryEx(hProcess, (LPCVOID) FromAddress, &mbi, sizeof(MEMORY_BASIC_INFORMATION));
    
    		if (mbi.State == MEM_COMMIT && mbi.Protect == PAGE_READWRITE && mbi.Type == MEM_PRIVATE)
    		{
    			unsigned long Start = (unsigned long) mbi.BaseAddress;
    			unsigned long End	= (unsigned long) mbi.BaseAddress + mbi.RegionSize;
    			LPBYTE buf = new BYTE[End - Start];
    
    			ReadProcessMemory(hProcess, (LPVOID) Start, buf, End - Start, 0);
    
    			for (int i = 0; i < (int) (End-Start); ++i)
    				if (buf[i] == (BYTE) NewValueInt)
    				{
    					cout <<"Value found!" <<endl;
    					int CurrentAddress = Start + i;
    
    					if (!WriteProcessMemory(hProcess, (LPVOID) CurrentAddress, NewValue, 1024, 0))
    						cout <<"Writing Failed!" <<endl;
    
    					Break = true;
    					break;
    				}
    
    			delete [] buf;
    		}
    
    		FromAddress += mbi.RegionSize;
    	}
    	while ((LPVOID) FromAddress < sysinfo.lpMaximumApplicationAddress && !Break);
    

    Ich durchsuche also die ganze Bandbreite der Addressen und ich finde sie dann auch (lauft Output). Was nicht funktioniert ist das was ich bezwecken möchte: Die Variable meines anderen Programms zu ändern:

    #include <iostream>
    #include <conio.h>
    #include <windows.h>
    
    int main()
    {
    	SetConsoleTitle("Victim");
    
    	int a = 1;
    
    	while (true)
    	{
    		_getch();
    
    		std::cout <<"a = " <<a <<std::endl;
    	}
    }
    


  • Du brauchst evtl. noch ein VirtualProtectEx. Ansonsten kannst du immer mit GetLastError schauen, ob du mehr Infos über den Fehler bekommst.



  • WriteProcessMemory(hProcess, (LPVOID) CurrentAddress, **&**NewValue, 1024, 0)



  • Hallo, ich hab da früher mal was zusammen gefrickelt das habe ich gerade noch gefunden, vielleicht hilft dir das.

    #include <windows.h>
    #include <iostream>
    using namespace std;
    
    void read_addr ( HANDLE );
    void write_to_addr ( HANDLE   );
    
    int main()
    {
    
    HWND hwnd = 0;
    DWORD ID = 0;
    HANDLE handle = 0;
    
    int auswahl = 0;
    char win_title[256] = "0";
    
    cout<<"Fester Titel von zu Manupulierendem Programm eingeben: ";
    cin.getline ( win_title , 256);
    
    	hwnd = FindWindow(NULL, win_title );
    
    	if(!hwnd)
    	{
    	        cout<<"Fehler Programm konnte nicht gefunden werden !"<<endl;
    		system("PAUSE");
    		return 0;
    	}
    
    	GetWindowThreadProcessId(hwnd, &ID);
    	handle = OpenProcess(PROCESS_ALL_ACCESS, false, ID);
    
    while (1)
    {
    system("CLS");
    
            cout<<"(1) Adressen lesen"<<endl;
            cout<<"(2) Wert an Adresse schreiben"<<endl;
            cout<<"Auswahl: ";
            cin>>auswahl;
    
            switch ( auswahl )
            {
                    case 1:
                            read_addr ( handle );
                    break;
    
                    case 2:
                            write_to_addr ( handle );
                    break;
    
                    default:
                            cout<<"Falsche eingabe 1 oder 2 eingeben !"<<endl;
                            system("PAUSE");
                    break;
            }
    }
    
    system("PAUSE");
    
    CloseHandle(handle);
    return 0;
    }
    
    void read_addr ( HANDLE handle  )
    {
    unsigned adresse = 0;
    int puffer = 0;
    
    system("CLS");
    cout<<"Zu lesenden Adresse eingeben: ";
    cin>>adresse;
    
    	ReadProcessMemory(handle, (  LPCVOID  )adresse, &puffer , sizeof(puffer) , 0);
            cout<<"Adress Wert: " << puffer << endl;
            system("PAUSE");
    }
    
    void write_to_addr ( HANDLE handle )
    {
    
    int wert = 0;
    int puffer = 0;
    
    unsigned addr = 0;
    
    DWORD rw  = 0;
    
    system("CLS");
    
            cout<<"Speichadresse eingeben an die die Daten geschrieben werden sollen: ";
            cin>>addr;
    
            cout<<endl;
    
            cout<<"Wert eingeben welcher an die Speicheradresse geschrieben werden soll: ";
            cin>>wert;
    
            WriteProcessMemory(handle, (LPVOID)addr, &(puffer = wert ), sizeof(int), &rw);
    
    }
    

    Vic

    #include <windows.h>
    #include <iostream>
    
    int main()
    {
    
    SetConsoleTitle("test programm");
    int var = 19;
    
            while (1)
            {
            system("CLS");
                    std::cout<< var << "    " << &var << std::endl;
            	Sleep(1500);
            }
    
    }
    

Log in to reply