C# WriteProcessMemory

02/27/2012 20:35 insert-name-here#1
Hey Leute hab nen Problem mit den schreiben von werten in den speicher ...

hier ma grob der code der damit zusammen hängt
Code:
//die eingebundene dll

[DllImport("kernel32.dll")]
static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress,
byte[] lpBuffer, UIntPtr nSize, ref uint lpNumberOfBytesWritten);

// die Methode fürs Handle
            Process[] Game_Processes = Process.GetProcessesByName(Settings1.Default.process);
            while (Game_Processes.Length == 0)
            {
                Game_Processes = Process.GetProcessesByName(Settings1.Default.process);
            }
            Process Game = Game_Processes[0];
            readHandle = OpenProcess(0x10, false, (uint)Game.Id);
            writeHandle = OpenProcess(0x0008, false, (uint)Game.Id);
            if (writeHandle == null)
            {
                MessageBox.Show("Writehandle nicht erstellt.", "Fehler!");
                return;
            } 
//
// Und hier den teil mit dem auslesen 
//
            static uint size = sizeof(int);
            uint rw = 0;
            int value = 10000;
            byte[] bytes2 = new byte[4];
            bytes2 = BitConverter.GetBytes(value);
            bool write;
            write = WriteProcessMemory(writeHandle, (IntPtr)adress, bytes2, (UIntPtr)size, ref rw);

            if (write)
                MessageBox.Show("Write erfolgreich!");
            else if (!write)
            {
                int error = Marshal.GetLastWin32Error();
                MessageBox.Show(" Write Fehlgeschlagen. Errorcode: " + error.ToString(), "Fehler!");
                return;

            }
der compiler gibt keinen error aber die messagebox gibt immer den errorcode 0 aus weis aber leider nicht wofür der steht jemand ne id ?
02/27/2012 20:45 irrenhaus#2
Hab deinen Code mal umgeschrieben, sollte nun funktionieren:
Code:
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool WriteProcessMemory(IntPtr hProcess, int lpBaseAddress, byte[] lpBuffer, int nSize,int lpNumberOfBytesWritten);
IntPtr Handle;
[DllImport("kernel32.dll")]
static extern IntPtr OpenProcess(UInt32 dwDesiredAccess, bool bInheritHandle, int dwProcessId);

void getHandle()
{
while(Process.GetProcessesByName(Settings1.Default.process).Length == 0)
{
}

Process game = Process.GetProcessesByName(Settings.Default.process)[0];
try
{
Handle = OpenProcess(0x001F0FFF,true,game.Id);
}
catch(Exception e)
{
MessageBox.Show("Error! Exception:" + e.Message);
}
}

bool WriteMemory(IntPtr Handle,int Address,int Value)
{
try
{
byte[] btValue = BitConverter.GetBytes(Value);
return WriteProcessMemory(Handle,Address,btValue,btValue.Length,0);
}
catch(Exception e)
{
MessageBox.Show("Error! Exception:" + e.Message);
}
}
finde ich am einfachsten von Allen.
02/27/2012 21:25 insert-name-here#3
Danke werde es gleich austesten kann ich dann handle zum lesen und schreiben nutzen ?

edit :
Jo vielen vielen Dank klapt alles =)
frage mich noch wo der fehler lag aber es klapt =)
02/29/2012 22:06 Adroxxx#4
#moved