Sezione |
Indirizzi Base
Registri Interni
|
Schede del Tutorial |
Struttura dell'Header dei Files EXE |
SCHEDA n° 01 [ 3 di 4] |
|
|
I primi 29 bytes 00000000 (il primo byte del file) e l'offset 0000001C) descrivono le singole voci di questa parte; riportiamo per comodità i primi 32 bytes di ogni file EXE e cerchiamo di chiarire il loro significato: |
|
00000000:4D 5A 0E 01
02 00 00 00 00000008:20 00 00 00 FF FF 00 00 00000010:00 00 31 08 00 01 00 00 00000018:1E 00 00 00 01 00 00 00 |
00000000:4D 5A 19
01
02 00 00
00 00000008:20 00 00 00 FF FF 00 00 00000010:00 00 8A E1 00 01 00 00 00000018:1E 00 00 00 01 00 00 00 |
|
offset 0000,
byte,
4D
(DB
4DH)
4D
(DB
4DH) offset 0001, byte, 5A (DB 5AH) 5A (DB 5AH), Signature Nella presentazione abbiamo già anticipato lo scopo di questa piccola stringa (MZ): solo se è presente il caricatore del Dos capisce che si tratta di un file EXE (altrimenti lo tratta come COM, anche se ha estensione EXE). Per la cronaca le lettere sono le iniziali di Mark Zbikowski, veterano programmatore Microsoft. | |
offset 0002,
word,0E
01 (DW
010EH),19
01 (DW
0119H), LastPageSize Indica la lunghezza dell'ultima pagina del file, in pratica il numero ottenuto come resto dividendo per 512 (pagina) la dimensione del file. Nei nostri 2 casi vale rispettivamente 270 e 281; data la piccola dimensione dei sorgenti, levando i 256 bytes previsti per il PSP, i numeri ottenuti, 14 e 26, rappresentano l'esatta dimensione del codice macchina. | |
offset 0004,
word,02 00
(DW 0002H),02 00
(DW 0002H),
PageCount Esprime il numero di pagine (zone da 512 bytes) previste per il nostro EXE (header e modulo caricabile); nei nostri esempi ne servono 2, anche se la seconda sarà utilizzata solo parzialmente. | |
offset 0006,
word,00 00
(DW 0000H),00 00
(DW 0000H),
RelocationRecords Indica al loader il numero elementi da rilocare presenti nella tabella di rilocazione; i nostri EXE non hanno elementi. | |
offset 0008,
word,20 00
(DW 0020H),20 00
(DW 0020H),
HeaderParagraphs
Comunica al loader la lunghezza dell'intestazione (header) espressa in paragrafi (aree da 16 bytes); con questa informazione è possibile localizzare con certezza l'inizio del programma (modulo caricabile). Il dato letto nei nostri EXE è di 32 paragrafi, pari a 512 bytes. Per consentire il funzionamento del debugger sarebbe opportuno prevedere un numero multiplo di 512 in questa posizione, anche se ai fili del caricamento in memoria (loader) basta che sia multiplo di 16. | |
offset 000A,
word,00 00
(DW 0000H),00 00
(DW 0000H),
MinimunAllocation Esprime il numero di paragrafi (gruppi di 16 bytes) necessari sopra il programma caricato, perchè possa funzionare correttamente. | |
offset 000C,
word,FF
FF (DW
FFFFH),FF
FF (DW
FFFFH), MaximunAllocation Esprime il numero di paragrafi (gruppi di 16 bytes) da fornire al programma al momento del caricamento; in entrambi i nostri casi la memoria allocata è di 1 gigaByte (65536*16), anche se poi, in realtà l'effettiva quantità dipende dal numero di segmenti liberi. | |
offset 000E,
word,00 00
(DW 0000H),00 00
(DW 0000H),
InitialSS offset 0010, word,00 00 (DW 0000H),00 00 (DW 0000H), InitialSP Indica il valore del puntatore SS:SP al momento del caricamento; naturalmente il valore della parte segment (da copiare in SS) sarà corretto dalla rilocazione, sommando a InitialSS il valore del segmento in cui è caricato il programma: la parte offset (InitialSP) non è invece riferita al segmento e perciò non deve essere rilocata e sarà copiata così com'è in SP. | |
offset 0012,
word,31
08 (DW
4000H),8A
E1 (DW
E18AH), CheckSum Numero usato dal Linker come parola di controllo (Checksum) ottenuto sommando il valore di tutte le word del file, ignorando l'overflow. | |
offset 0014,
word,00
01 (DW
0100H),00
01 (DW
0100H), InitialIP offset 0016, word,00 00 (DW 0000H),00 00 (DW 0000H), InitialCS Indica il valore del puntatore CS:IP al momento del caricamento; naturalmente il valore della parte segment (da copiare in CS) sarà corretto dalla rilocazione, sommando a InitialCS il valore del segmento in cui è caricato il programma: la parte offset (InitialIP) non è invece riferita al segmento e perciò non deve essere rilocata e sarà copiata così com'è in IP. | |
offset 0018,
word,1E 00
(DW 001EH),1E 00
(DW 001EH),
StartOfRelocationTable Indirizzo della prima voce della tabella di rilocazione. | |
offset 001A,
word,00 00
(DW 0000H),00 00
(DW 0000H),
OverlayNumber Numero degli eventuali overlay. |
|
Scheda n° 01 | Struttura dell'Header dei Files EXE | |||||||
Scheda n° 01 - 3 |
|
|
|
|
Home |
|
|||||||
|
Motore Ricerca |
|