Code zur Laufzeit ändern

8

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.

    
polo 29.03.2010, 09:57
quelle

4 Antworten

6

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

    
GJ. 29.03.2010, 11:19
quelle
3

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.

    
Aram Hăvărneanu 29.03.2010 10:02
quelle
0

Im Allgemeinen versuchen Sie, in das Codesegment zu schreiben, etwas, was neue Betriebssysteme verhindern werden. So haben einige Viren funktioniert.

Es gibt APIs, die diesen Schutz entfernen, aber sie sind vom Betriebssystem abhängig.

    
elcuco 29.03.2010 10:03
quelle
-1

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

    
Andrey 29.03.2010 10:03
quelle

Tags und Links