Ich habe einen Zeiger auf eine Funktion (die ich von einer vtable erhalte) und ich möchte die Funktion bearbeiten, indem ich den Assembler-Code zur Laufzeit ändere (einige Bytes ändere). Ich habe versucht, mit memset und auch versucht, den neuen Wert direkt zuweisen (etwas wie mPtr [0] = X, mPtr [1] = Y usw.), aber ich bekomme immer Segmentierung Fehler. Wie kann ich den Code ändern?
(Ich benutze C ++)
OS ist Windows.
Im Allgemeinen: Wenn der Speicher mit dem API-Aufruf VirtualAlloc zugeordnet ist, können Sie die Speicherattribute mit dem API-Aufruf VirtualProtect . Überprüfen Sie die ersten Speicherattribute mit dem API-Aufruf VirtualQuery
Je nach Betriebssystem und / oder Architektur können Sie auf ausführbare Seiten schreiben oder nicht.
Lesen Sie die Dokumentation zum Markieren von Seiten als ausführbar oder schreibgeschützt in den Intel (IA-32e) Handbüchern. Der Code befindet sich möglicherweise in einem schreibgeschützten Abschnitt, daher können Sie nicht in den Code schreiben.
Sie können den Code so markieren, dass er sich nicht in schreibgeschützten Seiten befindet, sondern compilerspezifisch (JIT-Compiler tun dies).
Unter MSVC können Sie den Abschnitt #pragma verwenden, um einen Lese- / Schreibbereich zu erstellen und verwenden Sie #pragma alloc_text , um Funktionen hinzuzufügen.
Speicherbereiche, in denen sich Ihr Code befindet, werden normalerweise als schreibgeschützt gekennzeichnet. Deshalb erhalten Sie einen Segmentierungsfehler. Sie können versuchen, dieses Flag aus Abschnitt entweder durch spezielle Schlüssel für Compiler (nicht sicher darüber) oder durch Ändern der Binärdatei (noch einmal nicht 100%, dass es möglich ist) zu entfernen