Per rispondere alla tua domanda, devo coprire la descrizione completa di come è stato creato un nuovo processo.
Ne è una buona descrizione nel Capitolo 5 di Windows Internals 6th Edition Part 1 ( ch.5 essendo disponibile liberamente online su il sito Web Microsoft) che spiega esattamente come funziona tutto questo.
Parlerò di una panoramica di ciò che viene detto nel libro, poiché copiarlo alla lettera probabilmente avrebbe alcuni problemi di copyright.
Il caricatore PE è esposto da una serie di API utente in kernel32.dll
, nella famiglia CreateProcess
. Esistono diverse API per fare cose diverse, ad es. eseguire un processo in un contesto di sicurezza alternativo.
Ecco come funziona:
- L'API in modalità utente convalida i parametri di input e li converte nelle loro controparti di sistema (native).
- Quindi apre il file eseguibile e lo carica in memoria.
- Crea l'oggetto del processo esecutivo nel kernel. Ciò comporta il popolamento della struttura
EPROCESS
e la registrazione del processo in vari elenchi.
- Crea il thread principale del processo (stack, contesto di esecuzione, oggetto thread)
- Esegue l'inizializzazione specifica del sottosistema - ad es. CLR init per applicazioni .NET.
- Avvia il thread principale (a meno che non sia stato creato con il set di flag sospeso)
- Carica le DLL appropriate nel contesto del processo.
La maggior parte di questo viene fatto a livello del kernel, usando le appropriate funzioni native con Ps
prefissato. Il set completo di passaggi coinvolti è piuttosto complesso (infatti occupa 15 pagine complete nel libro) e comporta molte azioni diverse a seconda del sistema utilizzato.
La parte difficile della tua domanda è che il "loader" non è realmente qualcosa che ottiene il flusso di controllo. Nell'istante in cui chiami CreateProcess
, stai tecnicamente eseguendo il caricatore. Tuttavia, la parte del kernel del loader inizia quando ntdll!NtCreateUserProcess
passa in modalità kernel. Se siamo veramente rigidi su di esso, potremmo dire che la prima parte del loader è PspAllocateProcess
, poiché questo è ciò che alloca le strutture iniziali.