| MAGIC(5) | File Formats Manual | MAGIC(5) |
magic —
fișier de model magic al comenzii
«file»
Această pagină de manual documentează formatul fișierelor magice utilizat de comanda file(1), versiunea 5.46. Comanda file(1) identifică tipul unui fișier folosind, printre alte teste, un test pentru a verifica dacă fișierul conține anumite “„modele magice””. Baza de date a acestor “„modele magice”” se află de obicei într-un fișier binar din /usr/share/misc/magic.mgc sau într-un director de fișiere de fragmente de modele magice din textul sursă din /usr/share/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.
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:
poziția&).tipulbyteshortlongquadfloatdoublestringn spații goale consecutive,
ținta trebuie să aibă cel puțin
n spații goale consecutive pentru a
se potrivi.pstringdateqdateldateqldateqwdatemsdosdatemsdostimebeid3beshortbelongbequadbefloatbedoublebedatebeqdatebeldatebeqldatebeqwdatebemsdosdatebemsdostimebestring16leid3leshortlelonglequadlefloatledoubleledateleqdateleldateleqldateleqwdatelemsdosdatelemsdostimelestring16melongmedatemeldateindirectindirect este implicit absolută
în fișier, dar se poate specifica
/r pentru a indica faptul că
poziția este relativă de la începutul
intrării.nameuse, 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.use^, atunci endianness-ul
magiei este schimbat; dacă magia numită
leshort, de exemplu, aceasta este
tratată ca beshort și viceversa.
Acest lucru este util pentru a evita dublarea regulilor pentru
diferite endianness-uri.regex/<length>, pentru a evita problemele de
performanță în scanarea fișierelor lungi.
Specificarea tipului poate fi, de asemenea, urmată
opțional de /[c][s][l]. Fanionul
“c” face ca potrivirea să fie insensibilă
la majuscule, în timp ce fanionul “s”
actualizează pozițial la poziția de
început a potrivirii, în loc de cea de la
sfârșit. Modificatorul “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. ^ și
$ se potrivesc cu începutul și
sfârșitul liniilor individuale, respectiv, nu cu
începutul și sfârșitul
fișierului.search/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 \
pentru caracterele speciale. Ordinea modificatorului și a
numărului nu este relevantă.defaultclear.cleardefault.dereoc, bool,
int, bit_str,
octet_str, null,
obj_id, obj_desc,
ext, real,
enum, embed,
utf8_str, rel_oid,
time, res2,
seq, set,
num_str, prt_str,
t61_str, vid_str,
ia5_str, utc_time,
gen_time, gr_str,
vis_str, gen_str,
univ_str, char_str,
bmp_str, date,
tod, datetime,
duration, oid-iri,
rel-oid-iri. Aceste tipuri pot fi urmate de o
dimensiune numerică opțională, care indică
lățimea câmpului în octeți.guidpoziția-0 offset x acest fișier are %lld octeți
-0 offset <=100 trebuie să fie mai mare de 100 de octeți \
și este de doar %lld de octeți
octalPentru compatibilitate cu standardul Unix unic (Single
UNIX Standard), specificatorii de tip
dC și d1 sunt
echivalenți cu byte, specificatorii de
tip uC și u1 sunt
echivalenți cu ubyte, specificatorii de
tip dS și d2 sunt
echivalenți cu short, specificatorii de
tip uS și u2 sunt
echivalenți cu ushort, specificatorii de
tip dI, dL, și
d4 sunt echivalenți cu
long, specificatorii de tip
uI, uL, și
u4 sunt echivalenți cu
ulong, specificatorul de tip
d8 este echivalent cu
quad, specificatorul de tip
u8 este echivalent cu
uquad, iar specificatorul de tip
s este echivalent cu
string. În plus, specificatorul de tip
dQ este echivalent cu
quad, iar specificatorul de tip
uQ este echivalent cu
uquad.
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 “regex” și “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.
Tipurile numerice pot fi urmate opțional de
& ș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 u la tip indică
faptul că comparațiile ordonate trebuie să fie
fără semn.
testValorile numerice pot fi precedate de un caracter care
indică operația care urmează să fie
efectuată. Acesta poate fi =, pentru a
specifica faptul că valoarea din fișier trebuie să
fie egală cu valoarea specificată,
<, pentru a specifica faptul că
valoarea din fișier trebuie să fie mai mică
decât valoarea specificată, >,
pentru a specifica faptul că valoarea din fișier trebuie
să fie mai mare decât valoarea specificată,
&, 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ă, ^, 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 ~, valoarea
specificată după este negată înainte de
testare. x, pentru a specifica că orice
valoare se va potrivi. Dacă caracterul este omis, se presupune
că este =. Operatorii
&, ^ și
~ nu funcționează cu numere cu
virgulă flotantă și numere de precizie
dublă. Operatorul ! specifică
faptul că linia se potrivește dacă testul
nu
reușește.
Valorile numerice sunt specificate în format C; de
exemplu, 13 este zecimal,
013 este octal, iar 0x13
este hexazecimal.
Operațiile numerice nu sunt efectuate pe tipuri de date, în schimb valoarea numerică este interpretată ca un decalaj.
Pentru valorile șir de caractere, șirul din
fișier trebuie să corespundă șirului
specificat. Operatorii =,
< și > (dar
nu și &) 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 >\0 (deoarece toate
șirurile nevid sunt mai mari decât șirul gol).
Datele sunt tratate ca valori numerice în reprezentarea internă respectivă.
Testul special x este întotdeauna evaluat ca fiind „true” (adevărat).
messageCreatorul și tipul unui APPLE cu 4+4 caractere APPLE pot fi specificate ca:
!:apple CREATYPE
O listă de extensii de nume de fișiere des întâlnite, separate prin bară oblică, poate fi specificată ca:
!:ext ext[/ext...]
adică șirul literal “!:ext” urmat de o listă de extensii des întâlnite; de exemplu pentru imagini JPEG:
!:ext jpeg/jpg/jpe/jfif
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:
!:mime MIMETYPE
adică șirul literal “!:mime” urmat de tipul MIME.
Un punct forte opțional poate fi furnizat pe o linie separată, care se referă la descrierea magică curentă folosind următorul format:
!:strength OPERAND VALOARE
Operandul OPERAND poate fi:
+, -,
* sau /, iar
VALOARE este o constantă între 0
și 255. Această constantă este aplicată folosind
operandul specificat la puterea magică implicită
calculată în prezent.
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 > care preced pozișia. Numărul de > de pe linie indică nivelul testului; o linie fără > 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 n reușește, toate testele următoare de la nivelul n+1 sunt efectuate, iar mesajele afișate dacă testele reușesc, până când apare o linie cu nivelul 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:
0 string MZ >0x18 uleshort <0x40 MS-DOS executable >0x18 uleshort >0x3f extended PC executable (e.g., MS Windows)
Decalajele nu trebuie să fie constante, ci pot fi citite și din fișierul examinat. Dacă primul caracter după ultimul > este un ( 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: (x [[.,][bBcCeEfFgGhHiIlmosSqQ]][+-][ y ]). Valoarea lui 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 [bBcCeEfFgGhHiIlLmsSqQ]. Valoarea este tratată ca având semn dacă se specifică “,” sau fără semn dacă se specifică “.”. 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 m interpretează numărul ca o valoare middle endian (PDP-11). La acest număr se adaugă valoarea y, iar rezultatul este utilizat ca decalaj în fișier. Tipul implicit dacă nu este specificat unul este long. Sunt recunoscute următoarele tipuri:
| Tip | Sy Mnemonic | Sy Endian | Sy Dim. |
| bcBC | Byte/Char | N/A | 1 |
| efg | Double | Little | 8 |
| EFG | Double | Big | 8 |
| hs | Half/Short | Little | 2 |
| HS | Half/Short | Big | 2 |
| i | ID3 | Little | 4 |
| I | ID3 | Big | 4 |
| l | Long | Little | 4 |
| L | Long | Big | 4 |
| m | Middle | Middle | 4 |
| o | Octal | Textual | Variable |
| q | Quad | Little | 8 |
| Q | Quad | Big | 8 |
În acest fel se pot examina structuri de lungime variabilă:
# Executabilele MS Windows sunt de asemenea executabile MS-DOS valide 0 string MZ >0x18 uleshort <0x40 MZ executable (MS-DOS) # sare peste întregul bloc de mai jos dacă nu este un executabil extins >0x18 uleshort >0x3f >>(0x3c.l) string PE\0\0 PE executable (MS-Windows) >>(0x3c.l) string LX\0\0 LX executable (OS/2)
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\0\0, nici LE\0\0 în exemplul de mai sus).
Dacă acest decalaj indirect nu poate fi utilizată direct, sunt posibile calcule simple: adăugarea [+-*/%&|^]număr între paranteze permite modificarea valorii citite din fișier înainte ca aceasta să fie utilizată ca decalaj:
# 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 >0x18 uleshort <0x40 >>(4.s*512) leshort 0x014c COFF executable (MS-DOS, DJGPP) >>(4.s*512) leshort !0x014c MZ executable (MS-DOS)
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 ‘&’ ca prefix al decalajului:
0 string MZ >0x18 uleshort >0x3f >>(0x3c.l) string PE\0\0 PE executable (MS-Windows) # imediat după semnătura PE este tipul de CPU >>>&0 leshort 0x14c for Intel 80386 >>>&0 leshort 0x8664 for x86-64 >>>&0 leshort 0x184 for DEC Alpha
Decalajele indirecte și relative pot fi combinate:
0 string MZ >0x18 uleshort <0x40 >>(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 >>>&(2.s-514) string LE LE executable (MS Windows VxD driver)
Sau invers:
0 string MZ >0x18 uleshort >0x3f >>(0x3c.l) string LE\0\0 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ă >>>(&0x7c.l+0x26) string UPX \b, UPX compressed
Sau chiar amândouă!
0 string MZ >0x18 uleshort >0x3f >>(0x3c.l) string LE\0\0 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ă >>>&(&0x54.l-3) string UNACE \b, ACE self-extracting archive
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.
0 string MZ >0x18 uleshort >0x3f >>(0x3c.l) string PE\0\0 PE executable (MS-Windows) # caută secțiunea PE numită „.idata”... >>>&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 >>>>(&0xe.l+(-4)) string PK\3\4 \b, ZIP self-extracting archive
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:
# curăță această continuare a nivelului de potrivire >18 clear x >18 lelong 1 one >18 lelong 2 two >18 default x # imprimă potrivirea implicită >>18 lelong x unmatched 0x%x
file(1) - comanda care citește acest fișier.
Formatele long,
belong, lelong,
melong, short,
beshort și leshort nu
depind de lungimea tipurilor de date C short
și long de pe platformă, chiar
dacă specificația unică UNIX
implică acest lucru. Cu toate acestea, deoarece OS X Mountain Lion a
trecut de suita de validare a specificației unice
UNIX și furnizează o versiune a
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 long are 8
octeți în loc de 4 octeți, probabil că suita de
validare nu testează dacă, de exemplu,
long se referă la un element cu
aceeași dimensiune ca tipul de date C long.
Probabil că ar trebui să existe nume de tip
int8, uint8,
int16, uint16,
int32, uint32,
int64 și uint64,
precum și variante ale acestora cu ordinea octeților
specificată, pentru a fi mai clar că aceste tipuri au
lățimile specificate.
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>
Această traducere este documentație gratuită; citiți 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.
Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net
| 27 noiembrie 2024 | Debian |