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 vermutenGrüß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; }