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!


Log in to reply