EXE este extensia comună pentru fișierele ce reprezintă un executabil (un program), folosită în sistemele de operare DOS, OpenVMS, Microsoft Windows, Symbian și OS/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 pentru interfața grafică.

Extensia .exe al programului preinstalat "cmd"

Descriere

modificare

Fișierul EXE se folosește pentru sistemele de operare MS-DOS, Microsoft Windows, OpenVMS, Symbian și OS/2. Este succesorul fișierului COM, 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 numite resurse, ca de exemplu:

Tipuri de executabile

modificare

Există câteva tipuri de formate de fișiere EXE

  • executabile DOS MZ 16 biți - sunt fișierele executabile originale și pot fi identificate de prezența literelor MZ (numite număr magic) la începutul fișierului ASCII
  • executabile DOS 16 biți - Tip de executabile mai nou decât cele DOS MZ, care au fost introduse odată cu multitasking-ul în MS-DOS 4.0. Acest tip poate fi identificat de numărul magic NE în fișierul ASCII. Acestea nu sunt foarte populare datorită faptului ca nu pot fi rulate de alte versiuni de DOS, doar de sistemul de operare Windows pe 32 de biți și unele versiuni de OS/2.
  • 32-bit Linear Executable - Introduse în OS/2 2.0 și compatibil cu orice altă versiune mai mare ce poate fi identificate de LX în ASCII.
  • Mixed 16/32-bit Linear Executable - Introduse în OS/2 2.0 și se pot identifica prin LE în ASCII. Acest tip nu mai este folosit.
  • 32-bit Portable Executable - Introduse odată cu Windows NT, sunt mult mai complexe și contin PE în ASCII (însa nu la început; la început apare MZ). Poate fi rulat de orice versiune de Windows NT și chiar și de către Windows 95 și mai mult.
  • 64-bit Portable Executable - Introduse odată cu versiunea de 64 de biți a sistemului de operare Windows. Acest tip poate fi rulat doar pe unele tipuri de procesoare: x86-64 și IA-64.

Structură unui EXE

modificare

Headerul este format din blocuri de 512 B si paragrafe de 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 este 512)
04-05 Numărul de blocuri din executabil. Daca 02-03 este diferit de 0 atunci numai atât din ultimul bloc este ocupat.
06-07 Numărul de intrari relocate după header. Poate fi 0
08-09 Numărul de paragrafe din header.
0A-0B Numărul de paragrafe suplimentare de care are nevoie executabilul. Aceasta este echivalentul marimii BSS din Unix
0C-0D Numărul maxim de paragrafe aditionale.
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 registrul SS.
10-11 Valoarea inițială a registrului SP.
12-13 checksum-ul unui cuvânt
14-15 Valoarea inițiala a registrului IP
16-17 Valoarea inițiala a registrului CS
18-19 Offset-ul primei relocații
1A-1B Numărul de acoperire. De obicei 0 semnificând ca este programul principal

O structură reprezentând head-erul unui executabil pe 16 biți:

struct EXE {
  unsigned short signature; /* == 0x5a4D */
  unsigned short bytes_in_last_block;
  unsigned short blocks_in_file;
  unsigned short num_relocs;
  unsigned short header_paragraphs;
  unsigned short min_extra_paragraphs;
  unsigned short max_extra_paragraphs;
  unsigned short ss;
  unsigned short sp;
  unsigned short checksum;
  unsigned short ip;
  unsigned short cs;
  unsigned short reloc_table_offset;
  unsigned short overlay_number;
};

struct EXE_RELOC {
  unsigned short offset;
  unsigned short segment;
};

Calcularea Offset-ului

modificare

Offset-ul de la inceputul executabilului se calculeaza astfel:

exe_data_start = exe.header_paragraphs * 16L;

Offset-ul bit-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);