2010-07-28 11 views
9

"Consideriamo un tipico x86 di Windows o architettura AMD64, la memoria è divisa in sezioni eseguibili che non possono essere scritti e sezioni di dati che può essere scritto, ma non possono essere eseguito (si pensi DEP)."Come viene iniettato il codice JIT in memoria ed eseguito?

"JIT compila metodi in memoria, fa (generalmente) non riporre oggetti di disco, invece sposta intorno dove il puntatore istruzione successiva può raggiungere esso, cambia la corrente puntatore all'istruzione (indicando il JIT) al punto al codice appena generato e quindi lo esegue . "

Questi due paragrafi, anche se un po 'troppo semplificati, sono ciò che fondamentalmente comprendo del modello di memoria JIT e Windows. So anche che quando provo a copiare un codice eseguibile in memoria a mano e cerco di eseguirlo, generalmente non sarò in grado di farlo (a meno che non sia con l'iniezione DLL).

In che modo i progettisti JIT hanno superato questo ostacolo? Usano un driver ring-0 o tutto è fatto in modalità utente?

risposta

9

Viene semplicemente eseguito con la funzione API di Windows VirtualProtect(). Cambia gli attributi della pagina della memoria virtuale. Da PAGE_READWRITE quindi il compilatore JIT può scrivere il codice macchina su PAGE_EXECUTE_READ in modo che possa essere eseguito. Non sono richiesti privilegi speciali per farlo poiché la pagina appartiene al processo che esegue anche il compilatore JIT.

+0

Davvero, * quello * semplice? Ha senso. (OT) Ah, ricordo, l'ultima volta che ho dovuto iniettare qualcosa non era nel mio processo (ad esempio, per cancellare l'eseguibile corrente è necessario prima scaricare l'eseguibile, tipico problema pollo/uovo). – Abel

+0

@Hans: leggendo ulteriormente su di esso, mi chiedo come questo si riferisce a questo [Social MSDN post] (http://social.msdn.microsoft.com/Forums/en-US/clr/thread/2a043d8c-3ac4-4b3d- 9837-0bfe8e7d6788), spiegando che è necessario disporre dei diritti di amministratore per utilizzare 'VirtualProtect' per modificare il flag e affermare che non può funzionare in questo modo. Con ActionScript, lo stesso principio funziona con 'VirtualAlloc', [come apparentemente mostrato da questo blogger] (http://null.co.in/2010/04/29/spraying-just-in-time/) (ottiene il nomi sbagliati, vedi pedice alla sua terza immagine). Entrambi i post lasciano supporre che sarebbe invece 'VirtualAlloc'. Quali sono i tuoi pensieri qui? – Abel

+0

@Abel: sembra familiare. No, ho notato in quel post che i diritti di amministratore non erano necessari. Il PO concordato. –

Problemi correlati