Da Die C Ecke noch ein wenig leer ist, Dachte ich mir schreibe ich Kurz ein kleines Tutorial/Codesnippet wie man In C# Speicher Schreibt/Ausliest.
Um Dieses Tutorial zu verstehen, solltet ihr bereits eine Erfahrung in C# mitbringen, da ich nur auf die Prozedur an sich eingehen werde.
Zu allererst müssen wir ein Paar Funktionen aus der Kernel32.dll holen: OpenProcess, CloseHandle, ReadProcessMemory und WriteProcessMemory. Um die nötigen Parameter und den Rückgabe wert heruaszufinden, müssen wir einfach die funktionen auf MSDN Nachschlagen:
1 |
|
Um Jetzt Das Ganze in C# auch zu Importieren, Benötigen Wir einen DLLImport für jede der Funktionen.
1 |
|
Auserdem Benötigen wir noch die Flags als Enummeration:
1 |
|
Um jetzt in unserem Program am Speicher zu spielen, müssen wir zuerst den Prozess des gewünschten Programmes in C# öffnen. Dazu müssen wir auch gleichzeitig Angeben, was wir Mit diesem Prozess Anstellen wollen, also ob wir nur lesenden Zugriff, schreibenden etc. möchten.
Wir erstellen uns zuerst eine Variable mit allen Programm Instanzen meines Programmes. Diese ist ein Array vom Typ Process, da ja mehrere Instanzen eures Programmes Theoretisch laufen können. Da ich in meinem Fall davon ausgehe, das nur eine Instanz des Programmes läuft, arbeite ich dementsprechend auch mti dem ersten Prozess des Arrays.
Diesen Prozess müssen wir nun unserer gerade Importierten Funktion OpenProcess zusammen mit den Entprechenden Flags übergeben.
1 |
|
Jetzt haben wir einen geöffneten Handle, und es ist sehr wichtig Geöffnete Handles auch wieder zu schliesen, wenn Sie nicht mehr benötigt werden. Dies geht wie folgt:
|
Der Rückgabe Wert der Funktion CloseHandle ist ein Integer. Dieser ist dann 0, wenn Das Schliesen des Handles Fehlschlägt. Wir können also noch zusätzlich eine Überprüfung einbauen, ob das ganze so funktioniert wie wir uns das Ganze vorgestellt haben:
|
Ich würde euch Empfehlen das Ganze Als Klasse anzulegen, selbiges habe auch ich getan.
Nun Kommen wir aber endlich zum eigentlichen Teil des ganzen Tutorials. Dem Lesen/Schreiben. Dies Geschieht über die Importierten Funktionen ReadProcessMemory/WriteProcessMemory.
Ich gehe Davon Aus ihr habt das ganze als Klasse nun angelegt. WIr Erweitern nun die Klasse um 2 funktionen, zum Lesen/Schreiben.
Zuerst die Lesefunktion:
Sie gibt ein Byte Array zurück, und benötigt als Parameter den Pointer(bzw die Statische Memory Adresse), Die Anzahl der Bytes die Gelesen werden und eine Variable in der Gespeichert wird wieveile Bytes Tatsächlich Gelesen wurden.
1 |
|
Hier Noch ein Anwendungs Beispiel der Lese Funktion:
1 |
|
In meinem Beispiel lese Ich einen 4 Byte Integer. Wollt Ihr stattdessen einen Anderen Typen Lesen, Müsst ihr memoryadressvalue In dem Gewünschten Werten Deklarieren, und auch die Funktion BitConverter.ToInt32 mit BitConverter.ToGewünschterTyp ersetzen, also Beispielsweise BitConverter.ToDouble für einen Double Wert.
Nun kommen Wir zur Schreib Funktion, der letzten Funktion. Diese Funktioniert wie die lese Funktion, mit dem Einzigen UNterschied das sie kein byte Array Zurückgibt, und eine Variable Braucht in welcher Sie Speichern kann wiviele Bytes Sie geschrieben hat.
1 |
|
Wir Müssen nun Lediglich eine Adresse und Unseren gewünschten Wert als Byte array Übergeben. Um den Gewünschten Wert von Integer (oder einem Andren Typ) in ByteArray zu bekommen, könnt ihr euch der Funktion BitConverter.ToTyp bedienen.
Ein Anwendungsbeispiel der Funktion zum Schreiben:
1 |
|
Das Wars eigentlich Schon. Falls Pointer Im einsatz sind, funktioniert das natürlich Genauso gut. Um ein pointer Offset Anzugeben, einfach den wert bei der memoryaddress hinzuaddieren.
Anwendungsbeispiel für ein Pointer zu Pointer, bei welchem wir den Wert Multiplizieren wollen:
1 |
|
Zuerst Wird aus dem Ersten Pointer der Zweite Pointer Ausgelesen. Danach wird über den Zweiten Pointer unsere Adresse Bestimmt, ihr Wert Gelesen, Multipliziert und letztendlich Geschrieben.[/code]
Ich hoffe das Tutorial war Einigermasen Verständlich geschrieben, und hat etwas geholfen. Auf Feedback würde ich mich natürlich freuen.
Viele Grüße
Cpt.Blubber
P.S.: Bitte Kopiert dieses Tutorial nicht ohne meine Zustimmung.