myGully.com

myGully.com (https://mygully.com/index.php)
-   Programmierung (https://mygully.com/forumdisplay.php?f=67)
-   -   AutoIt to VB.NET (https://mygully.com/showthread.php?t=2206976)

.ShoXx! 15.01.11 19:36

AutoIt to VB.NET
 
Hallo, ich versuche grade ein kleines in AutoIt geschriebenes Tool nochmal in VB.NET nachzubauen und komme bei einem Abschnitt nicht weiter..vielleicht gibt es hier ja welche die beide Sprachen können (kann natürlich auch C# sein, ist ja eigentlich fast das selbe, außerdem gibts da dann auch Converter)
Also folgender AutoIt-Code:

Code:

If memread($mid, 0x56E2D, 'byte[2]') = '0x3EB2' Then
        memwrite($mid, 0x56E2D, 'EB')
EndIf

Hier sind noch die beiden Funktionen(?):
Code:

Func memread($mid, $adress, $type = 'dword')
        Local $struct = DllStructCreate($type)
        DllCall($kernel32, 'int', 'ReadProcessMemory', 'int', $mid, 'int', $adress, 'ptr', DllStructGetPtr($struct), 'int', DllStructGetSize($struct), 'int', '')
        Return DllStructGetData($struct, 1)
EndFunc  ;==>memread

Func memwrite($mid, $adress, $hex)
        Local $struct = DllStructCreate('byte[' & BinaryLen('0x' & $hex) & ']')
        For $i = DllStructGetSize($struct) To 1 Step - 1
                DllStructSetData($struct, 1, BinaryMid('0x' & $hex, $i, 1), $i)
        Next
        Local $x = DllCall($kernel32, 'int', 'VirtualProtectEx', 'int', $mid, 'ptr', $adress, 'int', DllStructGetSize($struct), 'dword', 0x40, 'dword*', 0)
        DllCall($kernel32, 'int', 'WriteProcessMemory', 'int', $mid, 'int', $adress, 'ptr', DllStructGetPtr($struct), 'int', DllStructGetSize($struct), 'int', 0)
        DllCall($kernel32, 'int', 'VirtualProtectEx', 'int', $mid, 'ptr', $adress, 'int', DllStructGetSize($struct), 'dword', $x[5], 'dword*', 0)
EndFunc  ;==>memwrite

Was ich auch nicht verstehe ist, wie kann man in einer Funktion eine DLL aufrufen? In VB.NET gibt es ja die Read-/ WriteProcessMemory APIs. Muss ich also nur die verwenden und brauch gar keine Funktionen oder wie?

Xalir 15.01.11 20:55

Read/WriteMemoryProcess sind DLL-Aufrufe, die vorher dem Compiler mitteilen musst. In .NET ist es durch die eigenen Klassen nicht möglich, Speicherbereiche zu beschreiben, die nicht zum eigenen Prozess gehören.

Zuerst musst die Funktionen aus der DLL deklarieren.
Code:

<DllImport("kernel32.dll", SetLastError=true)>
Private Function ReadMemoryProcess(ByVal hProcess As IntPtr, ByVal lpBaseAddress As IntPtr, ByVal lpBuffer as Long,  ByVal nSize as System.UInt32,<Out()> ByRef lpNumberOfBytesRead As Int32) As Integer

<DllImport("kernel32.dll", SetLastError=true)>
Private Function WriteMemoryProcess(ByVal hProcess As IntPtr, ByVal lpBaseAddress As IntPtr, ByVal lpBuffer As Byte(), ByVal nSize As System.UInt32, <Out()> ByRef lpNumberOfBytesWritten As Int32) As Boolean

Nun kannst Du die Funktionen erst in Deinem Code verwenden.

Edit: Ob die API-Aufrufe jetzt genauso geschrieben werden kann ich nicht sagen, dazu empfiehlt sich ein Blick in die API-Dokumentation der [Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...]

tha_specializt 15.01.11 21:00

Zitat:

Zitat von .ShoXx! (Beitrag 21781710)
Was ich auch nicht verstehe ist, wie kann man in einer Funktion eine DLL aufrufen? In VB.NET gibt es ja die Read-/ WriteProcessMemory APIs. Muss ich also nur die verwenden und brauch gar keine Funktionen oder wie?

.. WAS? Read / -WriteProcessMemory hat rein garnichts mit DLLs zu tun ... diese lädt man mit LoadLibrary, Funktionen und Methoden darin startet man mit ner lokalen Funktionsdeklaration
Code:

typedef void (funcPtr*)(void) FUNCPTR;
, -Definition
Code:

FUNCPTR funcPtr = GetProcAdress(module, "FUNKTIONSNAME");
und dann letztendlich dem eigentlichen Aufruf
Code:

funcPtr();
Wenn du sogar ne Import-Lib oder ne .def - Datei hast kannste das in ner gescheiten IDE automatisieren

Xalir 15.01.11 21:13

Zitat:

.. WAS? Read / -WriteProcessMemory hat rein garnichts mit DLLs zu tun ... diese lädt man mit LoadLibrary, Funktionen und Methoden darin startet man mit ner lokalen Funktionsdeklaration
Na ist klar *kopfschüttel*

ReadMemoryProcess, WriteMemoryProcess sind direkte API-Aufrufe an die kernel32.dll. Ob Du vorher den Umweg machst die API's vorher zu importieren,macht null Unterschied. Die kernel32.dll bleibt ne DLL.

tha_specializt 15.01.11 21:20

Zitat:

Zitat von Xalir (Beitrag 21782096)
Na ist klar *kopfschüttel*

ReadMemoryProcess, WriteMemoryProcess sind direkte API-Aufrufe an die kernel32.dll. Ob Du vorher den Umweg machst die API's vorher zu importieren,macht null Unterschied. Die kernel32.dll bleibt ne DLL.

... Kann es sein dass du n bischen verwirrt bist? Scheinbar weisst du nicht wie die Frage lautete .... zudem hast du meine Worte im Grunde wiederholt .... nach wie vor hat das Ausführen von Funktionen in DLLs nichts mit Read / WriteProcessMemory zu tun

Xalir 16.01.11 00:51

Du bist eher derjenige, der hier verwirrt ist. Du solltest erstmal die Grundlagen eines PC's lernen, fang am besten mit EVA an. Wenn Du dann fertig bist,kannst Du Dich ja mal schlau machen, wie so ein Prozessor denn eigentlich funktioniert.

Erst dann können wir weiterreden und ich erkläre Dir dann gerne, wie ein Betriebssystem aufgebaut ist. Dann verstehst Du vielleicht auch wie eine DLL funktioniert.

tha_specializt 16.01.11 00:54

ich weiss sehr gut wie eine DLL funktioniert, mein junger Freund ... diese werden nicht beschrieben oder in dem Sinne gelesen wie du es gerne haben möchtest ... aber an deinem Wortlaut kann man ja direkt schon dein Alter, deine geistige Reife und deine Intentionen erkennen ergo : viel Spaß noch.

[Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...]
[Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...]
[Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...]

Zitat:

The first way is to have your application's source code simply reference symbols contained in the DLL. This causes the loader to implicitly load (and link) the required DLL when the application is invoked. This is known as implicit linking.
Zitat:

The second way is for the application to explicitly load the required DLL (using a LoadLibrary() call) and explicitly link to the desired exported symbol while the application is running.
Vielleicht möchtest du dir insbesondere die ersten beiden Links einmal anschauen ...

m3zz0w1x 16.01.11 01:03

@Xalir:

Lass ihn. Er hat irgendwelche starken emotionalen Probleme.
Das Forum ist sein Lebensinhalt.
Seine herablassende Art ist wichtig für sein Ego.
Verzeih ihm also seine eingeschränkten sozialen Fähigkeiten.

tha_specializt 16.01.11 01:15

Da der allseits bekannte Forentroll wieder aufgeschlagen ist, noch schnell die exakte Benatwortung deiner Frage :

Zitat:

wie kann man in einer Funktion eine DLL aufrufen?
Nun, du hast das passende in AutoIt bereits genannt :

Code:

DllCall($kernel32, 'int', 'WriteProcessMemory', 'int', $mid, 'int', $adress, 'ptr', DllStructGetPtr($struct), 'int', DllStructGetSize($struct), 'int', 0)
Sofern du hier einfach dein gewünschte Funktion einträgst und auch aufpasst dass du dir keine Buffer Overflows produzierst scheint es in AutoIt wohl so zu funktionieren - auch ganz ohne LoadLibrary ... das wird denke ich im Hintergrund erledigt. Im Beispiel wird wohl "WriteProcessMemory" aufgerufen ... das sollte dich aber nicht verwirren, hat nichts mit [Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...] zu tun, das Übertragen in VB scheint kinderleicht zu sein :
Code:

Declare Sub getdiskinfo Lib "c:\somepath\diskinfo.dll"
      (ByVal mydrive As String, ByVal myvolume As String, free As Long)

... da wird nichts geschrieben oder gelesen (mal von eventuellen Parametern abgesehen) sondern nur angesprungen, und zwar direkt in den Maschinencode in einer Datei auf der Platte - aber auch dass soll dich nicht weiter stören; die Erklärung hierfür sprengt jeden Rahmen ... is ja auch in Bezug auf das Thema nicht wichtig.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:53 Uhr.

Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.