Dove si trova il caricatore PE in Windows?

6

Ho letto che il caricatore PE è responsabile del caricamento delle immagini eseguibili dal disco. Quando e dove viene trasferito esattamente il flusso di controllo al caricatore? Il formato PE è ben documentato, ma sembra che ci siano poche informazioni sul funzionamento del caricatore stesso.

    
posta viv 01.12.2012 - 08:39
fonte

2 risposte

14

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.

    
risposta data 01.12.2012 - 16:21
fonte
2

1 \ NtCreateSection - > MmCreateSection - > MiCreateImageFileMap in ntoskrnl.exe. Puoi cercare "wrk" o usare IDA per invertire. Contiene alcuni campi PE che verificano.

2 \ LdrpInitializeProcess in ntdll.dll.

Questi due sono i più importanti.

    
risposta data 26.04.2018 - 10:29
fonte

Leggi altre domande sui tag