AutoIT in VB.NET übersetzen

  • Hi, ich versuche gerade ein kleines Tool das in AutoIT geschrieben wurde (um genau zu sein der Loader von lolkop für private Silkroadserver) zu übersetzen und komme da an einer Stelle nicht weiter. Es geht um diesen Abschnitt:


    Code
    1. If memread($mid, 0x633D00, 'byte[2]') = '0x7547' Then
    2. memwrite($mid, 0x633D00, 'EB')
    3. 'als Test habe ich dann hier das memwrite... weggemacht und eine MsgBox eingefügt
    4. EndIf


    Hier noch die Funktionen 'memread' und 'memwrite':


    Mir würde auch erstmal reichen, wenn ich nur das erste schaffen würde zu übersetzen, also die 1. Zeile (If memread($mid...)).
    Anstatt memwrite($mid...)) habe ich zum Test eine MsgBox eingefügt und nun ist es so, dass wenn ich das Spiel starte, die MsgBox sofort angezeigt wird.
    Nun, habe ich das gleiche in VB.NET versucht, jedoch kommt bei mir keine MsgBox:

    Code
    1. Dim meinProzess As Process() = Process.GetProcessesByName("sro_client")
    2. Dim Silkroad_Online As Process = meinProzess(0)
    3. Dim mid As IntPtr = OpenProcess(&H10, False, CUInt(Silkroad_Online.Id))
    4. Dim bytes As Byte() = New Byte(2) {}
    5. If ReadProcessMemory(mid, &H633D00, bytes, 2, 0) = &H7547 Then
    6. MsgBox("blubb")
    7. End If


    Woran liegt das? Ist mein Code komplett falsch? Hoffe mir könnte da jemand helfen der sich vielleicht mit beiden Sprachen auskennt..
    Natürlich kann es dann auch C# sein, das ist mir egal, da sich beide sehr ähneln und außerdem gibts ja auch Converter.


    Vielen Dank schonmal!

  • Richtig kanns ja dann nich sein, da ja keine MsgBox angezeigt wird^^
    Ja da gibts noch mehr Code, aber für mein Vorhaben ist nur dieser Teil wichtig und nur der wird auch benötigt. Mein Aufruf muss ja irgendwo falsch sein... wo ich mir beim übersetzen nicht sicher bin ist hier:

    Code
    1. 'Im AutoIT-Code ist das ja so:
    2. ...'byte[2]'...
    3. 'Und ich habe das so in VB.NET gemacht:
    4. ...
    5. Dim bytes As Byte() = New Byte(2) {}
    6. ...


    Da weiß ich nich ob das nun richtig ist, vielleicht liegts ja auch daran, dass es nicht klappt...

  • o.O Wie ohne meinen Code zu sehen? Den hab ich doch im ersten Post schon eingefügt...Also, diesen AutoIT-Code will ich übersetzen:

    Code
    1. $pid = Run('Pfad zur SRO_Client.exe')
    2. $mid = memopen($pid)
    3. If memread($mid, 0x633D00, 'byte[2]') = '0x7547' Then
    4. MsgBox('Test')
    5. EndIf


    Und das ist mein derzeitiger VB.NET-Code:

    Code
    1. Dim sroProcess As Process() = Process.GetProcessesByName("SRO_Client")(0)
    2. Dim mid As IntPtr = OpenProcess(&H10, False, CUInt(sroProcess.Id))
    3. Dim bytes As Byte() = New Byte(2) {}
    4. If ReadProcessMemory(mid, &H633D00, bytes, 2, 0) = &H7547 Then
    5. MsgBox("Test")
    6. End If


    Eigentlich müsste dann die MsgBox kommen, aber es passiert nichts und ich weiß nicht woran es liegt...

  • In VB kann diese Funktion z.B. so aussehen.

    Code
    1. <DllImport("kernel32.dll", SetLastError:=True)> _
    2. Public Shared Function ReadProcessMemory( _
    3. ByVal hProcess As IntPtr, _
    4. ByVal lpBaseAddress As IntPtr, _
    5. ByVal lpBuffer As IntPtr, _
    6. ByVal iSize As Integer, _
    7. ByRef lpNumberOfBytesRead As Integer) As Boolean
    8. End Function


    bzw in C#
    [cs] [DllImport("kernel32.dll", SetLastError = true)]
    static extern bool ReadProcessMemory(
    IntPtr hProcess,
    IntPtr lpBaseAddress,
    IntPtr lpBuffer,
    int dwSize,
    out int lpNumberOfBytesRead
    );[/cs]

  • In VB kann diese Funktion z.B. so aussehen.

    Code
    1. <DllImport("kernel32.dll", SetLastError:=True)> _
    2. Public Shared Function ReadProcessMemory( _
    3. ByVal hProcess As IntPtr, _
    4. ByVal lpBaseAddress As IntPtr, _
    5. ByVal lpBuffer As IntPtr, _
    6. ByVal iSize As Integer, _
    7. ByRef lpNumberOfBytesRead As Integer) As Boolean
    8. End Function


    andrehaehnel ach das meintest du..ja sry, das ist schon die richtige Funktion. Jedoch hab ich das mit ReadProcessMemory hinbekommen:

    Code
    1. Dim sroProcess As Process() = Process.GetProcessesByName("SRO_Client")(0)
    2. Dim mid As IntPtr = OpenProcess(&H10, False, CUInt(sroProcess.Id))
    3. Dim bytes As Byte() = New Byte(2) {}
    4. If ReadProcessMemory(mid, &H633D00, bytes, 2, 0) = "7547" Then 'hier musste ich statt &H7547 einfach nur "7547" schreiben, also die MsgBox wird nun angezeigt
    5. MsgBox("Test")
    6. End If


    Jedoch komme ich nun aber beim WriteProcessMemory nicht weiter, das ist irgendwie sehr kompliziert, AutoIT-Code:


    Mein bisheriger Code ist der:


    Code
    1. WriteProcessMemory(mid, &H633D00, bytes, 2, 0) 'Ich weiß nicht wie/wo ich 'EB' einfügen soll..
    2. Hier noch meine WriteProcessMemory-Funktion:
    3. <DllImport("kernel32.dll")> _
    4. Private Shared Function WriteProcessMemory(ByVal hProcess As IntPtr, ByVal lpBaseAddress As IntPtr, ByVal lpBuffer As Byte(), ByVal nSize As UInt32, ByRef lpNumberOfBytesWritten As UInt32) As Boolean
    5. End Function


    Das ist nun ein wenig kompliziert, da hier nichts farbig markiert wird usw...hoffe mir könnte da trotzdem jemand helfen

  • 0x10 ist VM_Read


    Code
    1. All = 0x001F0FFF,
    2. Terminate = 0x00000001,
    3. CreateThread = 0x00000002,
    4. VMOperation = 0x00000008,
    5. VMRead = 0x00000010,
    6. VMWrite = 0x00000020,
    7. DupHandle = 0x00000040,
    8. SetInformation = 0x00000200,
    9. QueryInformation = 0x00000400,
    10. Synchronize = 0x00100000
  • OK, hab nun &H1F0FFF und merke gerade, dass das auch im AutoIT-Code verwendet wird..ok, aber wie füge ich nun die "EB" ein? Also als welchen Parameter in WriteProcessMemory muss ich es denn übergeben?

  • [cs]
    byte[] myArr = new byte[1] { 0xEB };
    WriteProcessMemory(myProcess, myBaseAddress, myArr, 1, out myBytesWrittenVar);
    [/cs]
    kann in VB.Net etwas abweichen (von der Array Initialisierung)

  • Hm..davor kam immer die Nachricht von Silkroad: "Please execute the Silkroad.exe.", wenn ich es nun mit diesem Code versuche:

    Code
    1. 'davor wird die "sro_client.exe" gestartet...
    2. Dim sro As Process = Process.GetProcessesByName("SRO_Client")(0)
    3. Dim mid = OpenProcess(&H1F0FFF, False, sro.Id)
    4. Dim bytes As Byte() = New Byte(0) {}
    5. Dim myArr As Byte() = New Byte(0) {&HEB}
    6. If ReadProcessMemory(mid, &H633D00, bytes, 2, 0) = "7547" Then
    7. WriteProcessMemory(mid, &H633D00, myArr, 2, 0)
    8. End If


    Mit diesem Code kommt zwar die "Please execute the Silkroad.exe." MsgBox nicht mehr und die SRO_Client.exe sieht man auch im Prozessmanager, jedoch nur für ~2sec, dann verschwindet es wieder -.-"
    Im AutoIT-Code ist ja noch diese Schleife in der "memwrite"-Funktion:

    Code
    1. Func memwrite($mid, $adress, $hex)
    2. Local $struct = DllStructCreate('byte[' & BinaryLen('0x' & $hex) & ']')
    3. ---> DIESE HIER: For $i = DllStructGetSize($struct) To 1 Step - 1
    4. DllStructSetData($struct, 1, BinaryMid('0x' & $hex, $i, 1), $i)
    5. Next
    6. Local $x = DllCall($kernel32, 'int', 'VirtualProtectEx', 'int', $mid, 'ptr', $adress, 'int', DllStructGetSize($struct), 'dword', 0x40, 'dword*', 0)
    7. DllCall($kernel32, 'int', 'WriteProcessMemory', 'int', $mid, 'int', $adress, 'ptr', DllStructGetPtr($struct), 'int', DllStructGetSize($struct), 'int', 0)
    8. DllCall($kernel32, 'int', 'VirtualProtectEx', 'int', $mid, 'ptr', $adress, 'int', DllStructGetSize($struct), 'dword', $x[5], 'dword*', 0)
    9. EndFunc ;==>memwrite


    Wenn ich diese entferne kommt beim Starten auch Please execute...aber wie kann ich diese in VB.NET schreiben..ich versteh nicht was da mit DllStructGetSize..usw gemeint ist.

  • Es geht um ZSZC und ich versuche den Loader von lolkop nachzumachen...
    Naja aber wenn es nur für die WriteProcessMemory-API benötigt wird, dann müsste es doch auch ohne gehen, oder? Weil der Aufruf ja dann einfach nur so ist:

    Code
    1. memwrite($mid, 0x633D00, 'EB')


    Und ganz oben in der Funktion ist ja noch dieser Code:

    Code
    1. Local $struct = DllStructCreate('byte[' & BinaryLen('0x' & $hex) & ']')


    Da ist irgendwas mit BinaryLen und dann 0x & $hex, also wirds ja am Ende "0xEB", aber wenn ich die Zeile in der Funktion entferne und den Aufruf so verändere:

    Code
    1. memwrite($mid, 0x633D00, '0xEB')


    Dann kommt auch Please execute...
    ich versteh einfach nicht was mir noch fehlt...

  • Sei doch nicht so auf den Auto-It Code fokussiert.


    Um den Sro_Client zu starten musst du nur die richtigen Parameter übergeben und brauchst eig. nur einen Mutex zu erstellen. Stimmt denn auch deine Addresse? Lade den Client mal in Olly und schau dir an was gepatched wird. Die ReadMemory Zeile macht für mich keinen Sinn... Ist der Client gepackt oder warum prüfst du die bytes ab? Und warum machst du ne einfache if-Abfrage wenn dass Sinn ergeben soll müsste es schon eine while Schleife sein, die beendet wird sobald die Bedingung erfüllt ist. Dann prüft man das auch nicht mit einem String ab, sondern als Hex, eventuell musst du dann die Bytes umdrehen, ich weiß nicht genau wie das ausgegeben wird also anstatt 0x7547, dann 0x4775 oder du liest jedes Byte einzeln aus.

  • So, klappt jetzt, hab dieses Tutorial gefunden: [VB]/[Assembler] Tutorial Silkroad Online Patches: Wie finde und editiere ich sie??
    Du hast Recht, die Abfrage brauch ich gar nicht und der Rest war bei mir eigentlich schon richtig, nur hatte ich eine falsche WriteProcessMemory-API ins Projekt eingefügt...also vielen Dank für deine Hilfe!