EXE
EXEeste extensia comună pentru fișierele ce reprezintă unexecutabil(unprogram), folosită însistemele de operareDOS,OpenVMS,Microsoft Windows,SymbianșiOS/2.În afară de programele executabile, multe fișiere EXE conțin componente numite resurse, cum ar fi imagini bitmap și pictograme (iconițe) pe care programul executabil le folosește pentruinterfața grafică.
Descriere
[modificare|modificare sursă]FișierulEXEse folosește pentru sistemele de operareMS-DOS,Microsoft Windows,OpenVMS,SymbianșiOS/2.Este succesorul fișieruluiCOM,care putea atingea mărimea maximă de 64 KB și de aceea a conținut doar un segment de cod.
În afară de cod executabil, un fisier EXE poate conține și alte componente numiteresurse,ca de exemplu:
- imagini (de obicei in formatbitmap)
- pictograma programului (icon)
- alte fișiere utilizate lainterfața grafică
Tipuri de executabile
[modificare|modificare sursă]Există câteva tipuri de formate de fișiere EXE
- executabileDOS MZ16 biți - sunt fișierele executabile originale și pot fi identificate de prezența literelorMZ(numite număr magic) la începutul fișieruluiASCII
- executabileDOS16 biți - Tip de executabile mai nou decât cele DOS MZ, care au fost introduse odată cumultitasking-ulînMS-DOS 4.0.Acest tip poate fi identificat de numărul magicNEîn fișierulASCII.Acestea nu sunt foarte populare datorită faptului ca nu pot fi rulate de alte versiuni deDOS,doar desistemul de operareWindowspe 32 de biți și unele versiuni deOS/2.
- 32-bit Linear Executable - Introduse înOS/22.0 și compatibil cu orice altă versiune mai mare ce poate fi identificate deLXînASCII.
- Mixed 16/32-bit Linear Executable - Introduse înOS/22.0 și se pot identifica prinLEînASCII.Acest tip nu mai este folosit.
- 32-bit Portable Executable - Introduse odată cuWindows NT,sunt mult mai complexe și continPEînASCII(însa nu la început; la început apareMZ). Poate fi rulat de orice versiune deWindows NTși chiar și de cătreWindows 95și mai mult.
- 64-bit Portable Executable - Introduse odată cu versiunea de 64 de biți a sistemului de operareWindows.Acest tip poate fi rulat doar pe unele tipuri deprocesoare:x86-64șiIA-64.
Structură unui EXE
[modificare|modificare sursă]Headerul este format din blocuri de 512 B siparagrafede 16 B
Offset (hex) | Descriere |
---|---|
00-01 | 0x4d, 0x5a.Acesta este "numărul magic" al unui executabil. |
02-03 | Numărul de octeți in bloc. Dacă valoarea este 0 atunci tot blocul este ocupat (valoarea efectiva este512) |
04-05 | Numărul de blocuri din executabil. Daca02-03este diferit de 0 atunci numai atât din ultimul bloc este ocupat. |
06-07 | Numărul de intrari relocate dupăheader.Poate fi0 |
08-09 | Numărul deparagrafedinheader. |
0A-0B | Numărul deparagrafesuplimentare de care are nevoie executabilul. Aceasta este echivalentul marimii BSS dinUnix |
0C-0D | Numărul maxim deparagrafeaditionale. |
0E-0F | Valoarea relativă a segmentului de stivă. Aceasta este adăugată degmentului la care ruleaza executabilul, și rezultatul este folosit pentru a inițializa registrulSS .
|
10-11 | Valoarea inițială a registruluiSP .
|
12-13 | checksum-ul unui cuvânt |
14-15 | Valoarea inițiala a registruluiIP
|
16-17 | Valoarea inițiala a registruluiCS
|
18-19 | Offset-ul primei relocații |
1A-1B | Numărul deacoperire.De obicei0semnificând ca este programul principal |
O structură reprezentând head-erul unui executabil pe 16 biți:
structEXE{
unsignedshortsignature;/* == 0x5a4D */
unsignedshortbytes_in_last_block;
unsignedshortblocks_in_file;
unsignedshortnum_relocs;
unsignedshortheader_paragraphs;
unsignedshortmin_extra_paragraphs;
unsignedshortmax_extra_paragraphs;
unsignedshortss;
unsignedshortsp;
unsignedshortchecksum;
unsignedshortip;
unsignedshortcs;
unsignedshortreloc_table_offset;
unsignedshortoverlay_number;
};
structEXE_RELOC{
unsignedshortoffset;
unsignedshortsegment;
};
Calcularea Offset-ului
[modificare|modificare sursă]Offset-ul de la inceputul executabilului se calculeaza astfel:
exe_data_start=exe.header_paragraphs*16L;
Offset-ulbit-ului după datele din executabil se calculează astfel:
extra_data_start=exe.blocks_in_file*512L;
if(exe.bytes_in_last_block)
extra_data_start-=(512-exe.bytes_in_last_block);