Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi WriteProcessMemory & Float (https://www.delphipraxis.net/156099-writeprocessmemory-float.html)

Muellermilchtrinker 19. Nov 2010 17:00

WriteProcessMemory & Float
 
Hallo DP,

ich hab mal wieder eine kleine Frage zu RAM-Manipulation. Ich kann ja eine Floatdresse auslesen. Ich bekomm dann einen Wert wie 1. oder 0.
Nun will ich jetzt den Wert 1. in die Adresse schreiben. Wie mache ich das. Für Byteadressen nutze ich den Code:
Delphi-Quellcode:
GetMem(buf,1);
buf^ := Chr(2);
WriteProcessMemory(HandleWindow,ptr($599C86),buf,1,temp);
FreeMem(buf);
So schreibe ich den Wert 2 in die Adresse $599C86. Wie kann ich nur einen Floatwert wie 1. in eine Adresse schreiben.
Danke schonmal.

Assarbad 20. Nov 2010 00:22

AW: WriteProcessMemory & Float
 
Es gibt da diese tolle Webseite. MSDN heißt die. Dort kann man dann nach Win32-Funktionen wie MSDN-Library durchsuchenWriteProcessMemory suchen und deren Beschreibung finden. Toll oder?

Wenn man dann nur mal auf die Parameternamen guckt und sein Englisch oder ein Wörterbuch bemüht, kommen dann ganz lustige Zusammenhänge raus.

Code:
hProcess == Prozeßhandle
lpBaseAddress == Basisadresse
lpBuffer == Puffer
nSize == Größe (des Puffers in Byte)
lpNumberOfBytesWritten == geschriebene Bytes
So und dann gucken wir mal auf deinen Code:

Delphi-Quellcode:
WriteProcessMemory(HandleWindow,ptr($599C86),buf,1,temp);
Hmm, seltsam. HandleWindow? Sollte das etwa ein Fensterhandle sein? Das wäre natürlich falsch, denn dort muß ein Prozeßhandle rein (MSDN-Library durchsuchenOpenProcess etc). Der nächste Parameter riecht mir auch schon nach Problemen, weil Adressen nunmal die dumme Angewohnheit haben sich zu ändern. Ja, auch wenn es sich um das gleiche Programm handelt. Aber ab 1,6 MiB (Größe des Zielprogramms, aufgrund der Adresse) könnte die Adresse allerdings auch innerhalb des Programmabbildes liegen, dann hätte man auf Systemen ohne EMET und vor Vista eventuell Glück mit einer konstanten Adresse. Aber alles in allem ist das nicht soooo toll.

Hmm, buf ... klingt nach nem Puffer, oder? Und oben haste 1 Byte alloziert. Wenn wir also mehr als ein Byte schreiben wollen, nehmen wir? ... na? Genau! Wir nehmen sizeof(TypName) Bytes. Also für einen Float wäre das dann je nach Zieltyp sizeof(Real) oder sizeof(Extended) usw. ...

Und das tolle an temp ist, daß man ihm nach Aufruf der Funktion entnehmen kann wieviele Bytes erfolgreich geschrieben wurden.

Zusätzlich zu MSDN-Library durchsuchenASLR ab Vista können dir noch die Integritätsniveaus deines und des Zielprozesses dazwischenfunken wenn sie sich unterscheiden. Gibt es bei MSDN auch ganz tolle Doku zu ...

Alles in allem würde ich sagen, daß du deine Frage mit einer kurzen Webrecherche auch selber hättest lösen können. Wenn eine kurze Webrecherche nicht gereicht hätte, dann hapert's wohl am Grundwissen. Und wie sagte der olle Schrumpelkopp zu Lebzeiten? Genau:

Lernen! Lernen! Lernen! :zwinker:


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz