.EXE
.EXE (forkortet engelsk executable - executable) - udvidelse af eksekverbare filer, der bruges i operativsystemerne DOS , Windows , Symbian OS , OS / 2 og i nogle andre, svarende til en række formater . Ud over objektkoden kan den indeholde forskellige metadata ( ressourcer , digital signatur [1] ).
.EXE-formater
- MZ er et 16-bit format, det primære DOS .EXE filformat .
- EXE-filer til Windows og OS / 2 bruger forskellige formater til hoveddelen af programmet , men begynder stadig med en stub i MZ-format, som som regel viser beskeden "Dette program kan ikke køres i DOS-tilstand", når du prøver at køre filen i DOSThis program cannot be run in DOS mode. ) og afslutter eksekveringen, selvom det teoretisk set kunne køre noget vilkårlig DOS-kode.
- NE er et 16-bit format, der bruges af Windows 3.x [2] , OS/2 og MS-DOS .
- LE er et blandet 16-bit og 32-bit format, der tidligere blev brugt af OS/2 og Windows (VxD).
- LX er et 32-bit format, der bruges af OS/2.
- PE er et 32-bit og 64-bit format, der bruges i moderne versioner af Windows, startende med Windows NT og Windows 95 .
Filstruktur
EXE-filen genereret af linkeren består af to dele:
- kontroloplysninger til bootloaderen;
- indlæsningsmodul.
Oplysningerne om loaderen, som er beskrevet nedenfor, er placeret i begyndelsen af filen og danner den såkaldte header . Det efterfølges umiddelbart af indlæsningsmodulets krop, som er en kopi af hukommelsesbilledet af opgaven bygget af linkeren.
Standardhoveddelen har følgende format [3] :
00-01 4D5A - .EXE filsignatur;
02-03 Længde af opgavebilledet modulo 512 (det vil sige antallet af nyttige bytes i den sidste blok). Linkere før 1.10 sætter 04 i dette felt; hvis det har en sådan værdi, anbefales det at ignorere det);
04-05 Fillængde i blokke;
06-07 Antal indtastninger i adresseindstillingstabellen;
08-09 Overskriftslængde i 16-byte afsnit. Bruges til at finde ud af starten af belastningsmodulets krop;
0A-0B Minimum mængde hukommelse, der skal tildeles efter slutningen af opgavebilledet (i 16-byte afsnit);
0C-0D Maksimal mængde hukommelse, der skal tildeles efter slutningen af opgavebilledet (i 16-byte afsnit);
0E-0F Segmentadresse for starten af staksegmentet i forhold til starten af opgavebilledet;
10-11 SP-værdi ved indtastning af opgave;
12-13
Kontrolsum - nul minus resultatet af tilføjelse uden at overføre alle ordene i filen;
14-15 IP- værdi
(kommandotæller) ved indtastning af en opgave;
16-17 Segmentadresse for starten af kodesegmentet i forhold til starten af opgavebilledet;
18-19 Adresse på det første element i adresseindstillingstabellen i forhold til begyndelsen af filen;
1A-1B Overlapningssegmentnummer (0 for programrodsegment).
Dernæst er adresseindstillingstabellen. Tabellen består af elementer, hvis antal er skrevet i bytes 06-07. Opsætningstabelposten består af to felter, en 2-byte offset og et 2-byte segment, og specificerer et ord i indlæsningsmodulet, der indeholder adressen, der skal indstilles til den hukommelsesplacering, hvor opgaven indlæses. Indstillingen er som følger:
- Et programsegmentpræfiks (PSP) er bygget i hukommelsesområdet efter den residente del af indlæsningsprogrammet ;
- Standarddelen af headeren læses ind i hukommelsen;
- Længden af belastningsmodulets krop bestemmes (forskellen mellem længden af filen 04-07 og længden af headeren 08-09 plus antallet af bytes i den sidste blok 02-03). Afhængigt af tegnet, der angiver at indlæse opgaven til slutningen af hukommelsen eller til begyndelsen, bestemmes segmentadressen for indlæsning. Dette segment kaldes det indledende segment ;
- Belastningsmodulet læses ind i det indledende segment;
- Tuningtabellen indlæses i arbejdshukommelsen i batches;
- For hver indtastning i opsætningstabellen tilføjes segmentadressen for startsegmentet til segmentfeltet. Som et resultat heraf peger tabelindgangen på et ord i hukommelsen, hvortil segmentadressen for startsegmentet tilføjes;
- Når adresseopsætningstabellen behandles, skrives de værdier, der er angivet i overskriften, til SS- og SP-registrene, og segmentadressen for startsegmentet tilføjes til SS. Segmentadressen for starten af PSP skrives til ES og DS. Styringen overføres til den adresse, der er angivet i overskriften (byte 14-17).
Programsegmentstruktur
Når du får adgang til en ikke-resident kommando eller kalder et program med Exec-operationen, bestemmer DOS minimumadressen, hvorfra det tilsvarende program kan indlæses. Dette område kaldes programsegmentet.
Ved offset 0000 i programsegmentet genererer DOS et programsegmentpræfiks (PSP) . Selve programmet indlæses ved offset 0100.
Programmet afsluttes ved at springe til adresse 0000 i programsegmentet ved at udføre INT 20, eller ved at udføre INT 21 med AH=0 eller AH=4C, eller ved at kalde subrutinen på adresse 0050 i programsegmentet med AH=0 eller AH =4C.
Bemærk: når det afsluttes på anden måde end ved operation 4C, skal programmet først sende til CS adressen for begyndelsen af dets programsegment.
Alle fire metoder returnerer kontrol til den residente del af COMMAND.COM (i dette tilfælde sender operation 4C en udgangskode). Alle fire metoder får det program, der kaldte Exec-operationen (4B), til at fortsætte eksekveringen. I dette tilfælde gendannes interrupt-vektorerne 22, 23 og 24 (terminering, Ctrl-Break, fatal udvekslingsfejl) fra programsegmentpræfikset for den genoptagelige opgave. Herefter overføres kontrollen til opsigelsesadressen. Hvis programmet vender tilbage til COMMAND.COM, overføres kontrollen til den ikke-resident del. Hvis dette sker, mens batchfilen kører, fortsætter den, ellers beder COMMAND terminalen og venter på, at den næste kommando indtastes.
Når et indlæst program tager kontrol, gælder følgende betingelser:
For alle programmer:
- Medieadressen sendes i programsegmentpræfikset ved offset 2C. Miljøet er en sekvens af ASCIIZ- strenge af formen parameter=værdi. Den samlede længde af miljøstrengene er ikke mere end 32 KB; Onsdag starter ved en paragrafgrænse. Den sidste linje efterfølges af en null-byte. Det miljø, der sendes til opgaven af COMMAND, indeholder mindst parameteren COMSPEC= (værdien af denne parameter er det fulde navn på filen, der indeholder COMMAND.COM , der skal bruges ). Den indeholder også værdierne indstillet af PATH, PROMPT og SET kommandoerne. Det miljø, der sendes, er en kopi af miljøet i den overordnede proces. Hvis en opgave forbliver hjemmehørende, vil efterfølgende PATH-, PROMPT- og SET-kommandoer ikke påvirke dens miljø.
- Ved offset 0050 indeholder programsegmentpræfikset programmet til at kalde DOS-operationer. Ved at sætte operationsnummeret i AH kan programmet således kalde procedurer (LCALL) ved PSP + 50 og ikke få adgang til interrupt 21.
- DTA-bufferadressen er sat til PSP +80.
- Filkontrolblokke placeret ved offset 5C og 6C i programsegmentpræfikset udfyldes i henhold til kommandolinjeparametrene . I dette tilfælde, hvis den tilsvarende parameter inkluderer biblioteksnavnet, indtastes kun enhedskoden i FCB, filnavnet er dannet forkert.
- Den uformaterede del, der starter ved offset 81, indeholder kommandolinjetegnene efter kommandonavnet, inklusive alle mellemrum og skilletegn. Længden af denne streng er placeret ved offset 80. Hvis kommandolinjen indeholder omdirigeringsmuligheder (de er angivet med > og < symbolerne), er de ikke inkluderet her, da omdirigeringen er gennemsigtig for programmer.
- Word ved offset 6 indeholder antallet af bytes i dette segment.
- AX-registeret angiver, om enhedsnavnene i parametrene er korrekte:
- AL = FF - enhedsnavnet for den første parameter er indstillet forkert, ellers er AL = 00;
- AH = FF - Enhedsnavnet for den første parameter er forkert, ellers er AH = 00.
For .EXE-programmer:
- DS og ES angiver begyndelsen af programsegmentpræfikset.
- CS-, IP-, SS- og SP-registrene får de værdier, der er angivet af linkeren .
For .COM-programmer:
- Alle fire segmentregistre peger på programsegmentpræfikset.
- Al ledig hukommelse er allokeret til programmet. Hvis programmet starter andre programmer med Exec-operationen, skal det frigøre noget hukommelse til det med Setblock-operationen (4A)
- IP-kommandotælleren er indstillet til 0100H.
- SP-registret angiver slutningen af et programsegment. Segmentlængden ved præfiksplacering 6 reduceres med 0100H for at give plads til den størrelse stak.
- Nulordet placeres oven på stakken.
Noter
- ↑ Windows Authenticode Portable Executable Signature Format (engelsk) (utilgængeligt link) . Hentet 11. december 2009. Arkiveret fra originalen 1. marts 2012.
- ↑ Sådan åbnes en .DLL- eller .EXE-fil i Resource Editor (engelsk) (downlink) . Hentet 11. december 2009. Arkiveret fra originalen 1. marts 2012.
- ↑ Indlæs Windows-programmer fra DOS-prompten med WINSTART // PC Mag. - nr. 30. juni 1992 .
Links