2010-03-29 16 views
8

Ho un puntatore a una funzione (che ottengo da un vtable) e voglio modificare la funzione cambiando il codice assembler (cambiando alcuni byte) in fase di esecuzione. Ho provato a usare memset e ho anche provato ad assegnare direttamente il nuovo valore (qualcosa come mPtr [0] = X, mPtr [1] = Y ecc.) Ma continuo ad avere un errore di segmentazione. Come posso modificare il codice?Modifica del codice al runtime

(sto usando C++)

sistema operativo è Windows.

+1

Quale sistema operativo? – elcuco

+1

Perché stai provando a farlo? sicuramente l'unica ragione è di ridurre la quantità di memoria di lavoro in quanto è possibile caricare sezioni di codice dal disco. Se spieghi cosa stai cercando di fare, forse possiamo aiutarti. – thecoshman

+0

Il codice auto-modificante è difficile. Questo sistema operativo è stato scritto completamente in assembly perché nessun linguaggio di livello intermedio ha la sintassi per consentire il codice auto-modificante: http://valerieaurora.org/synthesis/SynthesisOS/abs.html. –

risposta

6

In generale: se la memoria è allocata con API chiama VirtualAlloc di quanto sia possibile modificare gli attributi di memoria con la chiamata API VirtualProtect. Controllare i primi attributi di memoria con la chiamata API VirtualQuery

+0

Grazie, questo è esattamente quello che stavo cercando – polo

3

A seconda del sistema operativo e/o dell'architettura, è possibile scrivere su pagine eseguibili.

Controllare la documentazione sulla marcatura delle pagine come eseguibile o di sola lettura nei manuali Intel (IA-32e). Il codice potrebbe trovarsi in una sezione di sola lettura, pertanto non è possibile scrivere su di esso.

È possibile che il codice non risieda in pagine di sola lettura, ma è specifico del compilatore (i compilatori JIT lo fanno).

In MSVC, è possibile utilizzare #pragma section per creare una sezione di lettura-scrittura e utilizzare #pragma alloc_text per inserire funzioni in esso.

-1

Le sezioni di memoria in cui risiede il codice sono in genere contrassegnate come readonly. Ecco perché ottieni un errore di segmentazione. Puoi provare a rimuovere questo flag dalla sezione con chiavi speciali per il compilatore (non sono sicuro di ciò) o modificando il file binario (di nuovo, non 100% possibile)

0

In generale, stai provando a scrivere il segmento di codice, qualcosa che i nuovi sistemi operativi ti impediranno di fare. Questo è il modo in cui alcuni virus hanno funzionato.

Esistono API per rimuovere tale protezione, ma sono dipendenti dal sistema operativo.

Problemi correlati