Seltsames Problem mit WriteProcessMemory



  • Ich kann es mir nicht erklären 😕
    Ein Auszug aus meiner Lib:

    DWORD Process::writeWideString(DWORD_PTR address, const std::wstring& value) const
    	{
    		DWORD	bytesWritten = 0;
    		int		ec;
    
    		size_t stringLength = (value.length() + 1) * sizeof(wchar_t);
    		ec = WriteProcessMemory(	processHandle_,
    									reinterpret_cast<LPVOID>(address),
    									static_cast<LPVOID>(const_cast<wchar_t*>(&value[0])),
    									stringLength,
    									&bytesWritten
    								);
    		if(!ec || bytesWritten != stringLength)
    		{
    			std::stringstream error;
    			error << "Process::writeWideString() Error : WriteProcessMemory() failed writing at 0x" << 
    			std::hex << address << std::dec << " (" << bytesWritten << 
    			" bytes written) with errorcode: " << GetLastError();
    
    			throw std::runtime_error(error.str());
    		}
    
    		return bytesWritten;
    	}
    

    Die geworfene Exception sieht wie folgt aus:

    Process::writeWideString() Error : WriteProcessMemory() failed writing at 0x48a0000 (0 bytes written) with errorcode: 87
    

    Errorcode 87: The parameter is incorrect.

    Was ich mir gerade nicht erklären kann. Benutzt wird die Funktion in folgendem Kontext:

    SafeRemoteMemory remotePathBuffer(allocateMemory(dllPath.length() + 1) * sizeof(wchar_t), processHandle_);
    		writeWideString(remotePathBuffer, dllPath);
    

    Also, sie wird mit korrekt durch VirtualAllocEx angelegtem Speicher gefüttert.

    Kann mir jemand auf die Sprünge helfen? Habe meine Lib bis vor kurzem (Größtenteils neu geschrieben) immer problemlos nutzen können 😕

    Danke!
    Grüße,
    Flo

    Edit: Ich komme mir so dämlich vor. Die Addresse mit sizeof(wchar_t) zu multiplizieren war wohl epic fail. 🙂


Log in to reply