Strings aus Prozess-Memory lesen

  • VB.NET

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von Lightsource.

    Strings aus Prozess-Memory lesen

    Hallo.

    Mein Ziel ist es, alle möglichen Strings aus dem RAM eines Prozesses zu lesen. Folgenden Post habe ich zur Hilfe genommen
    [VB 2008] Daten aus Spiel auslesen?

    Soweit so gut. Einzelne Strings rauslesen, mithilfe von CheatEngine, klappt eigentlich auch. Aber ich will ja mehr ;)

    Mein aktueller Code:

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Imports System.Text
    3. Public Class Form1
    4. <DllImport("kernel32.dll")> Private Shared Function ReadProcessMemory(ByVal hProcess As IntPtr, ByVal lpBaseAddress As IntPtr, ByVal lpBuffer As Byte(), ByVal nSize As UIntPtr, ByRef lpNumberOfBytesWritten As UInteger) As Boolean
    5. End Function
    6. <DllImport("kernel32.dll")> Private Shared Function OpenProcess(ByVal dwDesiredAccess As UInt32, ByVal bInheritHandle As [Boolean], ByVal dwProcessId As UInt32) As IntPtr
    7. End Function
    8. <DllImport("kernel32.dll")> Private Shared Function CloseHandle(ByVal hHandle As IntPtr) As Boolean
    9. End Function
    10. Private Const PROCESS_VM_READ = &H10
    11. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    12. Dim suchProzesse As Process() = Process.GetProcessesByName("test")
    13. If suchProzesse.Length > 0 Then
    14. Dim Prozess As Process = suchProzesse(0)
    15. Dim readHandle As IntPtr = OpenProcess(PROCESS_VM_READ, False, Prozess.Id)
    16. If readHandle = 0 Then MsgBox("Fehler") : Exit Sub
    17. Dim bytes As Byte() = New Byte(2047) {}
    18. Dim rw As Integer = 0
    19. Dim Memory_Adresse As UInteger = &H1000
    20. ReadProcessMemory(readHandle, Memory_Adresse, bytes, 2048, rw)
    21. Dim TXT As String = Encoding.UTF8.GetString(bytes)
    22. MsgBox(TXT)
    23. CloseHandle(readHandle)
    24. Else
    25. MsgBox("Prozess nicht gefunden!")
    26. End If
    27. End Sub
    28. End Class


    Ich muss ja irgendwo anfangen (ich glaube man kann ab &H1000 anfangen), dann muss man wahrscheinlich ein loop durch den RAM machen. In meinem Beispiel les ich die ersten 2048 bytes aus, danach müsste ich ja ab "Memory_Adresse + 2048" wieder lesen und so weiter. Aber wann ist Schluss?

    Und wie kann ich dann daraus die Strings lesen? Mit dem Encoding.UTF8.GetString scheint es nicht vernünftig zu klappen.

    Und wofür steht eigentlich das "rw"?

    Für jegliche Hilfe wäre ich sehr dankbar :)
    Für ein Mindestmaß an Rechtschreibung, Interpunktion und Majuskeln!