Memory Writing/Reading
-
#include <windows.h> int main() { HWND hWnd = FindWindow(NULL, L"iVar"); if(hWnd == 0){ MessageBox(NULL, L"Fehler: Konnte das Fenster nicht finde!", L"Error", MB_OK|MB_ICONERROR); }else { DWORD proccess_ID; GetWindowThreadProcessId(hWnd, &proccess_ID); HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proccess_ID); if(!hProcess){ MessageBox(NULL, L"Fehler: Konnte Prozess nicht öffnen", L"Error", MB_OK|MB_ICONERROR); }else { int newdata = 500; DWORD newdatasize = sizeof(newdata); if(WriteProcessMemory(hProcess, (LPVOID)0x00419004, &newdata, newdatasize, NULL)){ MessageBox(NULL, L"Das schreiben hat funktioniert!", L"Fertig", MB_OK + MB_ICONINFORMATION); }else { MessageBox(NULL, L"Fehler: Konnte nicht schreiben!", L"Error", MB_OK + MB_ICONERROR); } CloseHandle(hProcess); } } return 0; }
Wer C++ kann sollte erkennen das dieser Script eine Memory in einem Programm umändern soll. Bei C++ 2008 Express kommt kein Fehler.
Doch leider kommt immer die Fehlermeldung durch das Programm "Fehler: Konnte Prozess nicht öffnen".Das Projekt ist eine Win32 Konsolenanwendung.
Ich glaub das es ein ganz dummer Fehler ist.Danke für jede hilfreiche Antwort im varaus!!
Programm das ich umändern will:
http://mirror.mdr.comli.com/iVarsReload.zip
Script vom Programm das ich umändern will:#include <windows.h> #include <iostream> #include <conio.h> using namespace std; int var = 1; int repeat = 0; static const TCHAR* myTitle = TEXT("iVar"); int main() { SetConsoleTitle(myTitle); while(repeat < 2) { cin >> repeat; if(repeat == 1) { var = var + 1; cout << "Value of \"Var\" = " << var << endl; cout << "Adress of \"Var\" = " << &var << endl; } } }
-
Dieser Thread wurde von Moderator/in akari aus dem Forum VCL (C++ Builder) 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.
-
Was sagt denn GetLastError() ?
Bei ERROR_ACCESS_DENIED (5) könntest du dir Debug-Privilegien verschaffen.
-
_Falke schrieb:
Was sagt denn GetLastError() ?
Bei ERROR_ACCESS_DENIED (5) könntest du dir Debug-Privilegien verschaffen.Bin noch ziemlicher Anfänger in Sachen Memory und so......
Wie verschaff ich mir den Debug-Privilegien?
-
bool SetPrivilege(HANDLE Token, LPCTSTR pPrivilege, bool EnablePrivilege) { LUID luid; if (!LookupPrivilegeValue( NULL, pPrivilege, &luid )) { cout << "LookupPrivilegeValue error: " << GetLastError() << endl; return false; } TOKEN_PRIVILEGES tp; tp.PrivilegeCount = 1; tp.Privileges[0].Luid = luid; if (EnablePrivilege) tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; else tp.Privileges[0].Attributes = 0; // Enable the privilege or disable all privileges. if ( !AdjustTokenPrivileges( Token, false, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL) ) { cout << "!AdjustTokenPrivileges: " << GetLastError() << endl; return false; } if (GetLastError() == ERROR_NOT_ALL_ASSIGNED) { cout << "The token does not have the specified privilege" << endl; return false; } return true; } bool SetDebugPriv() { HANDLE Token = 0; if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&Token)) cout << "!OpenProcessToken: " << GetLastError() << endl; else if(!SetPrivilege(Token,SE_DEBUG_NAME, true)) { cout << "!SetPrivilege: " << GetLastError() << endl; } if(Token) CloseHandle(Token); return true; }
Und im Programm dann ein Aufruf von SetDebugPriv().
-
_Falke schrieb:
bool SetPrivilege(HANDLE Token, LPCTSTR pPrivilege, bool EnablePrivilege) { LUID luid; if (!LookupPrivilegeValue( NULL, pPrivilege, &luid )) { cout << "LookupPrivilegeValue error: " << GetLastError() << endl; return false; } TOKEN_PRIVILEGES tp; tp.PrivilegeCount = 1; tp.Privileges[0].Luid = luid; if (EnablePrivilege) tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; else tp.Privileges[0].Attributes = 0; // Enable the privilege or disable all privileges. if ( !AdjustTokenPrivileges( Token, false, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL) ) { cout << "!AdjustTokenPrivileges: " << GetLastError() << endl; return false; } if (GetLastError() == ERROR_NOT_ALL_ASSIGNED) { cout << "The token does not have the specified privilege" << endl; return false; } return true; } bool SetDebugPriv() { HANDLE Token = 0; if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&Token)) cout << "!OpenProcessToken: " << GetLastError() << endl; else if(!SetPrivilege(Token,SE_DEBUG_NAME, true)) { cout << "!SetPrivilege: " << GetLastError() << endl; } if(Token) CloseHandle(Token); return true; }
Und im Programm dann ein Aufruf von SetDebugPriv().
An _Falke Vielen Dank! Hat funktioniert!