PInvokeStackImbalance wurde erkannt

  • VB.NET

Es gibt 37 Antworten in diesem Thema. Der letzte Beitrag () ist von Trade.

    PInvokeStackImbalance wurde erkannt

    VB.NET-Quellcode

    1. Module Module1
    2. Public Declare Function OpenProcess Lib "KERNEL32" _
    3. (ByVal DesiredAccess As Int32, _
    4. ByVal InheritHandle As Boolean, _
    5. ByVal ProcessId As Int32) _
    6. As Int32
    7. Private Declare Function ReadProcessMemory Lib "KERNEL32" _
    8. (ByVal Handle As Int32, _
    9. ByVal address As Int32, _
    10. ByRef Value As Int32, _
    11. Optional ByVal Size As Int32 = 4, _
    12. Optional ByVal lpNumberOfBytesWritten As Int64 = 0) _
    13. As Long
    14. Public PROCESS_VM_OPERATION As Int32 = 8
    15. Public PROCESS_VM_READ As Int32 = 16
    16. Public PROCESS_VM_WRITE As Int32 = 32
    17. Private process_id As Int32 = 0
    18. Public pHandle As Integer = 0
    19. Public Function GetProcessId(ByVal game_name As String) As Boolean
    20. Dim Processes() As Process = Process.GetProcesses
    21. Dim process_name As String
    22. Dim i As Byte
    23. For i = LBound(Processes) To UBound(Processes)
    24. process_name = Processes(i).ProcessName
    25. If process_name = game_name Then
    26. process_id = Processes(i).Id
    27. pHandle = OpenProcess(PROCESS_VM_OPERATION + PROCESS_VM_WRITE + PROCESS_VM_READ, False, process_id)
    28. Return True
    29. End If
    30. Next
    31. If process_id = 0 Then
    32. Return False
    33. End If
    34. Return False
    35. End Function
    36. Public Function ReadByte(ByVal address As Int32) As Integer
    37. Dim value As Integer
    38. ReadProcessMemory(pHandle, address, value, 1, 0)
    39. Return value
    40. End Function
    41. Public Function AOBSCAN(ByVal GameName As String, ByVal ModuleName As String, ByVal Signature As Byte()) As Integer
    42. Dim BaseAddress, EndAddress As Int32
    43. For Each PM As ProcessModule In Process.GetProcessesByName(GameName)(0).Modules
    44. If ModuleName = PM.ModuleName Then
    45. BaseAddress = PM.BaseAddress
    46. EndAddress = BaseAddress + PM.ModuleMemorySize
    47. End If
    48. Next
    49. Dim curAddr As Int32 = BaseAddress
    50. Do
    51. For i As Integer = 0 To Signature.Length - 1
    52. If ReadByte(curAddr + i) = Signature(i) Then
    53. If i = Signature.Length - 1 Then
    54. MsgBox(curAddr.ToString("X"))
    55. Return curAddr
    56. End If
    57. Continue For
    58. End If
    59. Exit For
    60. Next
    61. curAddr += 1
    62. Loop While curAddr < EndAddress
    63. Return 0
    64. End Function
    65. End Module


    Hey
    Ich habe diesen Code vom Internet kopiert und in vb.net eingefügt
    Ich weiß das er so nicht funktionieren kann da jetzt in vb.net anders hantiert wird als in vb 6
    kann mir das jemand vielleicht umwandeln und dabei erklären warum das so sein muss?
    Ich möchte nicht immer nachfragen und lernen will ich auch die sachen
    ich hoffe mir kann da jemand helfen!

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Marcus Gräfe schrieb:

    @DerUnwissende Welches Spiel (oder Programm) möchtest du damit manipulieren?


    Ich wollte es nutzen, um die Adressen aus "S4League" auslesen zu können. Ich möchte es eigentlich gar nicht manipulieren, es geht mir mehr um ein externes Panel vom Charakter und seine Daten wie Leben usw. angezeigt zu bekommen.

    Als ich aber gemerkt habe, das es nicht geklappt hat, und ich den PInvoke Fehler hatte, bin ich irgendwie darauf gestoßen, das man statt "Long", "Short" oder andersrum nutzen muss. Das hat mich dann interessiert und nun bin ich hier.

    Hoffentlich könnt ihr mir behilflich sein!

    petaod schrieb:

    Die Lösung ist eigentlich schon in Post#2 (wenn auch ohne viel Erklärung).
    Definiere die Signaturen wie in den verlinkten Beispielen.



    Wie ich bereits sagte, verstehe ich das überhaupt nicht.. Ich war auf den Seiten bereits.
    Deshalb wollte ich fragen, ob ihr es für mich umschreiben könnt und mir sagen könnt, was genau umgeschrieben wurde.

    DerUnwissende schrieb:

    umgeschrieben
    Die korrekten Deklarationen gugst Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ok, das Problem ist ganz simpel. Du brauchst kein Plugin, kein garnix. Das Problem ist, dass die Deklaration der verwendeten Windows-APIs falsch ist.
    Zum Beispiel verwendest du konsequent einen 32-Bit Integer als Pointer. Hier tut sich z.B. das Problem auf, dass du mit einem 32-Bit Integer auf einem 32-Bit System durch kommst. Wenn du aber ein 64-Bit System hast, sind Pointer auch 64-Bit lang. Du hast da aber einen 32-Bit Integer stehen -> geht nicht. Für diesen Fall gibt es den Datentyp IntPtr. Nimm den bei Handles, Adressen,...

    Wenn sich deine Kenntnisse (offensichtlich) noch recht stark in Grenzen halten. Such dir die entsprechenden Deklarationen von pinvoke.net raus.
    z.B. für OpenProcess: pinvoke.net/default.aspx/kernel32.openprocess
    Hier ist dein Problem für die OpenProcess Funktion schon korrigiert. OpenProcess gibt ein Handle zurück. Dieses Handle ist intern ein Pointer. Du hast in deiner Deklarationen als Returntyp einen Int32 stehen. Korrekt ist aber aufgrund des Handles nunma der IntPtr.
    Kurz, google nach "pinvoke <name der funktion>" und kopier die entsprechenden Deklarationen oder übersetze diese selbst.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    thefiloe schrieb:

    Ok, das Problem ist ganz simpel. Du brauchst kein Plugin, kein garnix. Das Problem ist, dass die Deklaration der verwendeten Windows-APIs falsch ist.
    Zum Beispiel verwendest du konsequent einen 32-Bit Integer als Pointer. Hier tut sich z.B. das Problem auf, dass du mit einem 32-Bit Integer auf einem 32-Bit System durch kommst. Wenn du aber ein 64-Bit System hast, sind Pointer auch 64-Bit lang. Du hast da aber einen 32-Bit Integer stehen -> geht nicht. Für diesen Fall gibt es den Datentyp IntPtr. Nimm den bei Handles, Adressen,...

    Wenn sich deine Kenntnisse (offensichtlich) noch recht stark in Grenzen halten. Such dir die entsprechenden Deklarationen von pinvoke.net raus.
    z.B. für OpenProcess: pinvoke.net/default.aspx/kernel32.openprocess
    Hier ist dein Problem für die OpenProcess Funktion schon korrigiert. OpenProcess gibt ein Handle zurück. Dieses Handle ist intern ein Pointer. Du hast in deiner Deklarationen als Returntyp einen Int32 stehen. Korrekt ist aber aufgrund des Handles nunma der IntPtr.
    Kurz, google nach "pinvoke <name der funktion>" und kopier die entsprechenden Deklarationen oder übersetze diese selbst.



    VB.NET-Quellcode

    1. Module Module1
    2. Public Declare Function OpenProcess Lib "KERNEL32" _
    3. (ByVal DesiredAccess As IntPtr, _
    4. ByVal InheritHandle As Boolean, _
    5. ByVal ProcessId As IntPtr) _
    6. As Int32
    7. Private Declare Function ReadProcessMemory Lib "KERNEL32" _
    8. (ByVal Handle As IntPtr, _
    9. ByVal address As IntPtr, _
    10. ByRef Value As IntPtr, _
    11. Optional ByVal Size As Int32 = 4, _
    12. Optional ByVal lpNumberOfBytesWritten As Int64 = 0) _
    13. As Long
    14. Public PROCESS_VM_OPERATION As IntPtr = 8
    15. Public PROCESS_VM_READ As IntPtr = 16
    16. Public PROCESS_VM_WRITE As IntPtr = 32
    17. Private process_id As IntPtr = 0
    18. Public pHandle As Integer = 0


    Ich bin einfach zu dumm.. Das Problem ist, ich habe alles versucht.. Es klappt einfach nichts.. Ich habe auch die Publics unten mit Int32 versucht, aber es klappt nicht.. Ich verstehe das nicht.. Wenn ich das wüsste, wäre dieses Panel schon fertig.. Die Pinvoke Seite verwirrt mich total..


    Edit:

    VB.NET-Quellcode

    1. ​Module Module1
    2. Public Declare Function OpenProcess Lib "KERNEL32" _
    3. (ByVal DesiredAccess As IntPtr, _
    4. ByVal InheritHandle As Boolean, _
    5. ByVal ProcessId As Integer) _
    6. As IntPtr
    7. Private Declare Function ReadProcessMemory Lib "KERNEL32" _
    8. (ByVal Handle As IntPtr, _
    9. ByVal address As IntPtr, _
    10. ByRef Value As IntPtr, _
    11. Optional ByVal Size As Int32 = 4, _
    12. Optional ByVal lpNumberOfBytesWritten As Int64 = 0) _
    13. As Long
    14. Public PROCESS_VM_OPERATION As Int32 = 8
    15. Public PROCESS_VM_READ As Int32 = 16
    16. Public PROCESS_VM_WRITE As Int32 = 32
    17. Private process_id As Int32 = 0
    18. Public pHandle As Integer = 0


    Das klappt auch nicht. Ich verstehe es einfach nicht.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DerUnwissende“ ()

    Ich weiß, wie man die Memory in S4Leauge manipuliert.. Ich habe damit sehr viel Erfahrung..
    Nur, dann habe ich dieses Script gefunden, und wollte es nun nutzen, um die Adressen auszulesen und später deren Value mit einer Methode, die ich bereits kenne, anzeigen zu können..

    DerUnwissende schrieb:

    Ich bin einfach zu dumm..

    Offensichtlich. Ich poste dir den Code zum Copy-Paste und du schaffst es nicht zu kopieren.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Sorry ... aber da kann ich dir nicht helfen. Wenn du das nicht hinbekommst dann wird das nix.
    fs5.directupload.net/images/160116/9ipzp57t.png


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    thefiloe schrieb:

    Sorry ... aber da kann ich dir nicht helfen. Wenn du das nicht hinbekommst dann wird das nix.
    fs5.directupload.net/images/160116/9ipzp57t.png



    Mit vollsten Respekt, ich fragte nach einer Lösung und nicht nach Antworten die mir sagen sollen, wie dumm ich doch sei. Ich sagte es bereits, und das reicht auch.

    Ich hoffe, jemand anderes kann jemanden unerfahrenes wie mir helfen..

    Edit:

    VB.NET-Quellcode

    1. <DllImport("kernel32.dll")> _
    2. Public Function ReadProcessMemory(ByVal Handle As IntPtr, ByVal address As IntPtr, <[In](), Out()> ByVal Value As Byte(), ByVal Size As UInt32, <Out()> ByVal lpNumberOfBytesWritten As IntPtr) As Int32
    3. End Function
    4. <DllImport("kernel32.dll")> _
    5. Public Function OpenProcess(ByVal DesiredAccess As UInt32, ByVal InheritHandle As Int32, ByVal ProcessId As UInt32) As IntPtr
    6. End Function
    7. Public PROCESS_VM_OPERATION As Int32 = 8
    8. Public PROCESS_VM_READ As Int32 = 16
    9. Public PROCESS_VM_WRITE As Int32 = 32
    10. Private process_id As Int32 = 0
    11. Public pHandle As Integer = 0


    Das klappt leider auch nicht..

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „DerUnwissende“ ()

    Und auch dazu gibt es auf der Seite pinvoke.net/default.aspx/kernel32.readprocessmemory ein Beispiel ganz unten.
    Die Methode erwartet ein Byte-Array (ByVal Value as Byte()) wo dann später die Daten reinkommen die du auslesen willst.
    Da übergibst du aktuell einen Integer, deshalb der Fehler.

    VB.NET-Quellcode

    1. <DllImport("kernel32.dll")> _
    2. Public Shared Function OpenProcess(dwDesiredAccess As Integer, bInheritHandle As Boolean, dwProcessId As Integer) As IntPtr
    3. End Function
    4. <DllImport("kernel32.dll")> _
    5. Public Shared Function ReadProcessMemory(hProcess As Integer, lpBaseAddress As Integer, lpBuffer As Byte(), dwSize As Integer, ByRef lpNumberOfBytesRead As Integer) As Boolean
    6. End Function


    VB.NET-Quellcode

    1. Dim processHandle As IntPtr = OpenProcess(0x0010, False, System.Diagnostics.Process.GetProcessesByName(GameName)(0).Id)
    2. Dim bytesRead As Integer = 0
    3. Dim buffer As Byte() = New Byte(64)
    4. ReadProcessMemory(CInt(processHandle), 0x00000000, buffer, buffer.Length, bytesRead)
    5. Dim s As String = Encoding.ASCII.GetString(buffer)


    0x00000000 == Die Adresse die ausgelesen werden soll