WinAPI in C# - fehler obwohl errorcode = 0



  • Hi!

    Ich habe hier einen Baustein eines Anno1602-Trainers. Es wird der Wert für das Geld ausgelesen und 10000 hinzugefügt. Der neue Wert soll dann auf die Adresse geschrieben werden.

    Process[] proc = Process.GetProcessesByName("1602");
    
                if (proc.Length == 0)
                {
                    MessageBox.Show("No Processes found.");
                    return;
                }
    
                Process po;
    
                po = proc[0];
    
                IntPtr rhdl = OpenProcess(0x10, false, (uint)po.Id); //ReadAccess
                IntPtr whdl = OpenProcess(0x20, false, (uint)po.Id); //WriteAccess
                if (rhdl == null)
                {
                    MessageBox.Show("Readhandle nicht erstellt.", "Fehler!");
                    return;
                }
                if (whdl == null)
                {
                    MessageBox.Show("Writehandle nicht erstellt.", "Fehler!");
                    return;
                }
                byte[] bytes = new byte[4];
                uint adress = 0x560264;
                uint size = sizeof(int);
                uint rw = 0;
                bool read;
                read = ReadProcessMemory(rhdl, (IntPtr)adress, bytes, (UIntPtr)size, ref rw);
                if (!read)
                {
                    MessageBox.Show("Fehlschlag beim Lesen.");
                    return;
                }
                else
                {
                    MessageBox.Show(BitConverter.ToInt32(bytes, 0).ToString(), "Anzahl Geld:");
                }
                int money = BitConverter.ToInt32(bytes, 0);
                money = money + 10000;
                byte[] bytes2 = new byte[4];
                bytes2 = BitConverter.GetBytes(money);
                bool write;
                write = WriteProcessMemory(whdl, (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;
                }
    

    Es müsste alles richtig sein :> dennoch ist write immer false. Ich weiss nicht warum die Operation schief geht, der das Auslesen funktioniert, es wird der richtige Wert angezeigt. Das Handle hat auch Writeacess(0x20), die Kovertierungen der bytearrays waren auch richtig, nachdem ich bytes2 nochmal in int konvertiert und angezeigt habe. Und wenn ich den Errorcode abfrage, dann ist er 0 ^= ERROR_SUCCESS.

    Hier die DLL-Imports:

    [DllImport("kernel32.dll")]
            static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress,
               byte[] lpBuffer, UIntPtr nSize, ref uint lpNumberOfBytesWritten);
    
            [DllImport("kernel32.dll")]
            static extern IntPtr OpenProcess(UInt32 dwDesiredAccess, Boolean bInheritHandle, UInt32 dwProcessId);
    
            [DllImport("kernel32.dll")]
            static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress,
               byte[] lpBuffer, UIntPtr nSize, ref uint lpNumberOfBytesWritten);
    

    Weiss jemand weiter? Vielen Danke fürs Lesen 🙂

    Grüße



  • Damit GetLastWin32Error geht machst du:

    [DllImport("kernel32.dll", SetLastError = true)] 
    // ...
    

    EDIT: oops, SetLastError ist natürlich ne Property vom DllImportAttribute ... korrigiert.



  • Hey Danke, jetzt habe ich wenigstens einen Errorcode. Der lautet 5, was Access Denied heisst. Allerdings ist doch 0x20 der Code für Writememory. Deswegen kann das eigentlich nicht sein. Kann man unter C# einen ALl_ACCESS Handle erstellen? Denn ich meine gelesen zu haben, dass das plattformübergreifend nicht geht.

    Grüße

    EDIT:

    Oh Mensch, es geht. Habe ein allaccess handle simuliert, bei 0x0008 gings dann endlich. Dummerweise erst aufgefallen, als ich alle Codes durchgegangen bin. Danke!

    Für die Nachwelt: Man braucht:
    IntPtr whdl = OpenProcess(0x0020 | 0x0008, false, (uint)po.Id); //WriteAccess



  • Hmm wo müssen die DLL Import Codes den hin? Gibts irgendow ne Anleitung zum memhackinhg mit C#?



  • Dr.Dre schrieb:

    Hmm wo müssen die DLL Import Codes den hin?

    http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.aspx

    Dr.Dre schrieb:

    Gibts irgendow ne Anleitung zum memhackinhg mit C#?

    http://www.gidf.de



  • O.o schrieb:

    Dr.Dre schrieb:

    Hmm wo müssen die DLL Import Codes den hin?

    http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.aspx

    Dr.Dre schrieb:

    Gibts irgendow ne Anleitung zum memhackinhg mit C#?

    http://www.gidf.de

    Ich weiss das man sowas mit Google suchen kann, nur habe ich nichts für mich brauchbares gefunden.


Anmelden zum Antworten