Ciao e bentornato.
Continuiamo.
Se facciamo clic su una di queste sezioni, possiamo vedere i dati qui sotto.
Per la sezione dei dati, si può vedere la stringa.
Salve, salve, mondo.
Windows leggerà i dati nelle sezioni qui presenti dal file del disco e quindi utilizzerà il suo indirizzo grezzo, l'indirizzo grezzo
e la dimensione grezza per copiarli nella memoria virtuale.
Tuttavia, quando copia tutto questo nella memoria virtuale, utilizza la dimensione virtuale.
La dimensione grezza e quella virtuale non sono uguali, come si può vedere.
Pertanto, quando viene copiato nella memoria virtuale, si noterà che è diverso.
Possiamo confermarlo verificando con Process Hacker qui.
L'indirizzo grezzo è 200, ma quando viene copiato nella memoria virtuale, assumerà un indirizzo diverso
e l'offset sarà 1000.
Quindi, quando veniamo qui, possiamo vedere che l'offset è 1000.
400000 è l'indirizzo dell'immagine di base, come abbiamo visto in precedenza.
Quindi prendiamo la base dell'immagine più l'offset e otteniamo questo indirizzo.
Successivamente, esamineremo i file DLL.
Librerie a collegamento dinamico.
Consideriamo un programma.
Come questo.
Ora c'è il programma uno e il programma due.
Entrambi fanno uso della funzione helper.
Dal momento che entrambi condividono lo stesso codice, sarebbe meglio creare un file dalla funzione helper in
modo che possano condividere il codice piuttosto che ripetere la funzione
helper in ogni codice.
Quindi, se si toglie la funzione helper e la si inserisce in un file, si otterrà qualcosa di molto diverso.
Diamo un'occhiata.
Alla fine otterremo qualcosa di simile.
Ora questa funzione ausiliaria è stata inserita in un file DLL.
Questo è il significato delle librerie di collegamento dinamico DLL.
Ha le caratteristiche di . estensione del dll sul retro.
Anche un file DLL utilizza il formato PE.
Proprio come il file eseguibile di Windows con l'estensione . estensione exe simile a quella dei
file EXE.
I file DLL contengono anche codice e istruzioni eseguibili.
Se si fa clic su un file
EXE.
Verrà avviato come processo.
Ma se si fa clic su un file DLL, non viene avviato un processo.
Questo perché i file DLL non possono essere utilizzati indipendentemente e possono essere utilizzati solo in combinazione con
un altro file EXE.
È possibile utilizzare TrID per rilevare se un file è una DLL o un file EXE.
Un altro modo è quello di utilizzare il campo delle caratteristiche nel formato del file PE.
Se il file è una DLL, il campo delle caratteristiche contiene un valore che indica questa proprietà e CFF Explorer
lo mostra.
Facciamo un esempio.
Campione 4-2.
Eseguiamo TrID e controlliamo il campione 4-2.
E si possono vedere 10. Il 3% dice che si tratta di una libreria di collegamento dinamico.
Per confermarlo, possiamo aprirlo in CFF Explorer.
Trascinatela qui e si aprirà una scheda separata per essa.
Se si fa clic su Intestazione file e sul campo Caratteristiche, si può notare che il flag indica che il
file è una DLL.
Quindi il CFF Explorer e il TrID confermano che si tratta effettivamente di un file DLL.
Una DLL è solo un altro file PE.
Pertanto, quando un file PE eseguibile sta per essere eseguito, Windows carica prima i file DLL in memoria.
Windows controllerà quindi l'elenco delle funzioni esportate dai file DLL.
Facendo riferimento alla directory di importazione, nota anche come tabella di importazione.
Quindi, se si torna all'esempio 4-1 e si fa clic su Importa directory, si può vedere che l'esempio 4-1
deve avere msvcrt. dll.
Quindi se ora si esegue.
Esempio 4-1 e guardate la scheda Moduli.
Apriamola.
Hacker di processo.
Fare doppio clic sul campione 4-1.
Se si accede alla scheda Moduli, si vedrà che l'esempio 4-1 fa uso di.
Questo.
Ciò conferma quanto abbiamo appena visto con CFF Explorer.
Ciò conferma che questa libreria, la libreria di runtime Microsoft C, viene caricata nella memoria virtuale del
file EXE.
Esempio 4-1.
Una delle cose che si possono notare nella scheda Moduli è che ci sono
molte altre DLL oltre a questa.
Ma qui non si vede.
Questo è dovuto al concatenamento delle dipendenze.
Anche il file DLL del runtime di Microsoft Visual C ha delle dipendenze.
Ha bisogno anche di altre DLL.
Ecco perché sono presenti anche altre DLL.
Oltre a questo msvcrt. dll.
Quindi, insieme, formano una catena.
Potrebbe essere necessario kernel32.
kernel32 potrebbe aver bisogno di qualcos'altro.
E così via.
Si può anche usare Dependency Walker, che è qui per verificarlo.
L'esempio 4-1 ha bisogno di questa DLL, ma questa DLL ne ha bisogno di molte altre come kernelbase, ntdll e così via.
Ecco perché si vedono alcune DLL aggiuntive caricate nella memoria virtuale di questo EXE.
Ecco cosa si intende per catena di dipendenze.
Un altro concetto importante è quello di tabella degli indirizzi di importazione IAT.
La domanda ora è: come fa il PE a sapere quale parte della DLL contiene la funzione di cui ha bisogno?
Lo fa tramite una cosa nota come tabella degli indirizzi di importazione IAT.
Tornando a questo esempio, il programma uno e il programma due devono entrambi utilizzare la funzione helper che proviene
da questa DLL.
Proviamo ora gli altri campioni.
Rinominiamo il campione 4-2.
E aggiungere . dll perché abbiamo appena confermato che si tratta di una DLL. Ora il campione 4-3
è un EXE, quindi lo rinominiamo, e richiede la DLL di cui sopra.
Chiudiamo la partita e facciamo un campione 4-3.
Quindi, quando si esegue l'esempio 4-3, viene visualizzato il messaggio helper function 2 proveniente da questa DLL.
Apriamo ora il campione 4-3 in CFF
Explorer.
E questo.
Chiudiamo questo e lo carichiamo qui.
Ora abbiamo due file, il campione 4-3 e il file DLL corrispondente.
Se si osserva il campione 4-2. dll'Export Directory, si possono notare due funzioni che vengono esportate.
E se andiamo a vedere il campione 4-3. exe Importa directory, vediamo che richiede il campione 4-2 e facciamo
clic su di esso.
Si può notare che richiede la funzione helper 2, che proviene dalla funzione helper 2 di Export Directory.
Ecco come funzionano le DLL.
La DLL ha una directory di esportazione che viene utilizzata dalla directory di importazione EXE.
Questo è l'offset della funzione helper 2.
Ok.
È tutto per questa lezione.
Grazie per aver guardato.