myGully.com Boerse.SH - BOERSE.AM - BOERSE.IO - BOERSE.IM Boerse.BZ .TO Nachfolger
Zurück   myGully.com > Computer & Technik > Programmierung
Seite neu laden

AutoIt to VB.NET

Willkommen

myGully

Links

Forum

 
Thema geschlossen
Themen-Optionen Ansicht
Ungelesen 15.01.11, 19:36   #1
.ShoXx!
 
Benutzerbild von .ShoXx!
 
Registriert seit: Dec 2009
Beiträge: 793
Bedankt: 49
.ShoXx! ist noch neu hier! | 8 Respekt Punkte
Standard 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?
__________________
To succeed you have to stop being ordinary and be legen - wait for it - dary.
.ShoXx! ist offline  
Ungelesen 15.01.11, 20:55   #2
Xalir
Erfahrener Newbie
 
Registriert seit: Mar 2009
Beiträge: 154
Bedankt: 56
Xalir ist noch neu hier! | 0 Respekt Punkte
Standard

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 Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]
Xalir ist offline  
Ungelesen 15.01.11, 21:00   #3
tha_specializt
`
 
Registriert seit: Nov 2010
Ort: Zuhause
Beiträge: 142
Bedankt: 37
tha_specializt ist noch neu hier! | 0 Respekt Punkte
Standard

Zitat:
Zitat von .ShoXx! Beitrag anzeigen
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
tha_specializt ist offline  
Ungelesen 15.01.11, 21:13   #4
Xalir
Erfahrener Newbie
 
Registriert seit: Mar 2009
Beiträge: 154
Bedankt: 56
Xalir ist noch neu hier! | 0 Respekt Punkte
Standard

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.
Xalir ist offline  
Ungelesen 15.01.11, 21:20   #5
tha_specializt
`
 
Registriert seit: Nov 2010
Ort: Zuhause
Beiträge: 142
Bedankt: 37
tha_specializt ist noch neu hier! | 0 Respekt Punkte
Standard

Zitat:
Zitat von Xalir Beitrag anzeigen
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
tha_specializt ist offline  
Ungelesen 16.01.11, 00:51   #6
Xalir
Erfahrener Newbie
 
Registriert seit: Mar 2009
Beiträge: 154
Bedankt: 56
Xalir ist noch neu hier! | 0 Respekt Punkte
Standard

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.
Xalir ist offline  
Ungelesen 16.01.11, 00:54   #7
tha_specializt
`
 
Registriert seit: Nov 2010
Ort: Zuhause
Beiträge: 142
Bedankt: 37
tha_specializt ist noch neu hier! | 0 Respekt Punkte
Standard

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 Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]
[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]
[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu 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 ...
tha_specializt ist offline  
Ungelesen 16.01.11, 01:03   #8
m3zz0w1x
Banned
 
Registriert seit: Dec 2010
Beiträge: 90
Bedankt: 91
m3zz0w1x ist noch neu hier! | 0 Respekt Punkte
Standard

@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.
m3zz0w1x ist offline  
Ungelesen 16.01.11, 01:15   #9
tha_specializt
`
 
Registriert seit: Nov 2010
Ort: Zuhause
Beiträge: 142
Bedankt: 37
tha_specializt ist noch neu hier! | 0 Respekt Punkte
Standard

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 Mitglieder sichtbar. Bitte einloggen oder neu 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.
tha_specializt ist offline  
Thema geschlossen


Forumregeln
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren

BB code is An
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.

Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:37 Uhr.


Sitemap

().