Willkommen |
|
myGully |
|
Links |
|
Forum |
|
|
|
 |
15.01.11, 19:36
|
#1
|
Registriert seit: Dec 2009
Beiträge: 792
Bedankt: 49
|
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.
|
|
|
15.01.11, 20:55
|
#2
|
Erfahrener Newbie
Registriert seit: Mar 2009
Beiträge: 154
Bedankt: 56
|
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 ]
|
|
|
15.01.11, 21:00
|
#3
|
`
Registriert seit: Nov 2010
Ort: Zuhause
Beiträge: 142
Bedankt: 37
|
Zitat:
Zitat von .ShoXx!
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
Wenn du sogar ne Import-Lib oder ne .def - Datei hast kannste das in ner gescheiten IDE automatisieren
|
|
|
15.01.11, 21:13
|
#4
|
Erfahrener Newbie
Registriert seit: Mar 2009
Beiträge: 154
Bedankt: 56
|
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.
|
|
|
15.01.11, 21:20
|
#5
|
`
Registriert seit: Nov 2010
Ort: Zuhause
Beiträge: 142
Bedankt: 37
|
Zitat:
Zitat von Xalir
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
|
|
|
16.01.11, 00:51
|
#6
|
Erfahrener Newbie
Registriert seit: Mar 2009
Beiträge: 154
Bedankt: 56
|
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.
|
|
|
16.01.11, 00:54
|
#7
|
`
Registriert seit: Nov 2010
Ort: Zuhause
Beiträge: 142
Bedankt: 37
|
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 ...
|
|
|
16.01.11, 01:03
|
#8
|
Banned
Registriert seit: Dec 2010
Beiträge: 90
Bedankt: 91
|
@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.
|
|
|
16.01.11, 01:15
|
#9
|
`
Registriert seit: Nov 2010
Ort: Zuhause
Beiträge: 142
Bedankt: 37
|
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.
|
|
|
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
HTML-Code ist Aus.
|
|
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:30 Uhr.
().
|