ReadProcessMemory error 299



  • Hi,

    eigentlich wollte ich den Trainer flott fertig haben, aber nun bekomme ich einen error den ich vorher noch nie hatte 🙂

    Und zwar 299:
    Only part of a ReadProcessMemory or WriteProcessMemory request was completed.

    Was mich ein wenig stutzig macht ist die Adresse selbst, normal sind die etwas größer aber ich hab erst einen Trainer bisher geschrieben, bin also unerfahren.

    unsigned life = 0x2C; 
    
        HANDLE proch;
        proch = OpenProcess(PROCESS_VM_READ, false, pid); //pid wird vorher definiert
        if (proch == NULL)    
        {
               cerr << "Prozesshandle nicht erstellt.";
               Sleep(3000);
               exit(1);
        }
    
        bool success;
        int var;    
        success = ReadProcessMemory(proch, (LPCVOID)life, &var, sizeof(int), &rw);
    
        if (!success)
        {
                     DWORD error = GetLastError();
                     cerr << "\nFehler beim lesen! CODE: " << error;
                     cerr << "\n Bytes read: " << rw;
                     Sleep(3000);
        }
    

    Bytes read ist 0. Also es ist nichtmal nur ein Teil, es hat gar nicht funktioniert 😃

    Es sind noch ein paar andere Reads die folgen, welche auch funktionieren und auf dem selben ProcHandle basieren. Daran kanns eigentlich nicht liegen.
    Möglicherweise liegt 0x2C vll in einem Bereich, in dem man spezielle Zugriffsrechte braucht? Ich kann nur vermuten 🙂

    Grüße



  • Hallo,
    ich habe den gleichen Fehler!

    HANDLE pHandle;
    	DWORD br = 0;
    	unsigned address = 0x100579C;
    
    	// Set privileges
    	EDP();
    
    	// Create buffer
        char* buffer = new char[128];
    	*(buffer + 127) = '\0';
    
    	// Get handle
    	pHandle = GetHandle(L"WINmine.exe");
    	if (pHandle == 0)
    	{
    		cout << "Prozess konnte nicht gefunden werden!\n";
    	}
    
    	// Read Process Memory 
        if (ReadProcessMemory(pHandle, (LPCVOID)address, buffer, 4, &br))
    	{
    		cout << *((int*) buffer) << '\n';
    	}
    	else
    	{
    		cout << "Fehler beim lesen der Bytes!\n\n" << " Gelesene Bytes: " << br << "\n Error: " << GetLastError() << '\n';
    	}
    
    	// Close handle
        CloseHandle(pHandle);
    


  • Programme unter Windows haben kein Zugriff auf adressen <0x1000 und >=0x80000000.

    Wenn der Speicher von Program A started von 0x1000 and ist 4096 Bytes gross (GetSystemInfo()->dwPageSize), dann ReadProcessMemory(0x1000+4096-2, 4) liefert (*):

    GetLastError = ERROR_PARTIAL_COPY
    *lpNumberOfBytesRead = 2
    

    * Wenn die SpeicherPage 0x1100 gehoert zu Program A, ReadProcessMemory wird alle 4 Bytes kopieren.



  • ICH HABE ES!!!
    endlich, nach ca 3 tagen hab ich es endlich geschafft!

    hier der code, für alle die da mit noch probleme haben...

    (für Minesweeper. Die Adresse ist die von der Zeitanzeige!)

    #include "stdafx.h"
    #include <windows.h>
    #include <iostream>
    #include <Psapi.h>
    
    #pragma comment(lib, "C:\\Programme\\Microsoft SDKs\\Windows\\v6.0A\\Lib\\Psapi.Lib")
    
    using namespace std;
    
    HANDLE GetHandle(const wchar_t *pName)
    {
        DWORD aProcesses[1024], cbNeeded, cProcesses;
    
        if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
    	{
    		cout << "EnumProcesses threw an error!" << '\n';
    		system("pause");
    		exit(1);
    	}
    
        cProcesses = cbNeeded / sizeof(DWORD);
    
        for (unsigned int i = 0; i < cProcesses; i++ )
    	{
            if( aProcesses[i] != 0 )
    		{
    			TCHAR szProcessName[32];
    
    			HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, aProcesses[i]);
    			if (NULL != hProcess )
    			{
    				HMODULE hMod;
    				DWORD cbNeeded;
    
    				if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) )
    				{
    					GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR) );
    					// DEBUG  cout << i << " Compare: " << _wcsicmp(pName, szProcessName) << "\t";_tprintf(szProcessName);cout << '\n';
    					if (_wcsicmp(pName, szProcessName) == 0)
    					{
    						//cout << i << "  " << _tprintf(szProcessName) << endl;
    						return hProcess;
    					}
    				}
    			}
    			CloseHandle( hProcess );
    		}
    	}
    	return 0;
    }
    
    void EDP()
    {
        TOKEN_PRIVILEGES priv;
        HANDLE hThis, hToken;
        LUID luid;
        hThis = GetCurrentProcess();
    
        OpenProcessToken(hThis, TOKEN_ADJUST_PRIVILEGES, &hToken);
        LookupPrivilegeValue(0, L"seDebugPrivilege", &luid);
        priv.PrivilegeCount = 1;
        priv.Privileges[0].Luid = luid;
        priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        AdjustTokenPrivileges(hToken, false, &priv, 0, 0, 0);
    
        CloseHandle(hToken);
        CloseHandle(hThis);
    } 
    
    int main()
    {
        HANDLE pHandle;
    	DWORD br = 0;
    
    	// Memory address // Time: 0x1005194  0x100579C
    	unsigned address = 0x100579C;
    
    	// Set privileges
    	//EDP();
    
    	// Create buffer
        char* buffer = new char[128];
    	*(buffer + 127) = '\0';
    
    	// Get handle
    	pHandle = GetHandle(L"WINmine.exe");
    	if (pHandle == 0)
    	{
    		cout << "Prozess konnte nicht gefunden werden!\n";
    	}
    
    	// Read Process Memory 
        if (ReadProcessMemory(pHandle, (LPCVOID)address, buffer, 4, &br))
    	{
    		cout << *((int*) buffer) << '\n';
    	}
    	else
    	{
    		cout << "Fehler beim lesen der Bytes!\n\n" << " Gelesene Bytes: " << br << "\n Error: " << GetLastError() << '\n';
    	}
    
    	// Close handle
        CloseHandle(pHandle);
    
        system("pause");
        return 0;
    }
    

Anmelden zum Antworten