UnmapViewOfFile - Änderungen im Speicher werden nicht in die Datei geschrieben
-
Hallo,
ich benutze gerade zum ersten Mal CreateFile/CreateFileMapping/MapViewOfFile und möchte eine Exe-Datei mappen, diese ein wenig verändern und dann wieder speichern.Ich rufe die Funktionen so auf:
HANDLE hFile = CreateFile( path, GENERIC_ALL, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 ); HANDLE hMapping = CreateFileMapping( hFile, 0, SEC_IMAGE | PAGE_EXECUTE_READWRITE, 0, 0, 0 ); HANDLE hView = MapViewOfFile( hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0 ); //... UnmapViewOfFile( hView ); CloseHandle( hMapping ); CloseHandle( hFile );
Dazwischen verändere ich ein paar Bytes und setze vorher über VirtualProtect das nötige writeable-Attribut, da die Sektion nur readable ist.
Das Problem ist, dass die Datei nicht gespeichert wird.
Ich habe es auch schon mit FlushViewOfFile versucht, welches TRUE zurückgibt.
Dennoch bleibt die Datei unverändert..
-
Das mit dem VirtualProtect hab ich nicht verstanden... WARUM musst Du das ändern?
-
Ich mappe ja eine Exe und wenn man SEC_IMAGE angibt, werden doch die Attribute der PE Sektionen als Memory Protections genommen.
Da ich Bytes in einer Sektion verändere, die nicht das writeable-Attribut hat, setze ich es zuerst mit VirtualProtect.Ich habe die Memory Protection auch schon danach wieder rückgängig gemacht, dennoch bleibt die Datei unverändert.
Die MSDN sagt, dass bei SEC_IMAGE andere Flags egal seien, wenn ich danach aber FILE_MAP_ALL_ACCESS angebe, kriege ich von MapViewOfFile ein ACCESS_DENIED und bei CreateFileMapping erstmal Write-, Read- und Execute-Rechte als Flags übergeben, auch wenn diese wohl streng genommen nicht zum Einsatz kommen.
Also nochmal zusammen gefasst:
Ich mappe eine Exe-Datei, dass diese so in den Speicher geladen wird, als hätte man sie ausgeführt, verändere ein paar Bytes und hatte werden würde, was allerdings nicht der Fall ist..
So sollten Memory Mapped Files doch eigentlich funktionieren, oder nicht?
Hab leider auch kein Beispiel dafür gefunden, nur welche, die zeigen wie man damit Shared Memory u.Ä. erstellt.
-
Wenn beim CreateFileMapping es so angegeben wird, dass es ReadOnly ist, dann wird es logischerweise auch nie wieder geschrieben; unabhängig wie Du die Pages verändert hast....
Lass doch das SEC_IMAGE weg... warum brauchst Du das?
-
Wenn beim CreateFileMapping es so angegeben wird, dass es ReadOnly ist, dann wird es logischerweise auch nie wieder geschrieben; unabhängig wie Du die Pages verändert hast....
Wie genau meinst du das?
Ich gebe doch extra GENERIC_ALL, PAGE_EXECUTE_READWRITE und FILE_MAP_ALL_ACCESS an, in der Hoffnung, dass die Datei bei UnmapViewOfFile gespeichert wird.Lass doch das SEC_IMAGE weg... warum brauchst Du das?
Weil ich den Header und die Sektionen ein wenig abgehe.
Und mit RVAs ist das leichter, als die Adressen erst in FileOffsets umzuwandeln.
-
Du hast doch Dene Frage schon mit dem Zitat aus der Hilfe selber beantwortet...
Map doch die Datei einfach zweimal... einmal mit SEC_IMAGE und ein weiteres mal normal...
-
@mannenntmichdendeppen
CreateFileMapping(SEC_IMAGE) ist nicht dafür gedacht PE Files zu modifizieren, und kann es auch nicht "trotzdem".Warum nicht? Vermutlich weil man nur ein paar wenige Spezielfälle sinnvoll behandeln könnte, und diese eingeschränkte Funktionalität einfach keiner braucht.
-
hustbaer schrieb:
@mannenntmichdendeppen
CreateFileMapping(SEC_IMAGE) ist nicht daf�r gedacht PE Files zu modifizieren, und kann es auch nicht "trotzdem".Warum nicht? Vermutlich weil man nur ein paar wenige Spezielf�lle sinnvoll behandeln k�nnte, und diese eingeschr�nkte Funktionalit�t einfach keiner braucht.
erzähl hier nicht so nen mist