.\" -*- coding: UTF-8 -*- .\" $File: magic.man,v 1.110 2024/11/27 15:37:00 christos Exp $ .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .Dd 27 noiembrie 2024 .Dt MAGIC 5 .Os .\" install as magic.4 on USG, magic.5 on V7, Berkeley and Linux systems. .Sh NUME .Nm magic .Nd fișier de model magic al comenzii «file» .Sh DESCRIERE Această pagină de manual documentează formatul fișierelor magice utilizat de comanda .Xr file 1 , versiunea 5.46. Comanda .Xr file 1 identifică tipul unui fișier folosind, printre alte teste, un test pentru a verifica dacă fișierul conține anumite .Dq „modele magice” . Baza de date a acestor .Dq „modele magice” se află de obicei într-un fișier binar din .Pa /usr/share/file/misc/magic.mgc sau într-un director de fișiere de fragmente de modele magice din textul sursă din .Pa /usr/share/file/misc/magic . Baza de date specifică ce modele trebuie testate, ce mesaj sau tip MIME trebuie afișat dacă se găsește un anumit model și informații suplimentare care trebuie extrase din fișier. .Pp Formatul fișierelor de fragmente sursă care sunt utilizate pentru crearea acestei baze de date este următorul: Fiecare linie a unui fișier de fragmente specifică un test care urmează să fie efectuat. Un test compară datele care încep la o anumită poziție în fișier cu o valoare de octet, un șir de caractere sau o valoare numerică. Dacă testul reușește, se imprimă un mesaj. Linia este formată din următoarele câmpuri: .Bl -tag -width ".Dv message" .It Dv poziția Un număr care specifică poziția (în octeți) în fișier a datelor care urmează să fie testate. Această poziție poate fi un număr negativ dacă este: .Bl -bullet -compact .It Prima poziție directă a intrării magice (la nivelul de continuare 0), caz în care este interpretată ca o poziție de la sfârșitul fișierului, mergând înapoi. Acest lucru funcționează numai atunci când este disponibil un descriptor de fișier pentru fișier și acesta este un fișier obișnuit. .It O poziție de continuare în raport cu sfârșitul ultimului câmp de nivel superio. .Dv ( \*[Am] ) . .El Dacă poziția începe cu simbolul .Dq + , atunci toate pozițiile sunt interpretate ca fiind de la începutul fișierului (implicit). .It Dv tipul Tipul de date care urmează să fie testate. Valorile posibile sunt: .Bl -tag -width ".Dv lestring16" .It Dv byte O valoare de un octet. .It Dv short O valoare de doi octeți în ordinea nativă de octeți a acestei mașini. .It Dv long O valoare de patru octeți în ordinea nativă de octeți a acestei mașini. .It Dv quad O valoare de opt octeți în ordinea nativă de octeți a acestei mașini. .It Dv float Un număr cu virgulă mobilă IEEE pe 32 de biți, cu precizie simplă, în ordinea nativă a octeților acestei mașini. .It Dv double Un număr cu virgulă mobilă IEEE pe 64 de biți, cu precizie dublă, în ordinea nativă a octeților acestei mașini. .It Dv string Un șir de octeți. Specificarea tipului de șir poate fi urmată opțional de o opțiune /(lățimea) și opțional de un set de fanioane /[bCcftTtWw]*. Lățimea limitează numărul de caractere care urmează să fie copiate. Zero înseamnă toate caracterele. Sunt acceptate următoarele fanioane: .Bl -tag -width B -compact -offset XXXX .It b Forțează testarea fișierelor binare. .It C Utilizează potrivirea insensibilă la majuscule: caracterele în majuscule din magic se potrivesc atât cu caracterele în minuscule, cât și cu cele în majuscule din țintă, în timp ce caracterele în minuscule din magic se potrivesc numai cu caracterele în majuscule din țintă. .It c Utilizați potrivirea insensibilă la minuscule: caracterele cu minuscule din magic se potrivesc atât cu caracterele în minuscule, cât și cu cele în majuscule din țintă, în timp ce caracterele în majuscule din magic se potrivesc numai cu caracterele în majuscule din țintă. Pentru a realiza o potrivire completă insensibilă la majuscule, specificați atât .Dq c , cât și .Dq C . .It f Solicită ca șirul de caractere potrivit să fie un cuvânt complet, nu un cuvânt parțial potrivit. .It T Decupează șirul de caractere, adică spațiile albe anterioare și posterioare .It t Forțează testarea fișierelor text. .It W Spațiu alb compact în țintă, care trebuie să conțină cel puțin un caracter de spațiu alb. Dacă magia are .Dv n spații goale consecutive, ținta trebuie să aibă cel puțin .Dv n spații goale consecutive pentru a se potrivi. .It w Tratează fiecare spațiu liber din magic ca un spațiu liber opțional. Acesta este șters înainte ca șirul să fie imprimat. .El .It Dv pstring Un șir în stil Pascal în care primul octet/short/int este interpretat ca lungimea fără semn. Lungimea implicită este octetul și poate fi specificată ca modificator. Sunt acceptate următoarele modificatoare: .Bl -tag -width B -compact -offset XXXX .It B O lungime de un octet (implicit). .It H O lungime big endian de 2 octeți. .It h O lungime little endian de 2 octeți. .It L O lungime big endian de 4 octeți. .It l O lungime little endian de 4 octeți. .It J Lungimea se include pe sine în calculul său. .El Șirul nu se termină cu NUL. .Dq J este utilizată mai degrabă decât cea mai valoroasă .Dq I deoarece acest tip de lungime este o caracteristică a formatului JPEG. .It Dv date O valoare de patru octeți interpretată ca o dată UNIX. .It Dv qdate O valoare de opt octeți interpretată ca o dată UNIX. .It Dv ldate O valoare de patru octeți interpretată ca o dată în stil UNIX, dar interpretată ca oră locală și nu ca UTC. .It Dv qldate O valoare de opt octeți interpretată ca o dată în stil UNIX, dar interpretată ca oră locală și nu ca UTC. .It Dv qwdate O valoare de opt octeți interpretată ca o dată în stilul Windows. .It Dv msdosdate O valoare de două octeți interpretată ca dată în stilul FAT/DOS. .It Dv msdostime O valoare de două octeți interpretată ca oră în stilul FAT/DOS. .It Dv beid3 O lungime ID3 de 32 de biți în ordinea octeților big-endian. .It Dv beshort O valoare de doi octeți în ordinea octeților big-endian. .It Dv belong O valoare de patru octeți în ordinea octeților big-endian. .It Dv bequad O valoare de opt octeți în ordinea octeților big-endian. .It Dv befloat Un număr cu virgulă mobilă IEEE pe 32 de biți, cu precizie simplă, în ordinea octeților big-endian. .It Dv bedouble Un număr cu virgulă mobilă IEEE pe 64 de biți, cu precizie simplă, în ordinea octeților big-endian. .It Dv bedate O valoare de patru octeți în ordinea octeților big-endian, interpretată ca o dată Unix. .It Dv beqdate O valoare de opt octeți în ordinea octeților big-endian, interpretată ca o dată Unix. .It Dv beldate O valoare de patru octeți în ordinea octeților big-endian, interpretată ca o dată în stil UNIX, dar interpretată ca oră locală în loc cat UTC. .It Dv beqldate O valoare de opt octeți în ordinea octeților big-endian, interpretată ca o dată în stil UNIX, dar interpretată ca oră locală în loc cat UTC. .It Dv beqwdate O valoare de opt octeți în ordinea octeților big-endian, interpretată ca o dată în stilul Windows. .It Dv bemsdosdate O valoare de doi octeți în ordinea octeților big-endian, interpretată ca dată în stilul FAT/DOS. .It Dv bemsdostime O valoare de doi octeți în ordinea octeților big-endian, interpretată ca oră în stilul FAT/DOS. .It Dv bestring16 Un șir Unicode (UCS16) de doi octeți în ordinea octeților big-endian. .It Dv leid3 O lungime ID3 de 32 de biți în ordinea octeților little-endian. .It Dv leshort O valoare de doi octeți în ordinea octeților little-endian. .It Dv lelong O valoare de patru octeți în ordinea octeților little-endian. .It Dv lequad O valoare de opt octeți în ordinea octeților little-endian. .It Dv lefloat Un număr cu virgulă mobilă IEEE pe 32 de biți, cu precizie simplă, în ordinea octeților little-endian. .It Dv ledouble Un număr cu virgulă mobilă IEEE pe 64 de biți, cu precizie dublă, în ordinea octeților little-endian. .It Dv ledate O valoare de patru octeți în ordinea octeților little-endian, interpretată ca o dată UNIX. .It Dv leqdate O valoare de opt octeți în ordinea octeților little-endian, interpretată ca o dată UNIX. .It Dv leldate O valoare de patru octeți în ordinea octeților little-endian, interpretată ca o dată în stil UNIX, dar interpretată ca oră locală în loc de oră UTC. .It Dv leqldate O valoare de opt octeți în ordinea octeților little-endian, interpretată ca o dată în stil UNIX, dar interpretată ca oră locală în loc de oră UTC. .It Dv leqwdate O valoare de opt octeți în ordinea octeților little-endian, interpretată ca o dată în stilul Windows. .It Dv lemsdosdate O valoare de doi octeți în ordinea octeților big-endian, interpretată ca dată în stilul FAT/DOS. .It Dv lemsdostime O valoare de doi octeți în ordinea octeților big-endian, interpretată ca oră în stilul FAT/DOS. .It Dv lestring16 Un șir Unicode (UCS16) de doi octeți în ordinea octeților little-endian. .It Dv melong O valoare de patru octeți în ordinea octeților middle-endian (PDP-11). .It Dv medate O valoare de patru octeți în ordinea octeților middle-endian (PDP-11), interpretată ca o dată UNIX. .It Dv meldate O valoare de patru octeți în ordinea octeților middle-endian (PDP-11), interpretată ca o dată în stil UNIX, dar interpretată ca oră locală în loc de oră UTC. .It Dv indirect Începând de la poziția dată, se consultă din nou baza de date a magiei. Poziția magiei .Dv indirect este implicit absolută în fișier, dar se poate specifica .Dv /r pentru a indica faptul că poziția este relativă de la începutul intrării. .It Dv name Definește o instanță magică .Dq named (numită) care poate fi apelată de la o altă intrare magică .Dv use , ca un apel de subrutină. Pozițiile magice directe ale instanței numite sunt relative la poziția intrării corespondente anterioare, dar pozițiile indirecte sunt relative la începutul fișierului, ca de obicei. Intrările magice numite se potrivesc întotdeauna. .It Dv use Apelează recursiv magia numită începând de la poziția curentă. Dacă numele referinței începe cu .Dv ^ , atunci endianness-ul magiei este schimbat; dacă magia numită .Dv leshort , de exemplu, aceasta este tratată ca .Dv beshort și viceversa. Acest lucru este util pentru a evita dublarea regulilor pentru diferite endianness-uri. .It Dv regex O potrivire a expresiei regulate în sintaxa POSIX extinsă a expresiei regulate (precum egrep). Procesarea expresiilor regulate poate dura un timp exponențial, iar performanța lor este greu de prevăzut, astfel încât utilizarea lor este descurajată. Atunci când sunt utilizate în medii de producție, performanța lor trebuie verificată cu atenție. Dimensiunea șirului de caractere de căutat trebuie, de asemenea, limitată prin specificarea .Dv / , pentru a evita problemele de performanță în scanarea fișierelor lungi. Specificarea tipului poate fi, de asemenea, urmată opțional de .Dv /[c][s][l] . Fanionul .Dq c face ca potrivirea să fie insensibilă la majuscule, în timp ce fanionul .Dq s actualizează pozițial la poziția de început a potrivirii, în loc de cea de la sfârșit. Modificatorul .Dq l , schimbă limita de lungime în număr de linii în loc de un număr de octeți. Liniile sunt delimitate de delimitatorul de linie nativ al platformelor. Atunci când se specifică un număr de linii, se calculează și un număr implicit de octeți, presupunând că fiecare linie are o lungime de 80 de caractere. Dacă nu este specificat nici un număr de octeți, nici un număr de linii, căutarea este limitată automat la 8Kio. .Dv ^ și .Dv $ se potrivesc cu începutul și sfârșitul liniilor individuale, respectiv, nu cu începutul și sfârșitul fișierului. .It Dv search O căutare literală de șir de caractere începând de la poziția dată. Se pot utiliza aceleași fanioane modificatoare ca pentru modelele de șir de caractere. Expresia de căutare trebuie să conțină intervalul sub forma .Dv /de număr care este numărul de poziții la care se va încerca potrivirea, începând de la poziția de pornire. Aceasta este potrivită pentru căutarea în expresii binare mai mari cu poziții variabile, utilizând eludările .Dv \e pentru caracterele speciale. Ordinea modificatorului și a numărului nu este relevantă. .It Dv default Acesta este destinat a fi utilizat cu testul .Em x (care este întotdeauna adevărat) și nu are tip. Se potrivește atunci când niciun alt test la acel nivel de continuare nu s-a potrivit înainte. Ștergerea testelor potrivite pentru un nivel de continuare se poate face folosind testul .Dv clear . .It Dv clear Acest test este întotdeauna adevărat și șterge fanionul de potrivire pentru nivelul de continuare respectiv. Este destinat a fi utilizat împreună cu testul .Dv default . .It Dv der Analizează fișierul ca pe un fișier de certificat DER. Câmpul de testare este utilizat ca un tip DER care trebuie să fie comparat. Tipurile DER sunt: .Dv eoc , .Dv bool , .Dv int , .Dv bit_str , .Dv octet_str , .Dv null , .Dv obj_id , .Dv obj_desc , .Dv ext , .Dv real , .Dv enum , .Dv embed , .Dv utf8_str , .Dv rel_oid , .Dv time , .Dv res2 , .Dv seq , .Dv set , .Dv num_str , .Dv prt_str , .Dv t61_str , .Dv vid_str , .Dv ia5_str , .Dv utc_time , .Dv gen_time , .Dv gr_str , .Dv vis_str , .Dv gen_str , .Dv univ_str , .Dv char_str , .Dv bmp_str , .Dv date , .Dv tod , .Dv datetime , .Dv duration , .Dv oid-iri , .Dv rel-oid-iri . Aceste tipuri pot fi urmate de o dimensiune numerică opțională, care indică lățimea câmpului în octeți. .It Dv guid Un identificator unic global, analizat și imprimat ca XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. Formatul său este un șir de caractere. .It Dv poziția Aceasta este o valoare cvadruplă care indică poziția curentă a fișierului. Aceasta poate fi utilizată pentru a determina dimensiunea fișierului sau a tamponului magic. De exemplu, intrările magice: .Bd -literal -offset indent -0 offset x acest fișier are %lld octeți -0 offset <=100 trebuie să fie mai mare de 100 de octeți \e și este de doar %lld de octeți .Ed .It Dv octal Un șir reprezentând un număr octal. .El .Pp Pentru compatibilitate cu standardul Unix unic (Single .Ux Standard), specificatorii de tip .Dv dC și .Dv d1 sunt echivalenți cu .Dv byte , specificatorii de tip .Dv uC și .Dv u1 sunt echivalenți cu .Dv ubyte , specificatorii de tip .Dv dS și .Dv d2 sunt echivalenți cu .Dv short , specificatorii de tip .Dv uS și .Dv u2 sunt echivalenți cu .Dv ushort , specificatorii de tip .Dv dI , .Dv dL , și .Dv d4 sunt echivalenți cu .Dv long , specificatorii de tip .Dv uI , .Dv uL , și .Dv u4 sunt echivalenți cu .Dv ulong , specificatorul de tip .Dv d8 este echivalent cu .Dv quad , specificatorul de tip .Dv u8 este echivalent cu .Dv uquad , iar specificatorul de tip .Dv s este echivalent cu .Dv string . În plus, specificatorul de tip .Dv dQ este echivalent cu .Dv quad , iar specificatorul de tip .Dv uQ este echivalent cu .Dv uquad . .Pp Fiecare model magic de nivel superior (a se vedea mai jos pentru o explicație a nivelurilor) este clasificat ca text sau binar în funcție de tipurile utilizate. Tipurile .Dq regex și .Dq search sunt clasificate ca teste text, cu excepția cazului în care în model sunt utilizate caractere neimprimabile. Toate celelalte teste sunt clasificate ca binare. Un model de nivel superior este considerat a fi un test text atunci când toate modelele sale sunt modele text; altfel, este considerat a fi un model binar. La potrivirea unui fișier, se încearcă mai întâi modelele binare; dacă nu se găsește nicio potrivire, iar fișierul arată ca un text, se determină codificarea acestuia și se încearcă modelele text. .Pp Tipurile numerice pot fi urmate opțional de .Dv \*[Am] și de o valoare numerică, pentru a specifica faptul că valoarea trebuie să fie evaluată cu operatorul logic AND cu valoarea numerică înainte de efectuarea oricărei comparații. Preadăugarea unui .Dv u la tip indică faptul că comparațiile ordonate trebuie să fie fără semn. .It Dv test Valoarea care urmează să fie comparată cu valoarea din fișier. Dacă tipul este numeric, această valoare este specificată în format C; dacă este un șir de caractere, este specificată ca un șir de caractere C cu eludările obișnuite permise (de exemplu, \en pentru linie nouă). .Pp Valorile numerice pot fi precedate de un caracter care indică operația care urmează să fie efectuată. Acesta poate fi .Dv = , pentru a specifica faptul că valoarea din fișier trebuie să fie egală cu valoarea specificată, .Dv \*[Lt] , pentru a specifica faptul că valoarea din fișier trebuie să fie mai mică decât valoarea specificată, .Dv \*[Gt] , pentru a specifica faptul că valoarea din fișier trebuie să fie mai mare decât valoarea specificată, . Dv \*[Am] , pentru a specifica faptul că valoarea din fișier trebuie să aibă activați toți biții care sunt activați în valoarea specificată, .Dv ^ , pentru a specifica faptul că valoarea din fișier trebuie să fi eliminat oricare dintre biții care sunt activați în valoarea specificată sau .Dv ~ , valoarea specificată după este negată înainte de testare. .Dv x , pentru a specifica că orice valoare se va potrivi. Dacă caracterul este omis, se presupune că este .Dv = . Operatorii .Dv \*[Am] , .Dv ^ și .Dv ~ nu funcționează cu numere cu virgulă flotantă și numere de precizie dublă. Operatorul .Dv !\& specifică faptul că linia se potrivește dacă testul .Em nu reușește. .Pp Valorile numerice sunt specificate în format C; de exemplu, .Dv 13 este zecimal, .Dv 013 este octal, iar .Dv 0x13 este hexazecimal. .Pp Operațiile numerice nu sunt efectuate pe tipuri de date, în schimb valoarea numerică este interpretată ca un decalaj. .Pp Pentru valorile șir de caractere, șirul din fișier trebuie să corespundă șirului specificat. Operatorii .Dv = , .Dv \*[Lt] și .Dv \*[Gt] (dar nu și .Dv \*[Am] ) pot fi aplicați șirurilor de caractere. Lungimea utilizată pentru potrivire este cea a argumentului șirului de caractere din fișierul magic. Aceasta înseamnă că o linie se poate potrivi cu orice șir nevid (utilizat de obicei pentru a imprima apoi șirul), cu .Em \*[Gt]\e0 (deoarece toate șirurile nevid sunt mai mari decât șirul gol). .Pp Datele sunt tratate ca valori numerice în reprezentarea internă respectivă. .Pp Testul special .Em x este întotdeauna evaluat ca fiind „true” (adevărat). .It Dv message Mesajul care urmează să fie afișat dacă comparația reușește. Dacă șirul conține o specificație de format .Xr printf 3 , valoarea din fișier (cu orice mascare specificată) este imprimată folosind mesajul ca șir de format. Dacă șirul de caractere începe cu .Dq \eb , mesajul imprimat este restul șirului de caractere, fără niciun spațiu alb adăugat înainte de acesta: în mod normal, potrivirile multiple sunt separate de un singur spațiu. .El .Pp Creatorul și tipul unui APPLE cu 4+4 caractere APPLE pot fi specificate ca: .Bd -literal -offset indent !:apple CREATYPE .Ed .Pp O listă de extensii de nume de fișiere des întâlnite, separate prin bară oblică, poate fi specificată ca: .Bd -literal -offset indent !:ext ext[/ext...] .Ed .Pp adică șirul literal .Dq !:ext urmat de o listă de extensii des întâlnite; de exemplu pentru imagini JPEG: .Bd -literal -offset indent !:ext jpeg/jpg/jpe/jfif .Ed .Pp Un tip MIME este dat pe o linie separată, care trebuie să fie următoarea linie fără spațiu liber sau comentariu după linia magică care identifică tipul de fișier, și are următorul format: .Bd -literal -offset indent !:mime MIMETYPE .Ed .Pp adică șirul literal .Dq !:mime urmat de tipul MIME. .Pp Un punct forte opțional poate fi furnizat pe o linie separată, care se referă la descrierea magică curentă folosind următorul format: .Bd -literal -offset indent !:strength OPERAND VALOARE .Ed .Pp Operandul .Dv OPERAND poate fi: .Dv + , .Dv - , .Dv * sau .Dv / , iar .Dv VALOARE este o constantă între 0 și 255. Această constantă este aplicată folosind operandul specificat la puterea magică implicită calculată în prezent. .Pp Unele formate de fișiere conțin informații suplimentare care trebuie afișate împreună cu tipul de fișier sau necesită teste suplimentare pentru a determina adevăratul tip de fișier. Aceste teste suplimentare sunt introduse de unul sau mai multe caractere .Em \*[Gt] care preced pozișia. Numărul de .Em \*[Gt] de pe linie indică nivelul testului; o linie fără .Em \*[Gt] la început este considerată a fi la nivelul 0. Testele sunt aranjate într-o ierarhie arborescentă: dacă testul de pe o linie de la nivelul .Em n reușește, toate testele următoare de la nivelul .Em n+1 sunt efectuate, iar mesajele afișate dacă testele reușesc, până când apare o linie cu nivelul .Em n (sau mai puțin). Pentru fișiere mai complexe, se pot utiliza mesaje goale pentru a obține doar efectul „if/then”, în felul următor: .Bd -literal -offset indent 0 string MZ \*[Gt]0x18 uleshort \*[Lt]0x40 MS-DOS executable \*[Gt]0x18 uleshort \*[Gt]0x3f extended PC executable (e.g., MS Windows) .Ed .Pp Decalajele nu trebuie să fie constante, ci pot fi citite și din fișierul examinat. Dacă primul caracter după ultimul .Em \*[Gt] este un .Em \&( atunci șirul de caractere de după paranteză este interpretat ca un decalaj indirect. Aceasta înseamnă că numărul de după paranteză este utilizat ca un decalaj în fișier. Valoarea de la acel decalaj este citită și este utilizată din nou ca decalaj în fișier. Decalajele indirecte sunt de forma: .Em ( x [[.,][bBcCeEfFgGhHiIlmosSqQ]][+\-][ y ]) . Valoarea lui .Em x este utilizată ca decalaj în fișier. Un octet, o lungime id3, un număr scurt sau lung este citit la acel decalaj, în funcție de specificatorul de tip .Em [bBcCeEfFgGhHiIlLmsSqQ] . Valoarea este tratată ca având semn dacă se specifică .Dq \&, sau fără semn dacă se specifică .Dq \&. . Tipurile cu majuscule interpretează numărul ca o valoare big endian, în timp ce versiunile cu litere mici interpretează numărul ca o valoare little endian; tipul .Em m interpretează numărul ca o valoare middle endian (PDP-11). La acest număr se adaugă valoarea .Em y , iar rezultatul este utilizat ca decalaj în fișier. Tipul implicit dacă nu este specificat unul este long. Sunt recunoscute următoarele tipuri: .Bl -column -offset indent Type Half/Short Little Size .It Sy "Tip Sy" "Mnemonic Sy" "Endian Sy" Dim. .It "bcBC Byte/Char N/A 1" .It "efg Double Little 8" .It "EFG Double Big 8" .It "hs Half/Short Little 2" .It "HS Half/Short Big 2" .It "i ID3 Little 4" .It "I ID3 Big 4" .It "l Long Little 4" .It "L Long Big 4" .It "m Middle Middle 4" .It "o Octal Textual Variable" .It "q Quad Little 8" .It "Q Quad Big 8" .El .Pp În acest fel se pot examina structuri de lungime variabilă: .Bd -literal -offset indent # Executabilele MS Windows sunt de asemenea executabile MS-DOS valide 0 string MZ \*[Gt]0x18 uleshort \*[Lt]0x40 MZ executable (MS-DOS) # sare peste întregul bloc de mai jos dacă nu este un executabil extins \*[Gt]0x18 uleshort \*[Gt]0x3f \*[Gt]\*[Gt](0x3c.l) string PE\e0\e0 PE executable (MS-Windows) \*[Gt]\*[Gt](0x3c.l) string LX\e0\e0 LX executable (OS/2) .Ed .Pp Această strategie de examinare are un dezavantaj: trebuie să vă asigurați că în cele din urmă se imprimă ceva, altfel utilizatorii pot obține o ieșire goală (cum ar fi atunci când nu există nici PE\e0\e0, nici LE\e0\e0 în exemplul de mai sus). .Pp Dacă acest decalaj indirect nu poate fi utilizată direct, sunt posibile calcule simple: adăugarea .Em [+-*/%\*[Am]|^]număr între paranteze permite modificarea valorii citite din fișier înainte ca aceasta să fie utilizată ca decalaj: .Bd -literal -offset indent # Executabilele MS Windows sunt de asemenea executabile MS-DOS valide 0 string MZ # uneori, valoarea de la 0x18 este mai mică decât 0x40, dar există încă un # executabil extins, adăugat pur și simplu la fișier \*[Gt]0x18 uleshort \*[Lt]0x40 \*[Gt]\*[Gt](4.s*512) leshort 0x014c COFF executable (MS-DOS, DJGPP) \*[Gt]\*[Gt](4.s*512) leshort !0x014c MZ executable (MS-DOS) .Ed .Pp Uneori nu cunoașteți decalajul exact, deoarece acesta depinde de lungimea sau de poziția (în cazul în care a fost utilizată indirectă anterior) câmpurilor precedente. Puteți specifica un decalaj relativ la sfârșitul ultimului câmp de nivel superior folosind .Sq \*[Am] ca prefix al decalajului: .Bd -literal -offset indent 0 string MZ \*[Gt]0x18 uleshort \*[Gt]0x3f \*[Gt]\*[Gt](0x3c.l) string PE\e0\e0 PE executable (MS-Windows) # imediat după semnătura PE este tipul de CPU \*[Gt]\*[Gt]\*[Gt]\*[Am]0 leshort 0x14c for Intel 80386 \*[Gt]\*[Gt]\*[Gt]\*[Am]0 leshort 0x8664 for x86-64 \*[Gt]\*[Gt]\*[Gt]\*[Am]0 leshort 0x184 for DEC Alpha .Ed .Pp Decalajele indirecte și relative pot fi combinate: .Bd -literal -offset indent 0 string MZ \*[Gt]0x18 uleshort \*[Lt]0x40 \*[Gt]\*[Gt](4.s*512) leshort !0x014c MZ executable (MS-DOS) # dacă nu este COFF, merge înapoi cu 512 octeți și adaugă # decalajul luat de la octetul 2/3, care este un alt mod de a # găsi începutul executabilului extins \*[Gt]\*[Gt]\*[Gt]\*[Am](2.s-514) string LE LE executable (MS Windows VxD driver) .Ed .Pp Sau invers: .Bd -literal -offset indent 0 string MZ \*[Gt]0x18 uleshort \*[Gt]0x3f \*[Gt]\*[Gt](0x3c.l) string LE\e0\e0 LE executable (MS-Windows) # la decalajul 0x80 (-4, deoarece decalajele relative încep de la # sfârșitul potrivirii nivelului superior) în interiorul antetului LE, # găsim decalajul absolut către zona de cod, unde căutăm o semnătură specifică \*[Gt]\*[Gt]\*[Gt](\*[Am]0x7c.l+0x26) string UPX \eb, UPX compressed .Ed .Pp Sau chiar amândouă! .Bd -literal -offset indent 0 string MZ \*[Gt]0x18 uleshort \*[Gt]0x3f \*[Gt]\*[Gt](0x3c.l) string LE\e0\e0 LE executable (MS-Windows) # la decalajul 0x58 în interiorul antetului LE, găsim decalajul relativ # către o zonă de date în care căutăm o semnătură specifică \*[Gt]\*[Gt]\*[Gt]\*[Am](\*[Am]0x54.l-3) string UNACE \eb, ACE self-extracting archive .Ed .Pp Dacă trebuie să aveți de-a face cu perechi decalaj/lungime în fișierul dvs., chiar și a doua valoare dintr-o expresie în paranteze poate fi preluată din fișierul însuși, utilizând un alt set de paranteze. Rețineți că acest decalaj indirect suplimentar este întotdeauna relativ la începutul decalajului indirect principal. .Bd -literal -offset indent 0 string MZ \*[Gt]0x18 uleshort \*[Gt]0x3f \*[Gt]\*[Gt](0x3c.l) string PE\e0\e0 PE executable (MS-Windows) # caută secțiunea PE numită „.idata”... \*[Gt]\*[Gt]\*[Gt]\*[Am]0xf4 search/0x140 .idata # ...și merge la sfârșitul acesteia, calculat de la start+lungime; # acestea sunt situate la 14 și 10 octeți după numele secțiunii \*[Gt]\*[Gt]\*[Gt]\*[Gt](\*[Am]0xe.l+(-4)) string PK\e3\e4 \eb, ZIP self-extracting archive .Ed .Pp Dacă aveți o listă de valori cunoscute la un anumit nivel de continuare și doriți să furnizați un caz implicit de tip comutator: .Bd -literal -offset indent # curăță această continuare a nivelului de potrivire \*[Gt]18 clear x \*[Gt]18 lelong 1 one \*[Gt]18 lelong 2 two \*[Gt]18 default x # imprimă potrivirea implicită \*[Gt]\*[Gt]18 lelong x unmatched 0x%x .Ed .Sh CONSULTAȚI ȘI .Xr file 1 \- comanda care citește acest fișier. .Sh ERORI Formatele .Dv long , .Dv belong , .Dv lelong , .Dv melong , .Dv short , .Dv beshort și .Dv leshort nu depind de lungimea tipurilor de date C .Dv short și .Dv long de pe platformă, chiar dacă specificația unică .Ux implică acest lucru. Cu toate acestea, deoarece OS X Mountain Lion a trecut de suita de validare a specificației unice .Ux și furnizează o versiune a .Xr file 1 în care acestea nu depind de dimensiunile tipurilor de date C și care este construită pentru un mediu pe 64 de biți în care .Dv long are 8 octeți în loc de 4 octeți, probabil că suita de validare nu testează dacă, de exemplu, .Dv long se referă la un element cu aceeași dimensiune ca tipul de date C .Dv long . Probabil că ar trebui să existe nume de tip .Dv .Dv int8 , .Dv uint8 , .Dv int16 , .Dv uint16 , .Dv int32 , .Dv uint32 , .Dv int64 și .Dv uint64 , precum și variante ale acestora cu ordinea octeților specificată, pentru a fi mai clar că aceste tipuri au lățimile specificate. .\" .\" From: guy@sun.uucp (Guy Harris) .\" Newsgroups: net.bugs.usg .\" Subject: /etc/magic's format isn't well documented .\" Message-ID: <2752@sun.uucp> .\" Date: 3 Sep 85 08:19:07 GMT .\" Organization: Sun Microsystems, Inc. .\" Lines: 136 .\" .\" Here's a manual page for the format accepted by the "file" made by adding .\" the changes I posted to the S5R2 version. .\" .\" Modified for Ian Darwin's version of the file command. .\" .\" For emacs editor .\" Local Variables: .\" eval: (add-hook 'before-save-hook 'time-stamp) .\" time-stamp-start: ".Dd " .\" time-stamp-end: "$" .\" time-stamp-format: "%:B %02d, %:Y" .\" time-stamp-time-zone: "UTC0" .\" system-time-locale: "C" .\" eval:(setq compile-command (concat "groff -Tlatin1 -m man " (buffer-file-name)) ) .\" End: .\" .Pp .Sh TRADUCERE Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu . .Pp Această traducere este documentație gratuită; citiți .Lk https://www.gnu.org/licenses/gpl-3.0.html Licența publică generală GNU Versiunea 3 sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE. .Pp Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la .Mt translation-team-ro@lists.sourceforge.net .Me .