MAGIC(5) | File Formats Manual | MAGIC(5) |
NUME
magic
—
fișier de model magic al comenzii
«file»
DESCRIERE
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/file/misc/magic.mgc sau într-un director de fișiere de fragmente de modele magice din textul sursă din /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.
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
- 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:
- 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.
- O poziție de continuare în raport cu
sfârșitul ultimului câmp de nivel superio.
(
&
).
tipul
- Tipul de date care urmează să fie testate. Valorile posibile
sunt:
byte
- O valoare de un octet.
short
- O valoare de doi octeți în ordinea nativă de octeți a acestei mașini.
long
- O valoare de patru octeți în ordinea nativă de octeți a acestei mașini.
quad
- O valoare de opt octeți în ordinea nativă de octeți a acestei mașini.
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.
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.
string
- Un șir de octeți. Specificarea tipului de șir
poate fi urmată opțional de o opțiune
/<width>(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:
- b
- Forțează testarea fișierelor binare.
- 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ă.
- 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 “c”, cât și “C”.
- f
- Solicită ca șirul de caractere potrivit să fie un cuvânt complet, nu un cuvânt parțial potrivit.
- T
- Decupează șirul de caractere, adică spațiile albe anterioare și posterioare
- t
- Forțează testarea fișierelor text.
- W
- Spațiu alb compact în țintă, care
trebuie să conțină cel puțin un
caracter de spațiu alb. Dacă magia are
n
spații goale consecutive, ținta trebuie să aibă cel puținn
spații goale consecutive pentru a se potrivi. - w
- Tratează fiecare spațiu liber din magic ca un spațiu liber opțional. Acesta este șters înainte ca șirul să fie imprimat.
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:
- B
- O lungime de un octet (implicit).
- H
- O lungime big endian de 2 octeți.
- h
- O lungime little endian de 2 octeți.
- L
- O lungime big endian de 4 octeți.
- l
- O lungime little endian de 4 octeți.
- J
- Lungimea se include pe sine în calculul său.
date
- O valoare de patru octeți interpretată ca o dată UNIX.
qdate
- O valoare de opt octeți interpretată ca o dată UNIX.
ldate
- O valoare de patru octeți interpretată ca o dată în stil UNIX, dar interpretată ca oră locală și nu ca UTC.
qldate
- O valoare de opt octeți interpretată ca o dată în stil UNIX, dar interpretată ca oră locală și nu ca UTC.
qwdate
- O valoare de opt octeți interpretată ca o dată în stilul Windows.
msdosdate
- O valoare de două octeți interpretată ca dată în stilul FAT/DOS.
msdostime
- O valoare de două octeți interpretată ca oră în stilul FAT/DOS.
beid3
- O lungime ID3 de 32 de biți în ordinea octeților big-endian.
beshort
- O valoare de doi octeți în ordinea octeților big-endian.
belong
- O valoare de patru octeți în ordinea octeților big-endian.
bequad
- O valoare de opt octeți în ordinea octeților big-endian.
befloat
- Un număr cu virgulă mobilă IEEE pe 32 de biți, cu precizie simplă, în ordinea octeților big-endian.
bedouble
- Un număr cu virgulă mobilă IEEE pe 64 de biți, cu precizie simplă, în ordinea octeților big-endian.
bedate
- O valoare de patru octeți în ordinea octeților big-endian, interpretată ca o dată Unix.
beqdate
- O valoare de opt octeți în ordinea octeților big-endian, interpretată ca o dată Unix.
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.
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.
beqwdate
- O valoare de opt octeți în ordinea octeților big-endian, interpretată ca o dată în stilul Windows.
bemsdosdate
- O valoare de doi octeți în ordinea octeților big-endian, interpretată ca dată în stilul FAT/DOS.
bemsdostime
- O valoare de doi octeți în ordinea octeților big-endian, interpretată ca oră în stilul FAT/DOS.
bestring16
- Un șir Unicode (UCS16) de doi octeți în ordinea octeților big-endian.
leid3
- O lungime ID3 de 32 de biți în ordinea octeților little-endian.
leshort
- O valoare de doi octeți în ordinea octeților little-endian.
lelong
- O valoare de patru octeți în ordinea octeților little-endian.
lequad
- O valoare de opt octeți în ordinea octeților little-endian.
lefloat
- Un număr cu virgulă mobilă IEEE pe 32 de biți, cu precizie simplă, în ordinea octeților little-endian.
ledouble
- Un număr cu virgulă mobilă IEEE pe 64 de biți, cu precizie dublă, în ordinea octeților little-endian.
ledate
- O valoare de patru octeți în ordinea octeților little-endian, interpretată ca o dată UNIX.
leqdate
- O valoare de opt octeți în ordinea octeților little-endian, interpretată ca o dată UNIX.
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.
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.
leqwdate
- O valoare de opt octeți în ordinea octeților little-endian, interpretată ca o dată în stilul Windows.
lemsdosdate
- O valoare de doi octeți în ordinea octeților big-endian, interpretată ca dată în stilul FAT/DOS.
lemsdostime
- O valoare de doi octeți în ordinea octeților big-endian, interpretată ca oră în stilul FAT/DOS.
lestring16
- Un șir Unicode (UCS16) de doi octeți în ordinea octeților little-endian.
melong
- O valoare de patru octeți în ordinea octeților middle-endian (PDP-11).
medate
- O valoare de patru octeți în ordinea octeților middle-endian (PDP-11), interpretată ca o dată UNIX.
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.
indirect
- Începând de la poziția dată, se
consultă din nou baza de date a magiei. Poziția magiei
indirect
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. name
- Definește o instanță magică
“named” (numită) care poate fi apelată de
la o altă intrare magică
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. use
- Apelează recursiv magia numită începând de
la poziția curentă. Dacă numele referinței
începe cu
^
, atunci endianness-ul magiei este schimbat; dacă magia numităleshort
, de exemplu, aceasta este tratată cabeshort
și viceversa. Acest lucru este util pentru a evita dublarea regulilor pentru diferite endianness-uri. 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
/<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
- 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
/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ă. default
- Acesta este destinat a fi utilizat cu testul 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
clear
. 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
default
. 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:
eoc
,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. guid
- Un identificator unic global, analizat și imprimat ca XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. Formatul său este un șir de caractere.
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:
-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
octal
- Un șir reprezentând un număr octal.
Pentru compatibilitate cu standardul Unix unic (Single UNIX Standard), specificatorii de tip
dC
șid1
sunt echivalenți cubyte
, specificatorii de tipuC
șiu1
sunt echivalenți cuubyte
, specificatorii de tipdS
șid2
sunt echivalenți cushort
, specificatorii de tipuS
șiu2
sunt echivalenți cuushort
, specificatorii de tipdI
,dL
, șid4
sunt echivalenți culong
, specificatorii de tipuI
,uL
, șiu4
sunt echivalenți cuulong
, specificatorul de tipd8
este echivalent cuquad
, specificatorul de tipu8
este echivalent cuuquad
, iar specificatorul de tips
este echivalent custring
. În plus, specificatorul de tipdQ
este echivalent cuquad
, iar specificatorul de tipuQ
este echivalent cuuquad
.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 unuiu
la tip indică faptul că comparațiile ordonate trebuie să fie fără semn. 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, \n pentru linie
nouă).
Valorile 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, iar0x13
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).
message
- Mesajul care urmează să fie afișat dacă comparația reușește. Dacă șirul conține o specificație de format printf(3), valoarea din fișier (cu orice mascare specificată) este imprimată folosind mesajul ca șir de format. Dacă șirul de caractere începe cu “\b”, 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.
Creatorul ș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
CONSULTAȚI ȘI
file(1) - comanda care citește acest fișier.
ERORI
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.
TRADUCERE
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 | Linux 6.13.7-arch1-1 |