Suoritettavien tiedostojen rakenne käyttöjärjestelmässä. Minkä tyyppinen tiedostopääte on suoritettavilla tiedostoilla? Yleisin

Monet käyttäjät tietokonejärjestelmät Olet todennäköisesti törmännyt suoritettavan ohjelmatiedoston käsitteeseen tavalla tai toisella. Suoritettavat tiedostot eivät aina ole, mutta melko usein niillä on EXE-tunniste, joka on yleinen käyttöjärjestelmissä Windows-perhe. Laajennusten aiheen selventämiseksi tarkastelemme yleistietoja näistä objekteista ja myös tietyntyyppisiä peruslaajennuksia.

Kuinka suoritettavat tiedostot eroavat muista objekteista

Ennen kuin väität, että ohjelman suoritettavalla tiedostolla voi olla vain yksi tietyn tyyppinen tunniste, on välttämätöntä ymmärtää, miten tällainen objekti voidaan erottaa muista. Tärkeimmät erot suoritettavien tiedostojen ja muun tietodatan välillä ovat seuraavat tekijät: itse laajennus, joka ilmaisee joko konekoodin tai tavukoodin sisällön tiedostossa virtuaalikone,allekirjoitus ,attribuutit tiedostojärjestelmässä. Vaikka käyttäjä kuitenkin tietäisi, että suoritettavilla tiedostoilla on EXE-tyyppinen nimipääte, sisältöä ei kuitenkaan voi tarkastella tavallisilla keinoilla, koska tällaisiin objekteihin on käännetty sisältöä, joka näkyy katsottuna merkityksettömänä merkkijoukona. . Yleensä käyttäjän on käytettävä Disassembler-työkalua tai jotain vastaavaa, joka mahdollistaa purkamisen. Mutta emme puhu siitä.

Suoritettavat tiedostot: rakenne

Mitä tulee suoritettavien tiedostojen rakentamiseen, niiden tulee sisältää otsikot (käskyjen, parametrien ja koodimuotojen suunniteltu suoritus) ja itse käskyt (lähde-, kone- tai tavukoodit). Joissakin tapauksissa rakenne voi sisältää virheenkorjaustietoja, ympäristön kuvauksia, käyttöjärjestelmävaatimuksia, luetteloita asiaankuuluvista kirjastoista, ääntä, grafiikkaa, kuvia, pikakuvakkeita ja vastaavia. Monet teistä ovat luultavasti huomanneet, että suurimmaksi osaksi jokaisessa tällaisessa käyttöjärjestelmän tiedostossa on aluksi kuvake.

Toimintaperiaate

Vaikka suoritettavilla tiedostoilla voi olla erityyppisiä tunnisteita, ne toimivat samalla periaatteella. Kun suoritettava tiedosto käynnistetään, se ladataan tietokoneen muistiin. Samalla ympäristö konfiguroidaan ja alustetaan, lisäkirjastoja vedetään esiin, jos ohjelma sallii niiden käytön. Myös tässä vaiheessa konfiguroidaan joitain lisätoimintoja ja itse käskyt suoritetaan käyttäen menetelmiä, jotka on kirjoitettu suoraan tiedostoon.

Suoritettavat ohjelmatiedostot: mikä laajennus niillä on?

Siirrytään nyt tarkastelemaan laajennuksiin liittyvää ongelmaa. Tietenkään ei ole mahdollista harkita kaikkia tyyppejä, se vie paljon aikaa. Korostamme vain yleisimmät ja suosituimmat vaihtoehdot. Joten laajennus asetetaan sisältötyypin mukaan. Esimerkiksi käyttöjärjestelmässä Windows-tyyppi yleisimmät suoritettavat tiedostot ovat EXE laajennus. Tämä koskee kaikkia ohjelmia, jotka on suunniteltu toimimaan näiden käyttöjärjestelmien ympäristössä. Tällaiset esineet sisältävät konekoodit. BIN-tiedostoja ovat hyvin samanlaisia. Erätiedostot, kuten CMD, BAT ja COM, ovat toisen tyyppisiä suoritettavaa tiedostoa. Ensimmäinen tyyppi tässä tapauksessa on erätiedosto Windows. Toisen ja kolmannen tyypin tiedostot kuuluvat DOS-perheen käyttöjärjestelmiin. Monet teistä ovat luultavasti jo törmänneet MSI- ja MSU-tiedostoihin. Tämä voi olla järjestelmäpäivityksen asennusohjelma tai alkuperäinen Windows-käyttöjärjestelmän asennusohjelma. Erillinen tiedostoluokka koostuu makroista ja skripteistä. Nämä ovat tiedostoja, joiden tunniste on JSE, JS, SCR, VBE, VBS, VB. Usein löytyy myös JAD- ja JAR-tiedostoja, jotka on tarkoitettu sovellusten asentamiseen mobiililaitteisiin tai niiden käyttämiseen JAVA-ympäristössä. Tällaiset objektit eivät sisällöltään enää sisällä konekoodeja, vaan virtuaalikonekoodeja.

Mikä laajennus suoritettavilla tiedostoilla on eri käyttöjärjestelmissä?

Jos katsot tarkasti, huomaat, että joissakin käyttöjärjestelmissä on melko erityisiä komponentteja. Esimerkiksi leikkaussalissa Windows-järjestelmä Suoritettaville tiedostoille on erityinen luokka. Yleensä mistä tahansa käyttöjärjestelmästä löytyy sekä vakio- että erikoiskomponentteja. On kuitenkin joitain yleisiä muotoja, kuten HTA, suoritettava HTML-dokumentti. Ne toimivat lähes kaikkialla käytetystä käyttöjärjestelmätyypistä riippumatta. Kuten muun tyyppisissä järjestelmissä, esimerkiksi Mac-tietokoneissa suoritettavilla tiedostoilla on tunniste APP ohjelmille ja PKG jakeluille. Linux-perheen käyttöjärjestelmissä asiat ovat hieman toisin. Ongelmana on, että tällaisissa käyttöjärjestelmissä ei ole lainkaan laajennuskäsitettä. Voit tunnistaa suoritettavan tiedoston sen ominaisuuksista, kuten järjestelmä, piilotettu, vain luku -muotoinen jne. Tämän seurauksena ongelma, joka liittyy laajennuksen vaihtamiseen vaaditun tiedoston käynnistämiseksi tai lukemiseksi, katoaa. Kuitenkin missä tahansa käyttöjärjestelmässä, jopa päällä mobiililaitteet löydät valtavan määrän tämän tyyppisiä esineitä. Sinun ei tarvitse mennä kauas. Samassa Android-perheen käyttöjärjestelmässä asennusohjelman suoritettavalla tiedostolla on APK-tunniste. Apple-laitteissa suoritettavilla tiedostoilla on IPA-tunniste.

Johtopäätös

Tehdään yhteenveto lyhyestä katsauksestamme suoritettavista tiedostopäätteistä. Tässä tapauksessa painopiste oli pääasiassa Windows-perheen käyttöjärjestelmissä olevissa objekteissa. Jäljellä olevia käyttöjärjestelmiä käsiteltiin vain lyhyesti yleistä kehitystä varten. Kuten on jo käynyt selväksi, suoritettavien tiedostojen valikoima on erittäin suuri. On mahdotonta antaa mitään pivot-taulukko ilmaisee ehdottomasti kaiken tyyppiset laajennukset. Siksi tässä artikkelissa rajoitimme vain yleisimpiin muotoihin.

Suoritettavat tiedostomuodot

Prosessin virtuaalimuisti koostuu useista segmentit tai alueilla muisti. Segmenttien koon, sisällön ja sijainnin muistissa määrää sekä itse ohjelma, esimerkiksi kirjastojen käyttö, koodin ja datan koko sekä tämän ohjelman suoritettavan tiedoston muoto. Useimmissa nykyaikaisissa leikkaussaleissa UNIX-järjestelmät käytetään kahta vakiomuoto suoritettavat tiedostot - COFF (Common Object File Format) ja ELF (Executable and Linking Format).

Suoritettavan tiedostomuotojen kuvaus saattaa tuntua tarpeettomalta, mutta niiden ymmärtäminen on välttämätöntä käyttöjärjestelmän ytimen perustoimintojen kuvaamiseksi. Erityisesti COFF- ja ELF-muotoisiin suoritettaviin tiedostoihin tallennettujen tietojen avulla voit vastata useisiin kysymyksiin, jotka ovat erittäin tärkeitä sovelluksen ja koko järjestelmän toiminnan kannalta:

Mitä ohjelman osia pitää ladata muistiin?

Miten alustamattomien tietojen alue luodaan?

Mitkä prosessin osat tulee tallentaa levynvaihtoalueelle (erikoisalue levytila, joka on tarkoitettu prosessin osoiteavaruuden fragmenttien tilapäiseen tallentamiseen), esimerkiksi sivuja korvattaessa, ja mitkä niistä voidaan tarvittaessa lukea tiedostosta, joten ne eivät vaadi tallennusta?

Missä ohjelmaohjeet ja tiedot sijaitsevat muistissa?

Mitä kirjastoja tarvitaan ohjelman suorittamiseen?

Miten levyllä oleva suoritettava tiedosto, muistissa oleva ohjelmatiedosto ja levynvaihtoalue liittyvät toisiinsa?

Kuvassa 2.3 annetaan perusrakenne muisti prosesseille, jotka ladataan suoritettavista tiedostoista COFF- ja ELF-muodoissa. Vaikka segmenttien asettelu eroaa näiden kahden muodon välillä, peruskomponentit ovat samat. Molemmissa prosesseissa on koodi (teksti), data ja pinosegmentit. Kuten kuvasta näkyy, datasegmenttien ja pinon koko voi muuttua, ja tämän muutoksen suunnan määrää suoritettavan tiedoston muoto. Käyttöjärjestelmä muuttaa pinon kokoa automaattisesti, kun taas tietosegmentin kokoa hallitsee itse sovellus. Käsittelemme näitä kysymyksiä yksityiskohtaisesti myöhemmin tässä luvussa "Muistin varaaminen" -osiossa.

Riisi. 2.3. Suoritettavat ohjelmakuvat COFF- ja ELF-muodoissa

Datasegmentti sisältää alustettua dataa, joka kopioidaan muistiin suoritettavan tiedoston vastaavista osioista, ja alustamattomia tietoja, jotka täytetään nolilla ennen prosessin suorittamisen aloittamista. Alustamatonta dataa kutsutaan usein BSS-segmentiksi.

Kirjasta Photoshop CS2 ja digitaalinen valokuvaus (Tutorial). Luvut 1-9 kirjailija Solonitsyn Juri

Linux for the User -kirjasta kirjoittaja Kostromin Viktor Aleksejevitš

11.4.2. Fonttitiedostomuodot Viime aikoina kirjaimellisesti jokainen grafiikkaeditori tai julkaisuohjelma on käyttänyt omaa fonttitiedostomuotoaan, ja yleensä jotkut ohjelmat eivät tue muiden formaatteja. Ajan myötä käytettyjen muotojen määrä

Kirjasta Adobe Photoshop CS3 kirjoittaja Zavgorodniy Vladimir

Luku 4 Graafiset tiedostomuodot tallennusta varten rasterigrafiikka olemassa suuri määrä erilaisia ​​tiedostomuotoja. Heidän joukossaan on molempia universaaleja muotoja, joita ei ole sidottu mihinkään tiettyyn ohjelmaan, ja tiettyihin "henkilökohtaisiin" rasterimuotoihin

Kirjasta Adobe InDesign CS3 kirjoittaja Zavgorodniy Vladimir

Graafiset tiedostomuodot Adobe InDesign voi tuoda eri muotoisia graafisia tiedostoja - sekä yleisimmät AI, BMP, EPS, GIF, JPEG, PDF, PSD, TIFF että harvinaisemmat DCS, EMF, PCX, PICT, PNG, SCT (ScitexCT) ), WMF.All graafisia formaatteja ja tiedostot erotetaan niiden tietojen tyypin mukaan

Dr. Bobin kirjasta Internet Solutions Kirjailija: Swart Bob

1. Internet-tiedostojen koodausmuodot Internet-tiedostomuodot voidaan jakaa useisiin ryhmiin. Ensinnäkin tiedostonsiirtoformaatit FTP:n kautta, joille uudenncode/decode-malli kehitettiin kauan sitten, ja se korvattiin myöhemmin xxencode/decodella. Myöhemmin hylättiin Base64 ja MIME,

kirjoittaja Raymond Eric Stephen

3.1.6. Binaaritiedostomuodot Jos käyttöjärjestelmä käyttää binäärimuotoja arkaluontoisille tiedoille (kuten käyttäjätileille), on todennäköistä, että sovelluksissa ei todennäköisesti ole käytössä luettavia tekstimuotoja. Yksityiskohdissa

Kirjasta Photoshop CS3: Training Course kirjoittaja Timofejev Sergei Mihailovitš

Graafiset tiedostomuodot Mikä tahansa graafinen kuva riippumatta siitä, onko se vektori vai rasteri, voidaan tallentaa tietokoneelle vain kirjoittamalla se erillinen tiedosto. Jokaisella tiedostolla on aina tietty muoto

Kirjasta The Art of Programming for Unix kirjoittaja Raymond Eric Stephen

3.1.6. Binääritiedostomuodot Jos käyttöjärjestelmä käyttää binäärimuotoja arkaluontoisille tiedoille (kuten käyttäjätileille), on todennäköistä, että sovelluksissa ei todennäköisesti ole käytössä luettavia tekstimuotoja. Lisätietoja aiheesta

Kirjasta Verkkotyökalut Linux Kirjailija: Smith Roderick W.

Fonttitiedostomuodot Fontteja on kahta tyyppiä: bittikartta- ja ääriviivafontit (ääriviivafontteja kutsutaan usein skaalautuviksi fonteiksi). Näillä kirjasintyypeillä on erilaiset ominaisuudet ja ne käsitellään eri tavoilla. Useimmat kirjasinpalvelimet on suunniteltu toimimaan

Kirjasta HTML 5, CSS 3 ja Web 2.0. Nykyaikaisten web-sivustojen kehittäminen. kirjoittaja Dronov Vladimir

Kirjasta HTML 5, CSS 3 ja Web 2.0. Nykyaikaisten web-sivustojen kehittäminen kirjoittaja Dronov Vladimir

Tiedostomuodot ja koodausmuodot Formaatit multimediatiedostoja Graafisia tiedostomuotoja ei ole vähemmän. Kuten Internet-grafiikka, Web-selaimet eivät tue kaikkia multimediamuotoja, mutta vain muutamia. (Haluaisin kirjoittajan

Kirjasta Computer Sound Processing kirjoittaja Zagumennov Aleksanteri Petrovitš

Ad Lib -näytteen SMP-äänitiedostomuodot Ad Lib Gold -äänikortti käyttää muotoa instrumenttinäytteiden lataamiseen siihen. Tukee 8/16-bittistä ääntä, mono/stereo, 4-bittinen Yamaha ADPCM -pakkaus. Tässä muodossa olevien tiedostojen tunniste on . smp.Amiga SVXTätä tiedostotyyppiä käytetään

Kirjasta Viruksen ja virustorjunnan luominen kirjailija Guliev Igor A.

Liite A EXE-tiedoston otsikkomuodot Tavallisen EXE-tiedoston otsikkomuoto EXE-tiedoston alussa on EXE-tiedoston otsikon muotoiltu osa (taulukko A-1) Seuraavaksi tulee siirtotaulukko, joka koostuu pitkistä osoittimista (offset: segmentti). ) niihin

Photoshop CS4 -kirjasta kirjoittaja Zhvalevsky Andrey Valentinovich

Graafiset tiedostomuodot Muoto on tapa tallentaa kuva tiedostoksi. Graafisia tiedostomuotoja on melko vähän, mutta useimmissa tapauksissa käytetään vain muutamia. Jokaisella heistä on ominaisuudet, joten suosittelemme

Kirjasta Digitaalinen valokuvaus. Temppuja ja tehosteita kirjoittaja Gursky Juri Anatolievitš

Tiedostomuodot Kuvatietojen tallentamiseen on monia tapoja ja siten useita tiedostomuotoja. Huomio! Vältä tietojen häviäminen, kun työskentelet kuvien kanssa, tallenna ne TIFF-muodossa tai muokkausohjelman alkuperäisessä muodossa. JPEGВ

Kirjasta Windows 10. Salaisuudet ja laite kirjoittaja Almametov Vladimir

PE-tiedostorakenne

PE-tiedoston yleinen kuvaus

Monien ohjelmointitehtävien ratkaiseminen edellyttää suoritettavien tiedostojen sisäisen rakenteen tuntemista ja ymmärrystä niiden lataamisesta muistiin.

Kaikissa Windows-käyttöjärjestelmän 32-bittisissä haaroissa objekti- (.OBJ), kirjasto- (.LIB) ja suoritettavat tiedostot (.EXE ja .DLL) on tallennettu yhteen COFF-muotoon (Common Object File Format), jota jotkut käyttävät järjestelmät Unix-perhe ja VMS-käyttöjärjestelmä.

PE (Portable Executable) -muoto on COFF-erikoistuminen suoritettavien moduulien tallentamiseen. Tool Interface Standard Committee (Microsoft, Intel, IBM, Borland, Watcom jne.) standardoi sen vuonna 1993, ja sen jälkeen päivitettiin asteittain (viimeinen päivitys, jonka tiedän, oli helmikuussa 1999, mutta se ei sisällä metatietojen tukea .NET, lisätty vuonna 2000). Nimi Portable Executable johtuu siitä, että tämä muoto ei riipu sen prosessorin arkkitehtuurista, jota varten suoritettava tiedosto on rakennettu.

Nykyään on olemassa kaksi PE-tiedostomuotoa: PE32 ja PE32+. Molemmat rajoittavat ohjelman osoiteavaruuden 4 Gt:iin (0xFFFFFFFF), mutta PE32 käyttää 32-bittisiä osoitteita (Win32-arkkitehtuuri) ja PE32+ käyttää 64-bittisiä osoitteita (Win64-arkkitehtuuri).

Useimmat alla kuvatuista rakenteista ja vakioista sisältyvät tavalliseen Windowsin otsikkotiedostoon WINNT.H.

Mikä tahansa PE-tiedosto koostuu useista otsikoista ja useista (1 - 96) osioista. Otsikoissa on palvelutietoja, jotka kuvaavat suoritettavan tiedoston erilaisia ​​ominaisuuksia ja sen rakennetta. Osat sisältävät tietoja, jotka on varattu prosessin osoiteavaruuteen, kun suoritettava tiedosto ladataan muistiin.

PE-tiedostot ovat suhteellisia lataustiedostoja, ts. voidaan teoriassa sijoittaa osoiteavaruuteen 0x00000000 - 0xFFFFFFFF mistä tahansa osoitteesta, jota kutsutaan perusosoitteeksi. Koska perusosoitetta ei tiedetä etukäteen, PE-tiedostojen rakenne perustuu RVA-konseptiin (relative virtual address). RVA on siirtymä suoritettavan tiedoston perusosoitteesta tiettyyn osoitteeseen. Toisin sanoen, saadaksesi lineaarisen osoitteen prosessin virtuaalimuistissa, sinun on lisättävä RVA perusosoitteeseen.

Erityisesti on korostettava, että RVA:lla ei ole mitään tekemistä tiedoston alkuun verrattuna. Tiedoston latausprosessin aikana jokainen sen osa sijoitetaan muistiin omalla RVA:lla ja tarvittaessa täytetään nollia määritettyyn kokoon. Tässä tapauksessa RVA-osio ja sen koko muistissa ei yleisesti ottaen liity mitenkään sen sijaintiin ja kokoon lähdetiedostossa.

PE-tiedoston yleinen rakenne on esitetty taulukossa 2.1:

Taulukko 2.1 - Tiedoston rakenne

Jokainen näistä rakenteista kuvataan yksityiskohtaisesti alla.

DOS-otsikon ja tynkän yleinen kuvaus

Koska sekä DOS-sovellukset että Windows-sovellukset on laajennus .EXE, kaikki suoritettavat Windows-tiedostoja käytä kaavaa kaksoiskäynnistys. Se koostuu siitä, että tiedosto alkaa DOS-otsikolla, jota seuraa tynkä, ts. Pieni EXE-tiedosto DOS-muodossa. Kun yrität ladata tiedoston DOS:sta, suoritetaan tynkä ja kun lataat tiedoston Windowsin käynnistyslatain jäsentää DOS-otsikon ja poimii siitä offsetin suoritettavan tiedoston todelliseen otsikkoon.

b DOS-otsikkorakennetta kutsutaan nimellä IMAGE_DOS_HEADER. En kuvaile DOS-otsikkoa täysin, koska... Olemme kiinnostuneita vain kahdesta alasta, nimittäin:

b 2-tavuinen (WORD) allekirjoitus, joka sijaitsee offsetissa 0 (e_magic) ja yhtä suuri kuin "MZ" (IMAGE_DOS_SIGNATURE);

b 4-tavuinen (DWORD) siirtymä tiedoston alusta PE-otsikkoon, joka sijaitsee offsetissa 0x3C (e_lfanew).

Kun lataat PE-tiedostoa, sinun on ensin tarkistettava DOS-allekirjoitus, löydettävä sitten PE-otsikon siirtymä ja tarkistettava sen otsikon alussa oleva PE-allekirjoitus. Tämä allekirjoitus koostuu 4 tavusta ja on yhtä suuri kuin "PE" (nimitys IMAGE_NT_SIGNATURE).

Muut tiedostot (Win16 ja OS/2 suoritettavat tiedostot ja Windows 9x VxD -ajurit) käyttävät samaa kaksoiskäynnistysmallia, joten PE-allekirjoituksen oikeellisuuden tarkistaminen on pakollista.

Tyypillisesti DOS-teksti näyttää viestin, kuten "Tämä ohjelma vaatii Microsoft Windowsin", ja poistu. Ohjelmaa rakennettaessa voimme kuitenkin määritellä sisään komentorivi kerätä mikä tahansa DOS EXE -tiedosto tynkäksi. Tämän avulla voit luoda "kaksoisohjelmia", jotka toimivat sekä DOS- että Windowsissa.

DOS-otsikon rakenne

typedef struct _IMAGE_DOS_HEADER ( // DOS.EXE-otsikko

USHORT e_magic; // Maaginen numero

USHORT e_cblp; // Tavujen määrä per viimeinen sivu tiedosto

USHORT e_cp; // Tiedoston sivujen lukumäärä

USHORT e_crlc; // Muutokset

USHORT e_cparhdr; // Otsikon koko kappaleissa

USHORT e_minalloc; // Ylimääräisiä kappaleita tarvitaan vähintään

USHORT e_maxalloc; // Ylimääräisiä kappaleita tarvitaan enintään

USHORT e_ss; // SS-rekisterin alkuperäinen (suhteellinen) arvo

USHORT e_sp; // Alkuarvo rekisteröi SP

USHORT e_csum; // Tarkista summa

USHORT e_ip; // IP-rekisterin alkuarvo

USHORT e_cs; // CS-rekisterin alkuperäinen (suhteellinen) arvo

USHORT e_lfarlc; // Tiedoston osoite edelleenlähetystaulukkoon

USHORT e_ovno; // Peittokuvien määrä

USHORT e_res; // Varattu

USHORT e_oemid; // OEM-tunniste (e_oeminfo)

USHORT e_oeminfo; // OEM-tiedot; e_oemid-kohtainen

USHORT e_res2 ; // Varattu

PITKÄ e_lfanew; // Osoite uudessa .exe-otsikkotiedostossa

) IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;

Tärkein kenttä tässä on e_lfanew, joka sisältää 4-tavun siirtymän tiedoston alusta PE-otsikkoon. Ensimmäinen e_magic-rakenteen kenttä sisältää suoritettavan tiedoston allekirjoituksen. Kaikilla MS-DOS-yhteensopivilla suoritettavilla tiedostoilla on allekirjoitus 0x54AD, joka esitetään ASCII-merkeissä kahdella MZ-merkillä. Tästä syystä DOS-otsikkoa kutsutaan usein MZ-otsikoksi.

PE-otsikon rakenne

PE-otsikko (IMAGE_NT_HEADERS) koostuu kolmesta osasta (katso taulukko 2.2):

Taulukko 2.2 - Otsikkorakenne

struct IMAGE_NT_HEADERS (

DWORD-allekirjoitus;

IMAGE_FILE_HEADER Tiedoston otsikko;

IMAGE_OPTIONAL_HEADER Valinnainen otsikko;

PE-otsikko alkaa aina 4-tavuisella "PE"-allekirjoituksella (IMAGE_NT_SIGNATURE). Sitä seuraa kaksi otsikkoa: tiedoston otsikko (IMAGE_FILE_HEADER) ja valinnainen otsikko (IMAGE_OPTIONAL_HEADER). Nimestään huolimatta IMAGE_OPTIONAL_HEADER on aina PE-tiedostossa (se on valinnainen näkökulmasta yleinen muoto COFF, koska sitä ei käytetä objekti- ja kirjastotiedostoissa).

Tiedoston otsikko

Tiedoston otsikko koostuu 0x14 tavusta (määritelmä IMAGE_SIZEOF_FILE_HEADER), sijoitetaan välittömästi allekirjoituksen jälkeen ja sisältää yleisen kuvauksen tiedostosta. Se koostuu seuraavista kentistä:

Taulukko 2.3 - Tiedoston otsikkorakenne

Kuvaus kenttien tarkoituksesta.

Konekenttä

16-bittinen numero, joka määrittää prosessorin arkkitehtuurin, jossa ohjelma voi toimia.

TimeDateStamp-kenttä

32-bittinen luku, joka sisältää luomispäivämäärän ja -ajan tästä tiedostosta. Tämän kentän muoto on dokumentoimaton, mutta Microsoftin kerääjät syöttävät ajan tähän sekuntimääränä 01.1.1970 keskiyöstä UTC:ssä (eli käyttävät C-kielen aikafunktion palauttamaa Unix-aikamuotoa). Tämä muuten tarkoittaa, että PE-muodon nykyinen tila on voimassa vain 18.1.2038 asti.

Koska tämän kentän muoto on dokumentoimaton, jotkut kolmannen osapuolen kerääjät tallentavat sen arvon muihin muotoihin. Tämä voi olla tärkeää, koska... Tätä kenttää käytetään linkitettäessä dynaamisesti tuontia DLL-tiedostoista.

PointerToSymbolTable- ja NumberOfSymbols-kentät

COFF-standardin mukaan näiden 4-tavuisten kenttien on tarjottava pääsy tiedoston virheenkorjaustietoihin. Kaikki tuntemani kerääjät sisältävät kuitenkin nollia, ja virheenkorjaustietojen saamiseksi käytetään eri menetelmää (katso virheenkorjaustietohakemisto).

SizeOfOptionalHeader-kenttä

16-bittinen luku, joka määrittää valinnaisen otsikon koon. Se on 0xE0 PE32-tiedostoille (IMAGE_SIZEOF_NT_OPTIONAL32_HEADER) ja 0xF0 PE32+-tiedostoille (IMAGE_SIZEOF_NT_OPTIONAL64_HEADER).

Ala Ominaisuudet

16-bittinen lippukenttä, joka sisältää tiedoston COFF-attribuutit.

Valinnainen otsikko

Valinnaisessa otsikossa on kaksi erilaisia ​​formaatteja: PE32:lle ja PE32+:lle. Vastaavia rakenteita kutsutaan nimellä IMAGE_OPTIONAL_HEADER32 ja IMAGE_OPTIONAL_HEADER64. Niiden kentät on yhteenveto taulukossa 2.4:

Taulukko 2.4 - Valinnainen otsikkorakenne

Offset (heksa, PE32/PE32+)

Koko (PE32/PE32+)

Tyyppi (PE32/PE32+)

Nimi

Kuvaus

Otsikon allekirjoitus.

MajorLinkerVersion

Kokoonpanijaversionumeron merkittävin numero. Ei käynnistyslataimen käyttämä.

MinorLinkerVersion

Kokoonpanijaversionumeron pieni numero. Ei käynnistyslataimen käyttämä.

Kaikkien ohjelmakoodia sisältävien osien kokojen summa.

SizeOfInitializedData

Kaikkien alustettuja tietoja sisältävien osien kokojen summa.

SizeOfUninitializedData

Kaikkien alustamattomia tietoja sisältävien osien kokojen summa.

AddressOfEntryPoint

Ohjelman aloituspisteen RVA. Ohjaimelle tämä on DriverEntry-osoite, DLL:lle tämä on DllMain-osoite tai nolla.

RVA on ohjelmakoodin alku.

Ohjelmatietojen alun RVA. Epäluotettava kenttä, jota lataaja ei käytä. Ei saatavilla PE32+:ssa!

Ohjelman ensisijainen perusosoite muistissa, 64 kt:n kerrannainen. Oletusarvo on 0x00400000 EXE-tiedostoille Windows 9x/NT:ssä, 0x00010000 EXE-tiedostoille Windows CE:ssä ja 0x10000000 DLL-tiedostoille. Lataamalla ohjelman tästä osoitteesta voit tehdä ilman osoitteiden määrittämistä.

Osion Tasaus

Osion tavutasaus, kun ne ladataan muistiin, on suurempi tai yhtä suuri kuin FileAlignment. Oletusarvo on tämän prosessorin virtuaalimuistin sivukoko.

Tiedoston osien tasaus tavuina. Tehon on oltava 2 välillä 512–64 kt mukaan lukien. Oletusarvo on 512. Jos SectionAlignment pienempi koko virtuaalimuistisivu, FileAlignmentin on vastattava sitä.

MajorOperatingSystemVersion

Käyttöjärjestelmän versionumeron merkittävin numero. Ei käynnistyslataimen käyttämä.

MinorOperatingSystemVersion

Käyttöjärjestelmän versionumeron pieni numero. Ei käynnistyslataimen käyttämä.

MajorImageVersion

Tämän tiedoston versionumeron merkittävin numero. Ei käynnistyslataimen käyttämä.

MinorImageVersion

Tämän tiedoston versionumeron pieni numero. Ei käynnistyslataimen käyttämä.

MajorSubsystemVersion

Osajärjestelmän versionumeron merkittävin numero.

MinorSubsystemVersion

Alajärjestelmän versionumeron alhainen numero.

Win32VersionValue

Varattu, aina yhtä suuri kuin 0.

Muistissa olevan tiedoston koko, mukaan lukien kaikki otsikot. On oltava SectionAlignmentin kerrannainen.

DOS-otsikon ja -osan, PE-otsikon ja osion otsikoiden kokonaiskoko kohdistettuna FileAlignment-rajaan. Määrittää siirtymän tiedoston alusta ensimmäisen osan tietoihin.

Tiedoston tarkistussumma.

Tämän tiedoston Windowsin suoritusalijärjestelmä.

Dll Ominaisuudet

Muita tiedostomääritteitä.

SizeOfStackReserve

Ohjelman aloitussäikeen pinon koko virtuaalimuistin tavuina. Ladattaessa sisään fyysinen muisti Vain SizeOfStackCommit-tavut näytetään, sitten näytetään yksi sivu virtuaalimuistista. Oletusarvo on 1 MB.

SizeOfStackCommit

Ohjelmapinon alkuperäinen koko tavuina. Oletusarvo on 4 kt.

SizeOfHeapReserve

Ohjelmakeon koko tavuina. Kun lataat fyysiseen muistiin, vain SizeOfHeapCommit-tavu näytetään myöhemmin, yksi sivu virtuaalimuistista. Oletusarvo on 1 MB. Kaikissa 32-bittisissä Windowsin versioissa kasaa rajoittaa vain näennäismuistin koko, ja tämä kenttä näyttää jätettävän huomiotta.

SizeOfHeapCommit

Ohjelmakeon alkuperäinen koko tavuina. Oletusarvo on 4 kt.

Vanhentunut kenttä, ei käytetty.

NumberOfRvaAndSizes

Tietohakemiston kuvaajien määrä. Tällä hetkellä se on aina 16.

IMAGE_DATA_DIRECTORY

Tietohakemiston kuvaukset.

16-bittinen kenttä, joka sisältää otsikon allekirjoituksen. Voi ottaa arvoja (katso taulukko 2.4):

Taulukko 2.4 - Kelvolliset arvot Maagiset kentät

MajorSubsystemVersion- ja MinorSubsystemVersion-kentät

16-bittiset numerot osoittavat odotetun Windowsin version. Toisin kuin kaikki muut versionumerokentät, tämä kenttä analysoitiin, kun ohjelmia ladattiin NT 4.0:aan ja 95:een. Jos ohjelma oli graafinen sovellus eikä tämä kenttä sisältänyt versiota 4.0, ohjelman katsottiin olevan kehitetty NT 3.51:lle ja tämän käyttöjärjestelmän käyttäytymistä simuloitiin (erityisesti kolmiulotteisten dialogityylien puute jne.). Tällä hetkellä ei käytössä ja lähes aina yhtä suuri kuin 4.0.

Tarkistussumma-kenttä

32-bittinen tiedoston tarkistussumma. Tarkistettu vain Windows NT:ssä, kun ladataan ytimen ohjaimia ja useita järjestelmän DLL:t. Laskenta-algoritmi tarkistussumma on dokumentoimaton, mutta voit laskea sen käyttämällä IMAGEHLP.DLL-kirjaston CheckSumMappedFile-järjestelmäfunktiota.

Alajärjestelmä-kenttä

16-bittinen numero, joka ilmaisee, missä Windows API-alijärjestelmässä tiedosto tulee suorittaa. Sen mahdolliset arvot on esitetty taulukossa 2.5:

Taulukko 2.5 - Alijärjestelmä-kentän kelvolliset arvot

Nimi

Merkitys

Alajärjestelmä

IMAGE_SUBSYSTEM_UNKNOWN

Tuntematon osajärjestelmä.

IMAGE_SUBSYSTEM_NATIVE

Ei vaadi alijärjestelmää, ohjaimien ja alkuperäisten NT-sovellusten käyttämä.

IMAGE_SUBSYSTEM_WINDOWS_GUI

Windowsin grafiikkaalijärjestelmä.

IMAGE_SUBSYSTEM_WINDOWS_CUI

Windows-konsolin alijärjestelmä.

IMAGE_SUBSYSTEM_OS2_CUI

OS/2-konsolialijärjestelmä.

IMAGE_SUBSYSTEM_POSIX_CUI

POSIX-konsolialijärjestelmä.

IMAGE_SUBSYSTEM_NATIVE_WINDOWS

"alkuperäinen" Windows-ohjain 9x.

IMAGE_SUBSYSTEM_WINDOWS_CE_GUI

Windows CE -grafiikkaalijärjestelmä.

IMAGE_SUBSYSTEM_EFI_APPLICATION

EFI ohjelma.

IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER

EFI-ohjain, joka tarjoaa käynnistyspalvelun.

IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER

Runtime EFI-ohjain.

IMAGE_SUBSYSTEM_EFI_ROM

Firmware ROM EFI:lle.

IMAGE_SUBSYSTEM_XBOX

Xbox-alijärjestelmä.

DLLCharacteristics kenttä

16-bittinen lippukentän määrittely lisäattribuutteja tiedosto. Mahdolliset lippujen arvot on esitetty taulukossa 2.6.

Taulukko 2.6 - DLLCharacteristics-kentän lippujen mahdolliset arvot

NumberOfRvaAndSizes- ja DataDirectory-kentät

Valinnaisen otsikon lopussa on 32-bittinen numero, joka tallentaa tietohakemiston kahvojen lukumäärän. Tätä seuraa joukko itse kuvauksia, joista jokainen näyttää tältä:

struct IMAGE_DATA_DIRECTORY (

DWORD VirtualAddress;

Tällä hetkellä NumberOfRvaAndSizes-kenttä sisältää aina luvun 16 (symbolinen nimi IMAGE_NUMBEROF_DIRECTORY_ENTRIES). Vastaavasti DataDirectory-taulukko koostuu myös 16 kuvaajasta. Jokainen kuvaaja sisältää yhden tietohakemiston RVA:n ja koon. Jos hakemistoa ei ole tiedostossa, sen kuvaajan molemmat kentät ovat nolla.

Jokainen tietohakemisto sisältää tiettyjä palvelutietoja. Näiden tietojen tyyppi määräytyy kuvaustaulukon hakemistonumeron mukaan. Koska tietohakemistot sijaitsevat tyypillisesti osioiden sisällä, niiden sisältöön pääsemiseksi meidän on ensin tutkittava osiorakenne.

Osion otsikot

Välittömästi PE-otsikon jälkeen tiedostossa on joukko osiootsikoita. Sen koko määritetään tiedoston otsikon NumberOfSections-kentässä. Jokainen osion otsikko koostuu 0x28 tavusta ja sillä on seuraava rakenne (katso taulukko 2.7):

Taulukko 2.7 - Osion otsikkorakenne

Offset (heksa)

Nimi

Kuvaus

Osion nimi.

Muut VirtualSize

Muistiosan koko. Jos tämä arvo on suurempi kuin SizeOfRawData, osio täytetään muistiin nollalla tavulla.

RVA-osat muistissa.

Osion koko tiedostossa. Aina FileAlignmentin kerrannainen valinnaisesta otsikosta. Jos osio sisältää vain alustamattomia tietoja, tämä kenttä on nolla.

PointerToRawData

Tiedoston siirtymä näiden osien alkuun. Aina FileAlignmentin kerrannainen valinnaisesta otsikosta. Jos osio sisältää vain alustamattomia tietoja, tämä kenttä on nolla.

PointerToRelocations

PointerToLinenumbers

Suoritettavassa tiedostossa tämä kenttä on aina nolla.

Muuttojen lukumäärä

Suoritettavassa tiedostossa tämä kenttä on aina nolla.

NumberOfLinenumbers

Suoritettavassa tiedostossa tämä kenttä on aina nolla.

Ominaisuudet

Osion attribuutit.

Osion nimi

Osion nimi sisältää 0–8 ASCII-merkkiä. Vakion 8 sijasta voit käyttää määritelmää IMAGE_SIZEOF_SHORT_NAME. Jos nimi on alle 8 merkkiä pitkä, se täytetään nollalla tavulla. Jos se koostuu täsmälleen kahdeksasta merkistä, siinä ei ole päättävää nollatavua. On tärkeää huomata, että osion nimi ei yleisesti ottaen korreloi millään tavalla sen sisällön kanssa. Jokaisella kääntäjällä on oma osion nimeämiskäytäntönsä, joten et voi luottaa osion nimeen sitä jäsennettäessä. Ainoa luotettava tapa määrittää, mitä tietty osio sisältää, on tutkia sen attribuutteja ja sen sisältämiä tietoluetteloita.

Osion attribuutit

32-bittinen Ominaisuudet-kenttä sisältää joukon lippuja, jotka kuvaavat tämän osan sisältöä. Suoritettavan tiedoston osilla voi olla seuraavat attribuutit (katso Taulukko 2.8):

Taulukko 2.8 - Osion attribuutit

Nimi

Merkitys

Kuvaus

IMAGE_SCN_CNT_CODE

Osio sisältää suoritettavan koodin.

IMAGE_SCN_CNT_INITIALIZED_DATA

Osa sisältää alustettuja tietoja.

IMAGE_SCN_CNT_UNINITIALIZED_DATA

Osa sisältää alustamattomia tietoja.

IMAGE_SCN_MEM_DISCRARDABLE

Osio voidaan poistaa muistista prosessin luomisen jälkeen.

IMAGE_SCN_MEM_NOT_CACHED

Osaa ei voi tallentaa välimuistiin.

IMAGE_SCN_MEM_NOT_PAGED

Osaa ei voi vaihtaa swap-tiedostoon.

IMAGE_SCN_MEM_SHARED

Kaikilla tietyn tiedoston kopioilla voi olla yksi yhteinen esiintymä tästä osiosta. Ilmeisesti käytetään vain dynaamisissa kirjaston tietoosioissa.

IMAGE_SCN_MEM_EXECUTE

Osio voidaan suorittaa ohjelmakoodina.

IMAGE_SCN_MEM_READ

IMAGE_SCN_MEM_WRITE

Voit kirjoittaa osioon.

Itse osiot sijaitsevat tiedostossa kaikkien osioiden otsikoiden jälkeen. Jokainen osa on tasattu valinnaisen otsikon FileAlignment-rajaan.

Osioiden sisältöä analysoitaessa tulee ottaa huomioon, että tämä sisältö voi olla heterogeenista. Esimerkiksi yksi osa voi sisältää sekä suoritettavan koodin että tuontitaulukon.

Typedef struct _IMAGE_FILE_HEADER ( WORD Machine; WORD Osioiden lukumäärä; DWORD Aikapäiväleima; DWORD PointerTo SymbolTable; DWORD NumberOf Symbols; WORD SizeOf OptionalHeader; WORD Ominaisuudet; ) IMAGE_FILE_HEADER,LELEFI
Kuvailen näitä kenttiä vain kuivana, koska... nimet ovat intuitiivisia ja edustavat suoria merkityksiä, eivät VA, RVA, RAW ja muita pelottavia, kiehtovia asioita, joista olemme toistaiseksi kuulleet vain vanhoilta merirosvoilta. Vaikka olemme jo kohdanneet RAW:n - nämä ovat vain siirtymiä suhteessa tiedoston alkuun (niitä kutsutaan myös raakaosoittimiksi tai tiedostosiirtymäksi). Eli jos meillä on RAW-osoite, tämä tarkoittaa, että meidän on siirryttävä tiedoston alusta RAW-paikkoihin ( ptrFile+ RAW). Sitten voit aloittaa arvojen lukemisen. Hämmästyttävä esimerkki tästä tyypistä on e_lfnew- josta keskustelimme edellä Dos-otsikossa.

*Kone: WORD - tämä numero (2 tavua) määrittää prosessorin arkkitehtuurin, jossa Tämä hakemus voidaan esittää.
Osioiden lukumäärä: DWORD - osien määrä tiedostossa. Osat (jäljempänä kutsumme niitä osioiden taulukoksi) seuraavat välittömästi otsikon jälkeen (PE-Header). Dokumentaation mukaan osioiden määrä on rajoitettu 96:een.
TimeDateStamp: WORD - numero, joka tallentaa tiedoston luontipäivämäärän ja -ajan.
PointerToSymbolTable: DWORD on symbolitaulukon siirtymä (RAW), ja SizeOfOptionalHeader on tämän taulukon koko. Tämä taulukko on tarkoitettu virheenkorjaustietojen tallentamiseen, mutta osasto ei huomannut sotilaan menetystä heti palvelussuhteen alkaessa. Useimmiten tämä kenttä tyhjennetään nollilla.
SIzeOfOptionHeader: WORD - valinnaisen otsikon koko (joka seuraa välittömästi nykyistä otsikkoa) Dokumentaatiossa kerrotaan, että objektitiedostolle se on asetettu 0...
*Ominaisuudet: WORD - tiedoston ominaisuudet.

* - kentät, jotka määritetään arvoalueella. Taulukot mahdollisia arvoja esitetty toimiston rakennekuvauksessa. verkkosivuilla, eikä niitä näytetä tässä, koska Niissä ei ole mitään erityisen tärkeää muodon ymmärtämisen kannalta.

Jätetään tämä saari! Meidän on edettävä. Viitepisteenä on maa nimeltä Optional-Header.

"Missä kartta on, Billy? Tarvitsen kartan."
(Aarre saari)

Valinnainen-otsikko (IMAGE_OPTIONAL_HEADER)

Tämän maanosan nimi ei ole kovin hyvä. Tämä otsikko on pakollinen, ja siinä on kaksi muotoa PE32 ja PE32+ (IMAGE_OPTIONAL_HEADER32 ja IMAGE_OPTIONAL_HEADER64). Muoto tallennetaan kenttään Taika: WORD. Otsikko sisältää tiedoston lataamiseen tarvittavat tiedot. Kuten aina :

IMAGE_OPTIONAL_HEADER

typedef struct _IMAGE_OPTIONAL_HEADER ( WORD Magic; BYTE MajorLinkerVersion; BYTE MinorLinkerVersion; DWORD SizeOfCode; DWORD SizeOfInitializedData; DWORD SizeOfUninitializedData; DWORD AddressOfCordDaf; DWORD AddressOfCodeffa; DWORDDaf; Base ; DWORD SectionAlignment; DWORD-kokoOfRvaAndSizes , *PIMAGE_OPTIONAL_HEADER;


*Kuten aina, tutkimme vain tärkeimmät kentät, joilla on suurin vaikutus latauksen ymmärtämiseen ja tiedoston käsittelyyn. Sovitaan - tämän rakenteen kentät sisältävät arvoja VA (Virtual address) ja RVA (Suhteellinen virtuaaliosoite) -osoitteilla. Nämä eivät ole RAW-osoitteita, ja sinun on voitava lukea (tai pikemminkin laskea) ne. Opimme varmasti kuinka tämä tehdään, mutta ensin analysoimme toisiaan seuraavat rakenteet, jotta se ei mene sekaisin. Muista toistaiseksi - nämä ovat osoitteita, joihin laskelmien jälkeen viitataan tietty paikka tiedostossa. Kohtaat myös uuden käsitteen - linjauksen. Käsittelemme sitä yhdessä RVA-osoitteiden kanssa, koska nämä liittyvät aika läheisesti toisiinsa.

AddressOfEntryPoint: DWORD - tulopisteen RVA-osoite. Voi osoittaa mihin tahansa kohtaan osoiteavaruudessa. .exe-tiedostojen aloituspiste vastaa osoitetta, josta ohjelma aloittaa suorittamisen, eikä se voi olla nolla!
BaseOfCode: DWORD - ohjelmakoodin alun RVA (koodiosio).
BaseOfData: DWORD - ohjelmakoodin alun RVA (tietoosat).
ImageBase: DWORD - ensisijainen perusosoite ohjelman lataamiseen. On oltava 64 kt:n kerrannainen. Useimmissa tapauksissa se on 0x00400000.
Osion Tasaus: DWORD - osion tasauskoko (tavuina) latauksen aikana virtuaalinen muisti.
FileAlignment: DWORD - tiedoston sisällä olevan osan tasauskoko (tavuina).
SizeOfImage: DWORD - tiedostokoko (tavuina) muistissa, mukaan lukien kaikki otsikot. On oltava SectionAligmentin kerrannainen.
SizeOfHeaders: DWORD - kaikkien otsikoiden koko (DOS, DOS-Stub, PE, Section) kohdistettuna FileAligmentiin.
NumberOfRvaAndSizes: DWORD - hakemistotaulukon hakemistojen määrä (itse taulukko on alla). Päällä Tämä hetki tämä kenttä on aina yhtä suuri kuin symbolinen vakio IMAGE_NUMBEROF_DIRECTORY_ENTRIES, joka on yhtä suuri kuin 16.
DataDirectory: IMAGE_DATA_DIRECTORY - tietohakemisto. Yksinkertaisesti sanottuna tämä on taulukko (koko 16), jonka jokainen elementti sisältää 2 DWORD-arvon rakenteen.

Katsotaanpa, mikä on IMAGE_DATA_DIRECTORY-rakenne:

Typedef-rakenne _IMAGE_DATA_DIRECTORY (DWORD VirtualAddress; DWORD Size; ) IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
Mitä meillä on? Meillä on 16 elementin joukko, joista jokainen sisältää osoitteen ja koon (mitä? miten? miksi? kaikki minuutissa). Herää kysymys, mitä nämä ominaisuudet tarkalleen ovat. Tätä varten Microsoftilla on erityiset vakiot vastaavuuteen. Ne näkyvät rakennekuvauksen lopussa. Sillä välin:

// Hakemistomerkinnät #define IMAGE_DIRECTORY_ENTRY_EXPORT 0 // Vie hakemisto #define IMAGE_DIRECTORY_ENTRY_IMPORT 1 // Tuo hakemisto #define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 // Resurssihakemisto #define IMAGE_DIRECTORY_ENTRY_DIRECTORY TORY_ENTRY _SECURITY 4 // Suojaushakemisto #define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 / / Perussiirtotaulukko #define IMAGE_DIRECTORY_ENTRY_DEBUG 6 // Virheenkorjaushakemisto // IMAGE_DIRECTORY_ENTRY_COPYRIGHT 7 // (X86:n käyttö) #define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE 7 // Tiettyjen IMAGE_DIRECTORY_ENTRY_ARCHITECTURE_GARITE______Tiedon______________________________________________________COPYRIGHT 8 // GP:n RVA #define IMAGE_D IRECTORY_ENTRY_TLS 9 // TLS-hakemistonumero define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 // Lataa konfigurointihakemisto #define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11 // Sidottu tuontihakemisto otsikoissa #define IMAGE_DIRECTORY_ENTRY_IAT 12 // Tuo osoitteen määrittäminen IMAGE_DIRECTORY_1 aseta Lataa tuontikuvaukset #define IMAGE_DIRECTORY_ENTRY_ COM_DESCRIPTOR 14 // COM Runtime Descriptor
Joo! Näemme, että taulukon jokainen elementti on vastuussa siihen liitetystä taulukosta. Mutta voi ja ah, nämä rannat ovat edelleen meille saavuttamattomissa, koska... emme osaa työskennellä VA- ja RVA-osoitteiden kanssa. Ja oppiaksemme meidän on tutkittava, mitkä osat ovat. He kertovat rakenteestaan ​​ja työstään, minkä jälkeen selviää miksi VA:ta, RVA:ta ja linjauksia tarvitaan. Tässä artikkelissa käsittelemme vain vientiä ja tuontia. Muiden kenttien käyttötarkoitus löytyy toimistolta. asiakirjoissa tai kirjoissa. Joten tässä se on. Varsinaiset kentät:

Virtuaaliosoite: DWORD - RVA taulukolle, jota taulukkoelementti vastaa.
Koko: DWORD - taulukon koko tavuina.

Niin! Päästäksemme sellaisille eksoottisille rannoille, kuten tuonti-, vienti-, resurssitaulukot ja muut, meidän on suoritettava seikkailu osien kanssa. No, mökkipoika, katsotaanpa yleistä karttaa, selvitetään missä olemme nyt ja siirrytään eteenpäin:

Ja olemme suoraan osien laajojen avoimien tilojen edessä. Meidän on ehdottomasti selvitettävä, mitä he piilottelevat, ja lopulta keksittävä toisenlainen osoitus. Haluamme todellisia seikkailuja! Haluamme nopeasti mennä sellaisiin tasavalloihin kuin tuonti- ja vientitaulukot. Vanhat merirosvot sanovat, etteivät kaikki päässeet tavoittamaan heitä, mutta ne, jotka onnistuivat, palasivat kultaa ja naisia, joilla oli pyhää tietoa valtamerestä. Lähdimme liikkeelle ja suuntaamme kohti osan otsikkoa.

"Olet syrjäytynyt, Silver! Pois tynnyriltä!"
(Aarre saari)

Osion otsikko (IMAGE_SECTION_HEADER)


Heti sarjan takana DataDirectory osat seuraavat toisiaan. Osiotaulukko edustaa suvereenia valtiota, joka on jaettu Osioiden lukumäärä kaupungit. Jokaisella kaupungilla on omat kulkunsa, omat oikeutensa ja myös koko 0x28 tavua. Osioiden lukumäärä ilmoitetaan kentässä Osioiden lukumäärä, joka on tallennettu Tiedosto-otsikkoon. Joten katsotaanpa rakennetta:

Typedef struct _IMAGE_SECTION_HEADER ( BYTE Nimi; liitto ( DWORD PhysicalAddress; DWORD VirtualSize; ) Misc; DWORD VirtualAddress; DWORD SizeOfRawData; DWORD PointerToRawData; DWORD PointerToRelocations; DWORD PointerToRelocations; DWORD PointerToRelocations; DWORD-osoitinnumero; WORD-numero; ominaisuudet ) IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
Nimi: BYTE - osion nimi. Tällä hetkellä se on 8 merkkiä pitkä.
VirtualSize: DWORD - osion koko virtuaalimuistissa.
SizeOfRawData: DWORD - osion koko tiedostossa.
Virtuaaliosoite: DWORD - RVA-osion osoite.
SizeOfRawData: DWORD - osion koko tiedostossa. Täytyy olla monikerta FileAlignment.
PointerToRawData: DWORD - RAW-siirtymä osan alkuun. Täytyy olla myös monikerta FileAlignment
Ominaisuudet: DWORD - pääsyn attribuutit osioon ja säännöt sen lataamiseksi virtuaaliseen. muisti. Esimerkiksi attribuutti osan sisällön määrittelemiseksi (alkutiedot, ei-alkutiedot, koodi). Tai käytä määritteitä - lue, kirjoita, suorita. Tämä ei ole heidän koko valikoimansa. Ominaisuudet asetetaan saman WINNT.h:n vakioilla, jotka alkavat numerolla IMAGE_SCN_. Voit tutustua osioiden ominaisuuksiin tarkemmin. Myös Chris Kasperskyn kirjojen attribuutit on kuvattu hyvin - lähdeluettelo on artikkelin lopussa.

Nimen suhteen kannattaa muistaa seuraava - resurssien osiossa tulee aina olla nimi.rsrc. Muutoin resursseja ei ladata. Mitä tulee muihin osioihin, nimi voi olla mikä tahansa. Yleensä siellä on merkityksellisiä nimiä, esim. .data, .src jne... Mutta tapahtuu myös:

Osat ovat alue, joka puretaan virtuaalimuistiin ja kaikki työ tapahtuu suoraan näiden tietojen kanssa. Virtuaalimuistissa olevaa osoitetta, ilman siirtymiä, kutsutaan virtuaaliosoitteeksi, lyhennettynä VA. Ensisijainen osoite sovelluksen lataamista varten, aseta kenttään ImageBase. Tämä on kuin kohta, josta sovellusalue alkaa virtuaalimuistissa. Ja RVA-siirtymät (suhteellinen virtuaaliosoite) mitataan suhteessa tähän pisteeseen. Eli VA = ImageBase+ RVA; ImageBase tiedämme aina ja koska meillä on käytössämme VA tai RVA, voimme ilmaista toista toisen kautta.

Täällä ollaan ilmeisesti tottuneet. Mutta tämä on virtuaalimuisti! Ja olemme fyysisessä tilassa. Virtuaalimuisti on meille nyt kuin matka muihin galakseihin, joita voimme vain kuvitella. Emme siis pääse tällä hetkellä virtuaalimuistiin, mutta voimme selvittää, mitä siellä on, koska se on otettu tiedostostamme.

Tasaus


Kuvatakseen oikein lataamista virtuaalitilaan. muisti, on välttämätöntä ymmärtää sellainen mekanismi kuin kohdistus. Katsotaanpa ensin kaaviota siitä, kuinka osiot sivutetaan muistiin.

Kuten näet, osaa ei ladata muistiin sen koon mukaan. Tässä käytetään kohdistuksia. Tämä on arvo, jonka on oltava muistissa olevan osan koon kerrannainen. Jos katsomme kaaviota, näemme, että osion koko on 0x28 ja osan koko on 0x50. Tämä johtuu kohdistuksen koosta. 0x28 "ei saavuta" arvoa 0x50 ja sen seurauksena osio puretaan ja jäljellä oleva tila koossa 0x50-0x28 nollataan. Ja jos osan koko oli suurempi koko linjaus, mitä sitten? Esimerkiksi osion koko= 0x78, a osio Tasaus= 0x50, ts. pysyi ennallaan. Tässä tapauksessa osio vie muistissa 0xA0 (0xA0 = 0x28 * 0x04) tavua. Eli arvo, joka on monikertainen osio Tasaus ja peittää kokonaan osion koko. On huomattava, että tiedoston osat on tasattu samalla tavalla, vain koon mukaan FileAlignment. Saatuamme tarvittavan pohjan voimme selvittää, kuinka muuntaa RVA: sta RAW: ksi.

"Tämä ei ole tasango, ilmasto täällä on erilainen."
(V.S. Vysotsky)

Pieni aritmeettinen oppitunti


Ennen kuin suoritus voidaan aloittaa, osa ohjelmasta on lähetettävä prosessorin osoiteavaruuteen. Osoitetila on prosessorin fyysisesti osoittaman RAM-muistin määrä. Osoiteavaruudessa olevaa "palaa", josta ohjelma puretaan, kutsutaan käytännössä(virtuaalikuva). Kuvalle on tunnusomaista peruslatausosoite (Image base) ja koko (Image size). Joten VA (Virtual address) on osoite suhteessa virtuaalimuistin alkuun ja RVA (Relative Virtual Address) on suhteessa paikkaan, josta ohjelma purettiin. Kuinka selvittää sovelluksen latausosoite? Tätä tarkoitusta varten valinnaisessa otsikossa on erillinen kenttä nimeltä ImageBase. Tämä oli pieni alkusoitto muistin virkistämiseksi. Katsotaanpa nyt kaavamaista esitystä eri osoitteista:

Joten kuinka voit silti lukea tietoja tiedostosta polttamatta sitä virtuaalimuistiin? Tätä varten sinun on muunnettava osoitteet muotoiksi RAW-muodossa. Sitten voimme astua tiedoston sisään tarvitsemamme alueelle ja lukea tarvittavat tiedot. Koska RVA on virtuaalimuistin osoite, johon tiedot projisoitiin tiedostosta, voimme tehdä käänteisen prosessin. Tätä varten tarvitsemme avaimen yhdeksän x kuusitoista yksinkertaisen aritmeettisen. Tässä on joitain kaavoja:

VA = ImageBase + RVA; RAW = RVA - osaRVA + raakaOsa; // rawSection - siirtymä osioon tiedoston alusta // osion RVA - osion RVA (tämä kenttä on tallennettu osion sisään)
Kuten näet, RAW:n laskemiseksi meidän on määritettävä osa, johon RVA kuuluu. Voit tehdä tämän käymällä läpi kaikki osiot ja tarkistamalla seuraavat ehdot:

RVA >= §VitualAddress && RVA< ALIGN_UP(sectionVirtualSize, sectionAligment) // sectionAligment - выравнивание для секции. Значение можно узнать в Optional-header. // sectionVitualAddress - RVA секции - хранится непосредственно в секции // ALIGN_UP() - функция, определяющая сколько занимает секция в памяти, учитывая выравнивание
Laittamalla kaikki palapelit yhteen, saamme tämän luettelon:

Typedef uint32_t DWORD; typedef uint16_t WORD; typedef uint8_t BYTE; #define ALIGN_DOWN(x, align) (x & ~(align-1)) #define ALIGN_UP(x, align) ((x & (align-1))?ALIGN_DOWN(x,align)+align:x) // IMAGE_SECTION_HEADER osiot; // init-taulukon osat int defSection(DWORD rva) ( for (int i = 0; i< numberOfSection; ++i) { DWORD start = sections[i].VirtualAddress; DWORD end = start + ALIGN_UP(sections[i].VirtualSize, sectionAligment); if(rva >= aloita && rva< end) return i; } return -1; } DWORD rvaToOff(DWORD rva) { int indexSection = defSection(rva); if(indexSection != -1) return rva - sections.VirtualAddress + sections.PointerToRawData; else return 0; }
*En sisällyttänyt koodiin tyyppimääritystä tai taulukon alustusta, vaan toimitin vain toimintoja, jotka auttavat osoitteiden laskemisessa. Kuten näette, koodi ei ollut kovin monimutkainen. Vain vähän hämmentävää. Tämä häviää... jos käytät hieman enemmän aikaa .exe-tiedoston parissa disassemblerin kautta.

HURRAA! Selvitimme sen. Nyt voimme mennä resurssien maihin, tuonti- ja vientikirjastoihin ja yleensä minne vain sydämemme haluaa. Opimme juuri työskentelemään uudenlaisen osoitteen kanssa. Lähdetään tien päälle!

"-Ei paha, ei paha! Silti he saivat tämän päivän annoksensa!”
(Aarre saari)

Vie taulukko


Matriisin ensimmäisessä elementissä DataDirectory RVA on tallennettu vientitaulukkoon, jota edustaa rakenne IMAGE_EXPORT_DIRECTORY. Tämä taulukko on yhteinen dynaamisille kirjastotiedostoille (.dll). Taulukon päätarkoitus on liittää viedyt funktiot niiden RVA:han. Kuvaus esitetään toimistossa. Tekniset tiedot:

Typedef struct _IMAGE_EXPORT_DIRECTORY ( DWORD-ominaisuudet; DWORD-aikaleima; WORD-pääversio; WORD-alaversio; DWORD-nimi; DWORD-kanta; DWORD-toimintojen numero; DWORD-nimi;DWORDNimi;DWORDO-osoite;DWORD-osoite; ) IMAGE_EXPORT_DIRECTORY,*PIMAGE_EXPORT_DIRECTORY;
Tämä rakenne sisältää kolme osoitinta kolmeen eri taulukkoon. Tämä on taulukko nimistä (funktioista) ( AddressOfNames), järjestysluvut ( AddressOfNamesOrdinals), osoitteet ( AddressOfFunctions). Nimi-kenttä tallentaa dynaamisen kirjaston nimen RVA:n. Ordinaal on kuin välittäjä nimitaulukon ja osoitetaulukon välillä, ja se on joukko hakemistoja (indeksin koko on 2 tavua). Selvyyden vuoksi harkitse kaaviota:

Katsotaanpa esimerkkiä. Oletetaan, että names-taulukon i. elementti osoittaa funktion nimen. Sitten tämän funktion osoite voidaan saada käyttämällä osoitetaulukon i:ttä elementtiä. Nuo. olen ordinaalinen.

Huomio! Jos otat esimerkiksi järjestystaulukon 2. elementin, se ei tarkoita 2:ta - se on järjestysluku nimi- ja osoitetaulukoille. Indeksi on arvo, joka on tallennettu järjestyslukutaulukon toiseen elementtiin.

Arvojen määrä nimitaulukoissa ( NumberOfNames) ja järjestysluvut ovat yhtä suuret eivätkä aina täsmää osoitetaulukon elementtien lukumäärän kanssa ( NumberOfFunctions).

"He tulivat hakemaan minua. Kiitos huomiostasi. Nyt heidän täytyy tappaa!"
(Aarre saari)

Tuo taulukko


Tuontitaulukko on olennainen osa kaikkia dynaamisia kirjastoja käyttäviä sovelluksia. Tämä taulukko auttaa korreloimaan kutsuja dynaamisiin kirjastotoimintoihin vastaavien osoitteiden kanssa. Tuonti voi tapahtua kolmessa eri tilassa: vakio, sidottu tuonti ja viivästetty tuonti. Koska Tuonnin aihe on melko monitahoinen ja ansaitsee erillisen artikkelin, kuvailen vain vakiomekanismia, ja loput kuvailen vain "luurankona".

Normaali tuonti- V DataDirectory Tuontitaulukko on tallennettu hakemistoon IMAGE_DIRECTORY_ENTRY_IMPORT(=1). Se on joukko elementtejä, joiden tyyppi on IMAGE_IMPORT_DESCRIPTOR. Tuontitaulukko tallentaa (taulukossa) funktioiden/järjestyslukujen nimet ja mihin lataajan tulee kirjoittaa tämän funktion tehokas osoite. Tämä mekanismi ei ole kovin tehokas, koska Suoraan sanottuna kaikki riippuu siitä, että etsitään koko vientitaulukosta jokaista vaadittua toimintoa varten.

Sidottu tuonti- tällä työkaaviolla kenttiin (vakiotuontitaulukon ensimmäisessä elementissä) TimeDateStamp ja ForwardChain syötetään -1 ja tiedot sidonnasta tallennetaan soluun DataDirectory indeksillä IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT(=11). Tämä on siis eräänlainen lippu lataajalle, että sinun on käytettävä sidottua tuontia. Myös "sidotulla tuontiketjulla" on omat rakenteensa. Toimintaalgoritmi on seuraava: sovelluksen virtuaalimuisti tyhjenee tarvittava kirjasto ja kaikki tarvittavat osoitteet "sidotaan" käännösvaiheessa. Yksi haitoista on, että kun käännät dll-tiedostoa uudelleen, sinun on käännettävä itse sovellus uudelleen, koska toimintojen osoitteet muuttuvat.

Viivästynyt tuonti- klo tätä menetelmää oletetaan, että .dll-tiedosto on liitetty suoritettavaan tiedostoon, mutta sitä ei pureta muistiin välittömästi (kuten kahdessa edellisessä menetelmässä), vaan vasta kun sovellus käyttää ensimmäistä kertaa symbolia (tämä poistaa elementtejä dynaamisista kirjastoista kutsutaan). Toisin sanoen ohjelma suoritetaan muistissa ja heti kun prosessi on saavuttanut funktion kutsumisen dynaamisesta kirjastosta, kutsutaan erityinen käsittelijä, joka lataa dll:n ja jakaa sen funktioiden tehokkaat osoitteet. Viivästetyssä tuonnissa lataaja ottaa yhteyttä DataDirectoryyn (nimikenumero 15).

Kun tuontitapoja on käsitelty hieman, siirrytään suoraan tuontitaulukkoon.

"Tämä on merimies! Hänen vaatteensa olivat merihenkisiä. - Niin? Luulitko löytäväsi piispan täältä?"
(Treasure Island - John Silver)

Tuontikuvaus (IMAGE_IMPORT_DESCRIPTOR)


Jotta voimme selvittää tuontitaulukon koordinaatit, meidän on käytettävä taulukkoa DataDirectory. Nimittäin IMAGE_DIRECTORY_ENTRY_IMPORT-elementtiin (=1). Ja lue taulukon RVA-osoite. Tässä on yleinen kaavio polusta, joka on valittava:

Sitten saamme RVA:lta RAW:n yllä annettujen kaavojen mukaisesti ja sitten "askelemme" tiedoston läpi. Nyt olemme aivan IMAGE_IMPORT_DESCRIPTOR-nimisen rakenteiden joukon edessä. Taulukon loppu on merkitty "nolla"-rakenteella.

Typedef struct _IMAGE_IMPORT_DESCRIPTOR ( liitto ( DWORD-ominaisuudet; DWORD OriginalFirstThunk; ) DUMMYUNIONNAME; DWORD TimeDateStamp; DWORD ForwarderChain; DWORD Name; DWORD FirstThunk; ) IMAGE_IMPORT_MCRIPTORIM,*_PICRIPTORIM,*_PICRIPTORIM;
En löytänyt linkkiä msdn:n rakenteen kuvaukseen, mutta näet sen WINNT.h-tiedostossa. Aloitetaan selvittää se.

OriginalFirstThunk: DWORD - RVA tuontinimitaulukosta (INT).
TimeDateStamp: DWORD - päivämäärä ja aika.
ForwarderChain: DWORD - ensimmäisen edelleenlähetetyn merkin indeksi.
Nimi: DWORD - RVA-merkkijono kirjaston nimellä.
FirstThunk: DWORD - tuontiosoitetaulukon (IAT) RVA.

Kaikki täällä on vähän samanlaista kuin vienti. Myös nimitaulukko (INT) ja siinä myös osoiterätti (IAT). Myös kirjaston nimen RVA. Vain INT ja IAT viittaavat IMAGE_THUNK_DATA-rakenteiden joukkoon. Se esitetään kahdessa muodossa - 64- ja 32-järjestelmille ja eroavat vain kenttien koosta. Katsotaanpa esimerkkinä x86:ta:

Typedef struct _IMAGE_THUNK_DATA32 ( liitto ( DWORD ForwarderString; DWORD-funktio; DWORD Ordinaal; DWORD AddressOfData; ) u1; ) IMAGE_THUNK_DATA32,*PIMAGE_THUNK_DATA32;
Siihen on tärkeää vastata lisätoimia riippuu rakenteen merkittävimmästä osasta. Jos se on asetettu, loput bitit edustavat tuotavan merkin numeroa (tuo numerolla). Muussa tapauksessa (merkittävin bitti tyhjennetään) loput bitit määrittävät tuotavan symbolin RVA:n (tuonti nimellä). Jos meillä on tuonti nimellä, osoitin tallentaa osoitteen seuraavaan rakenteeseen:

Typedef-rakenne _IMAGE_IMPORT_BY_NAME ( WORD Vihje; BYTE:n nimi; ) IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
Tässä Vihje on funktion numero ja Nimi- Nimi.

Mitä varten tämä kaikki on? Kaikki nämä taulukot, rakenteet... Tarkastellaan selvyyden vuoksi upeaa kaaviota

Luento 3. Tiedoston rakenne

Kirjallisuus

o Nykyaikaiset käyttöjärjestelmät, E. Tanenbaum, 2002, Pietari, Pietari, 1040 sivua, (djvu 10,1 MB) lisää>>

o Verkkokäyttöjärjestelmät N. A. Olifer, V. G. Olifer (zip-arkisto 1,1 Mt)

o Verkkokäyttöjärjestelmät N. A. Olifer, V. G. Olifer, 2001, St. Petersburg, Peter, 544 s., (djvu 6,3 MB)lisää>>

Tiedostot

Tietojen säilytysvaatimukset:

o kyky tallentaa suuria tietomääriä

o tiedot on säilytettävä prosessin päättämisen jälkeen

o useilla prosesseilla on oltava samanaikaisesti pääsy tietoon

2.1.1Tiedostojen nimeäminen

Tiedoston nimen pituus riippuu käyttöjärjestelmästä, se voi olla 8 (MS-DOS) - 255 (Windows, LINUX) merkkiä.

Käyttöjärjestelmät voivat erottaa isot ja pienet kirjaimet. Esimerkiksi WINDOWS ja Windows MS-DOS:lle ovat samat, mutta UNIXissa ne ovat eri tiedostoja.

Monissa käyttöjärjestelmissä tiedostonimi koostuu kahdesta pisteellä erotetusta osasta, esimerkiksi windows.exe. Pisteen jälkeistä osaa kutsutaan tiedostopääte. Järjestelmä käyttää sitä tiedostotyypin erottamiseen.

MS-DOSissa laajennus on 3 merkkiä. Sen avulla järjestelmä erottaa tiedostotyypin ja sen, voidaanko se suorittaa vai ei.

UNIXissa tunniste on rajoitettu 255 merkin tiedostonimen kokoon, ja UNIXilla voi olla useita tunnisteita, mutta laajennuksia käytetään enemmän sovellusohjelmia, ei käyttöjärjestelmä. UNIX ei voi määrittää, onko tiedosto suoritettava vai ei sen laajennuksen perusteella.

2.1.2 Tiedoston rakenne

Kolme päätiedostorakennetta:

1. Tavusekvenssi- Käyttöjärjestelmä ei ole kiinnostunut tiedoston sisällöstä, se näkee vain tavuja. Tällaisen järjestelmän tärkein etu on sen joustavuus käytössä. Käytetään Windowsissa ja UNIXissa.

2. Tietueiden järjestys- kiinteän pituiset tietueet (esimerkiksi reikäkortti) luetaan peräkkäin. Ei käytössä nyt.

3. Sisääntulopuu- jokaisessa tietueessa on avain, tietueita luetaan avaimella. Tällaisen järjestelmän tärkein etu on hakunopeus. Käytetään edelleen keskuskoneissa.

Kolme tiedostorakennetyyppiä.

2.1.3 Tiedostotyypit

Päätiedostotyypit:

o Säännöllinen- sisältää käyttäjätietoja. Käytetään Windowsissa ja UNIXissa.

o Luettelot- järjestelmätiedostot, jotka tarjoavat rakennetukea tiedostojärjestelmä. Käytetään Windowsissa ja UNIXissa.

o Merkki- Input-output -mallinnukseen. Käytetty vain UNIXissa.

o Lohko- levyjen mallintamiseen. Käytetty vain UNIXissa.

Tavallisten tiedostojen päätyypit:

o ASCII-tiedostoja- koostuu tekstistä. Jokainen rivi päättyy rivinvaihtoon (Windows), rivinvaihtoon (UNIX) ja molempiin (MS-DOS). Siksi, jos avaat UNIXissa kirjoitetun tekstitiedoston Windowsissa, kaikki rivit sulautuvat yhdeksi suureksi riviksi, mutta MS-DOSissa ne eivät sulaudu ( tämä on melko yleinen tilanne). ASCII-tiedostojen tärkeimmät edut:
- voidaan näyttää näytöllä ja tulostaa tulostimelle ilman muuntamista
- voidaan muokata lähes kaikilla editoreilla

o Binaaritiedostot- muut tiedostot (ei-ASCII). Yleensä niillä on sisäinen rakenne.

Binääritiedostojen päätyypit:

o Suoritettava- ohjelmat, jotka voidaan käsitellä itse käyttöjärjestelmä, vaikka ne on kirjoitettu tavujonoksi.

o Ei suoritettavissa- muuta.

Esimerkkejä suoritettavista ja ei-suoritettavista tiedostoista

"Maaginen numero"- tiedoston tunnistaminen suoritettavaksi.

2.1.4 Tiedostojen käyttö

Pääasialliset tiedostojen käyttötavat:

o Johdonmukainen- tavut luetaan järjestyksessä. Käytettiin kun oli magneettinauhaa.

2.1.5 Tiedoston attribuutit

Tärkeimmät tiedostoattribuutit:

o Suojaus - kuka voi käyttää tiedostoa ja miten (käyttäjät, ryhmät, luku/kirjoitus). Käytetään Windowsissa ja UNIXissa.

o Salasana - tiedoston salasana

o Luoja - kuka loi tiedoston

o Omistaja - tiedoston nykyinen omistaja

o Vain luku -merkki - 0 - luku/kirjoitus, 1 - vain luku. Käytetään Windowsissa.

o "Piilotettu" lippu - 0 - näkyvissä, 1 - näkymätön hakemistotiedostojen luettelossa (oletus). Käytetään Windowsissa.

o Lippu "järjestelmä" - 0 - normaali, 1 - järjestelmä. Käytetään Windowsissa.

o Merkitse "arkisto" - valmis tai ei arkistointia varten (ei pidä sekoittaa pakkaamiseen). Käytetään Windowsissa.

o Merkitse "pakattu" - tiedosto on pakattu (samanlainen kuin zip-arkistot). Käytetään Windowsissa.

o Merkitse "salattu" - salausalgoritmia käytetään. Jos joku yrittää lukea tiedostoa, jolla ei ole siihen lupaa, hän ei voi lukea sitä. Käytetään Windowsissa.

o ASCII/binäärilippu - 0 - ASCII, 1 - binääri

o Random access -lippu - 0 - vain peräkkäinen, 1 - satunnainen pääsy

o Merkitse "väliaikainen" - 0 - normaali, 1 - poistaaksesi tiedoston prosessin lopussa

o Estomerkki - estää pääsyn tiedostoon. Jos hänellä on kiire editoimiseen.

o Luomisaika - luomispäivämäärä ja -aika. UNIX on käytössä.

o Viimeisin käyttöaika - viimeisen käytön päivämäärä ja aika

o Aika viimeinen mahdollisuus- viimeisen muutoksen päivämäärä ja aika. Käytetään Windowsissa ja UNIXissa.

o Nykyinen koko - tiedostokoko. Käytetään Windowsissa ja UNIXissa.

2.1.6 Toiminnot tiedostojen kanssa

Perus järjestelmäpuhelut tiedostojen käsittelyyn:

o Luo - tiedoston luominen ilman tietoja.

o Poista - poista tiedosto.

o Avaa - avaa tiedosto.

o Sulje - tiedoston sulkeminen.

o Read - lukee tiedostosta nykyisestä tiedoston sijainnista.

o Kirjoita - kirjoita tiedostoon nykyiseen tiedoston sijaintiin.

o Liitä - lisääminen tiedoston loppuun.

o Etsi - asettaa tiedostoosoittimen tiettyyn kohtaan tiedostossa.

o Hanki attribuutit - saa tiedostoattribuutit.

o Aseta attribuutit - aseta tiedostomääritteet.

o Nimeä uudelleen - nimeä tiedosto uudelleen.