Provided by: manpages-pl_4.28.0-2_all 

NAZWA
magic — plik wzorców magicznych polecenia file
OPIS
Ta strona podręcznika systemowego opisuje format pliku magicznego, używanego przez polecenie file(1) w
wersji 5.46. Polecenie file(1) rozpoznaje typ pliku, korzystając (poza innymi metodami) z testu,
polegającego na sprawdzeniu, czy plik nie rozpoczyna się od pewnego „wzorca magicznego”. Baza „wzorców
magicznych” znajduje się zwykle w pliku binarnym /usr/share/misc/magic.mgc lub w katalogu z plikami
zawierającymi fragmenty źródłowe tekstów wzorców magicznych /usr/share/misc/magic. Baza określa jakie
wzorce sprawdzać i jakie komunikaty lub typy MIME wypisywać w przypadku znalezienia określonego wzorca
magicznego oraz dodatkowe dane, które mają zostać pobrane z pliku.
Format plików z fragmentami źródeł służącymi do zbudowania tej bazy danych jest następujący: Każdy wiersz
pliku fragmentarycznego określa test, które ma być wykonany. Test porównuje dane, rozpoczynające się przy
określonym przesunięciu względem początku pliku z wartością bajtową, numeryczną lub łańcuchem. Jeśli test
zakończy się pomyślnie, wypisywany jest komunikat. Wiersz składa się z następujących pól:
offset Liczba, określająca przesunięcie (w bajtach) względem początku pliku, przy którym należy szukać
testowanych danych. Przesunięcie może być liczbą ujemną, jeśli jest:
• Pierwszym bezpośrednim przesunięciem wpisu magicznego (na poziomie kontynuacji 0), wówczas
jest interpretowane jako przesunięcie liczone od końca pliku. Działa to tylko, gdy dostępny
jest deskryptor danego pliku i jest to zwykły plik.
• Przesunięcie kontynuacji względem końca ostatniego pola wyższego poziomu (&).
Jeśli przesunięcie zaczyna się od symbolu „+”, to wszystkie przesunięcia interpretowane są jako
przesunięcia od początku pliku (domyślnie).
type Typ testowanych danych. Dopuszczalne wartości to:
byte Wartość jednobajtowa.
short Wartość dwubajtowa w natywnej kolejności bajtów tego komputera.
long Wartość czterobajtowa w natywnej kolejności bajtów tego komputera.
quad Wartość ośmiobajtowa w natywnej kolejności bajtów tego komputera.
float 32-bitowa liczba zmiennoprzecinkowa o pojedynczej precyzji IEEE, w natywnej dla tego
komputera kolejności bajtów.
double 64-bitowa liczba zmiennoprzecinkowa o podwójnej precyzji IEEE, w natywnej dla tego
komputera kolejności bajtów.
string Łańcuch bajtów. Po określeniu typu łańcucha może opcjonalnie wystąpić opcja
/<szerokość> oraz opcjonalnie zestaw flag /[bCcftTtWw]*. Szerokość ogranicza liczbę
znaków do skopiowania. Zero oznacza wszystkie znaki. Obsługiwane są poniższe flagi:
b Wymusza test pliku binarnego.
C Używa dopasowania niewrażliwego na wielkość wielkich liter: wielkie litery w
magii dopasują zarówno małe jak i wielkie litery w celu, natomiast małe
litery w magii dopasują jedynie małe litery w celu.
c Używa dopasowania niewrażliwego na wielkość małych liter: małe litery w magii
dopasują zarówno małe jak i wielkie litery w celu, natomiast wielkie litery w
magii dopasują jedynie wielkie litery w celu. Aby uzyskać dopasowanie
całkowicie niewrażliwe na wielkość liter, należy podać zarówno „c” jak i „C”.
f Wymaga, aby dopasowany łańcuch był pełnym słowem, a nie dopasowaniem części
słowa.
T Przycina łańcuch, tzn. początkowe i końcowe białe znaki
t Wymusza test pliku tekstowego
W Kompaktuje białe znaki w celu, który musi zawierać przynajmniej jeden biały
znak. Jeśli magia ma n kolejnych białych znaków, cel musi mieć przynajmniej n
kolejnych białych znaków, aby zostać dopasowanym.
w Traktuje każdą spację w magii jako opcjonalną. Jest ona usuwana przed
wypisaniem łańcucha.
pstring Łańcuch w stylu Pascala, gdzie pierwszy bajt/liczba typu short/liczba typu int jest
interpretowany jako długość bez znaku. Domyślną długością jest bajt i można go
określić jako modyfikator. Obsługiwane są następujące modyfikatory:
B Długość bajtu (domyślnie).
H Długość 2 bajtów big endian.
h Długość 2 bajtów little endian.
L Długość 4 bajtów big endian.
l Długość 4 bajtów little endian.
J Długość zawierająca się w swej liczebności.
Łańcuch nie kończy się znakiem NUL. Zamiast bardziej wartościowego „I” używane jest
„J„, ponieważ ten typ długości jest cechą formatu JPEG.
date Czterobajtowa wartość, interpretowana jako data uniksowa.
qdate Ośmiobajtowa wartość, interpretowana jako data uniksowa.
ldate Czterobajtowa wartość, interpretowana jako data w stylu uniksowym, ale
interpretowana jako czas lokalny, a nie UTC.
qldate Ośmiobajtowa wartość, interpretowana jako data w stylu uniksowym, ale interpretowana
jako czas lokalny, a nie UTC.
qwdate Ośmiobajtowa wartość interpretowana jako data w stylu windowsowym.
msdosdate Dwubajtowa wartość interpretowana jako data w stylu FAT/DOS.
msdostime Dwubajtowa wartość interpretowana jako czas w stylu FAT/DOS.
beid3 32-bitowa długość ID3 w kolejności bajtów big-endian
beshort Wartość dwubajtowa w kolejności bajtów big-endian.
belong Wartość czterobajtowa w kolejności bajtów big-endian.
bequad Wartość ośmiobajtowa w kolejności bajtów big-endian.
befloat 32-bitowa liczba zmiennoprzecinkowa o pojedynczej precyzji IEEE, w kolejności bajtów
big-endian.
bedouble 64-bitowa liczba zmiennoprzecinkowa o podwójnej precyzji IEEE, w kolejności bajtów
big-endian.
bedate Czterobajtowa wartość w kolejności bajtów big-endian, interpretowana jako data
uniksowa.
beqdate Ośmiobajtowa wartość w kolejności bajtów big-endian, interpretowana jako data
uniksowa.
beldate Czterobajtowa wartość w kolejności bajtów big-endian, interpretowana jako data w
stylu uniksowym, ale interpretowana jako czas lokalny, a nie UTC.
beqldate Ośmiobajtowa wartość w kolejności bajtów big-endian, interpretowana jako data w
stylu uniksowym, ale interpretowana jako czas lokalny, a nie UTC.
beqwdate Ośmiobajtowa wartość w kolejności bajtów big-endian, interpretowana jako data w
stylu windowsowym.
bemsdosdate
Dwubajtowa wartość w kolejności bajtów big-endian, interpretowana jako data w stylu
FAT/DOS.
bemsdostime
Dwubajtowa wartość w kolejności bajtów big-endian, interpretowana jako czas w stylu
FAT/DOS.
bestring16 Dwubajtowy łańcuch unikodu (UCS16), w kolejności bajtów big-endian.
leid3 32-bitowa długość ID3 w kolejności bajtów little-endian
leshort Wartość dwubajtowa w kolejności bajtów little-endian.
lelong Wartość czterobajtowa w kolejności bajtów little-endian.
lequad Wartość ośmiobajtowa w kolejności bajtów little-endian.
lefloat 32-bitowa liczba zmiennoprzecinkowa o pojedynczej precyzji IEEE, w kolejności bajtów
little-endian.
ledouble 64-bitowa liczba zmiennoprzecinkowa o podwójnej precyzji IEEE, w kolejności bajtów
little-endian.
ledate Czterobajtowa wartość w kolejności bajtów little-endian, interpretowana jako data
uniksowa.
leqdate Ośmiobajtowa wartość w kolejności bajtów little-endian, interpretowana jako data
uniksowa.
leldate Czterobajtowa wartość w kolejności bajtów little-endian, interpretowana jako data w
stylu uniksowym, ale interpretowana jako czas lokalny, a nie UTC.
leqldate Ośmiobajtowa wartość w kolejności bajtów little-endian, interpretowana jako data w
stylu uniksowym, ale interpretowana jako czas lokalny, a nie UTC.
leqwdate Ośmiobajtowa wartość w kolejności bajtów little-endian, interpretowana jako data w
stylu windowsowym.
lemsdosdate
Dwubajtowa wartość w kolejności bajtów big-endian, interpretowana jako data w stylu
FAT/DOS.
lemsdostime
Dwubajtowa wartość w kolejności bajtów big-endian, interpretowana jako czas w stylu
FAT/DOS.
lestring16 Dwubajtowy łańcuch unikodu (UCS16), w kolejności bajtów little-endian.
melong Wartość czterobajtowa w kolejności bajtów middle-endian (PDP-11).
medate Czterobajtowa wartość w kolejności bajtów middle-endian (PDP-11), interpretowana
jako data uniksowa.
meldate Czterobajtowa wartość w kolejności bajtów middle-endian (PDP-11), interpretowana
jako data w stylu uniksowym, ale interpretowana jako czas lokalny, a nie UTC.
indirect Poczynając od podanego przesunięcia, sprawdza ponownie bazę danych magii.
Przesunięcie magii indirect jest domyślnie przesunięciem absolutnym w pliku, ale
można podać /r aby wskazać, że przesunięcie jest względne wobec początku wpisu.
name Definiuje „nazwane” wystąpienie magii, które można wywołać z innego wpisu magii use,
jak wywołanie podfunkcji. Przesunięcia nazwanych wystąpień bezpośrednich magii są
względem przesunięcia poprzednio dopasowanego wpisu, natomiast niebezpośrednie
przesunięcia są liczone względem początku pliku, jak zwykle. Nazwane wpisy magii są
zawsze dopasowywane.
use Rekurencyjne wywołuje nazwaną magię poczynając od bieżącego przesunięcia. Jeśli
nazwa odniesienia rozpoczyna się od ^, to zamieniana jest kolejność bajtów magii;
jeśli magia wspominała np. leshort, jest traktowana jako beshort i na odwrót. Jest
to przydatne, aby uniknąć duplikowania reguł dla różnych kolejności bajtów.
regex Wyrażenie regularne w składni rozszerzonych wyrażeń regularnych POSIX (jak egrep).
Przetworzenie wyrażeń regularnych może zająć wykładniczo więcej czasu i ciężko
przewidzieć ich wydajność, zatem odradza się ich używania. W środowiskach
produkcyjnych należy uważnie sprawdzić ich wydajność. Należy też ograniczyć rozmiar
łańcucha do przeszukania, podając /<długość>, aby uniknąć problemów z wydajnością
przy skanowaniu długich plików. Po określeniu typu można opcjonalnie dodać
/[c][s][l]. Flaga „c” czyni dopasowanie niewrażliwym na wielkość znaków, natomiast
„s” aktualizuje przesunięcie na początek przesunięcia dopasowania, zamiast jego
koniec. Modyfikator „l” zmienia limit długości, aby oznaczał on liczbę wierszy
zamiast liczbę bajtów. Wiersze są rozgraniczane przez ogranicznik zależny od
platformy. Gdy poda się liczbę wierszy, obliczana jest też niejawnie liczba bajtów
zakładając, że każdy wiersz ma 80 znaków. Jeśli nie poda się liczby bajtów ani
wierszy, wyszukiwanie jest automatycznie ograniczane do 8KiB. ^ i $ dopasowują
początek i koniec poszczególnych wierszy, a nie początek i koniec pliku.
search Dosłowny łańcuch szukany od podanego przesunięcia. Można korzystać z tych samych
flag modyfikujących jak przy wzorcach łańcuchowych. Wyszukiwane wyrażenie musi
zawierać zakres w postaci /liczba, tj. liczbę pozycji, na której dokonane będą próby
dopasowania, zaczynając od początkowego przesunięcia. Jest to właściwe przy
wyszukiwaniu większych wyrażeń binarnych z różnymi przesunięciami, korzystając z
cytowania znaków specjalnych za pomocą \. Kolejność modyfikatorów i liczb nie ma
znaczenia.
default Zaprojektowane do użycia z testem x (zawsze prawdziwym); nie ma typu. Dopasowuje,
gdy inne testy na tym poziomie kontynuacji nic wcześniej nie dopasowały. Za pomocą
testu clear można wyczyścić dopasowane testy dla poziomu kontynuacji.
clear Ten test jest zawsze prawdziwy i czyści flagę dopasowania dla danego poziomu
kontynuacji. Zaprojektowany do użycia z testem default.
der Przetwarza plik jako plik certyfikatu DER. Pole testowe służy jako typ der, który
musi być dopasowany. Występują następujące typy DER: 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. Po typach tych może wystąpić opcjonalny rozmiar
numeryczny, który oznacza szerokość pola w bajtach.
guid Globalnie unikalny identyfikator (ang. Globally Unique Identifier – GUID),
przetwarzany i wypisywany jako XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. Jest to format
łańcuchowy.
offset Jest to wartość typu quad wskazująca aktualne przesunięcie pliku. Może służyć do
określenia rozmiaru pliku lub bufora magicznego. Przykładowe wpisy magiczne:
-0 offset x ten plik ma %lld bajtów
-0 offset <=100 musi mieć więcej niż 100 \
bajtów, a ma tylko %lld
octal Łańcuch oznaczający liczbę ósemkową.
Ze względu ma kompatybilność z Single Unix Standard, określenia typu dC i d1 są równoważne byte,
określenia typu uC i u1 są równoważne ubyte, określenia typu dS i d2 są równoważne short,
określenia typu uS i u2 są równoważne ushort, określenia typu dI, dL, i d4 są równoważne long,
określenia typu uI, uL, i u4 są równoważne ulong, określenie typu d8 jest równoważne quad,
określenie typu u8 jest równoważne uquad, a określenie typu s jest równoważne string. Dodatkowo
określenie typu dQ jest równoważne quad, a określenie typu uQ jest równoważne uquad.
Każdy wzorzec magiczny najwyższego poziomu (poniżej wyjaśniono znaczenie poziomów) jest
klasyfikowany jako tekstowy lub binarny, w zależności od użytego typu. Typy „regex” i „search”
są klasyfikowane jako tekstowe, chyba że we wzorcu użyto znaków niedrukowalnych. Wszystkie inne
testy są klasyfikowane jako binarne. Wzorzec najwyższego poziomu uważa się za test tekstowy,
jeśli wszystkie jego wzorce są wzorcami tekstowymi; w innym przypadku jest uważany za wzorzec
binarny. Przy dopasowywaniu pliku, jako pierwsze próbowane są wzorce binarne; jeśli żaden nie
zostanie dopasowany, a plik wygląda na tekstowy, to określane jest jego kodowanie i próbowane są
wzorce tekstowe.
Po typach numerycznych może opcjonalnie wystąpić & i wartość numeryczna aby określić, że wartość
ma być zsumowana (AND) z wartością numeryczną przed dokonaniem jakiegokolwiek porównania.
Wstawienie u przed typem oznacza, że uszeregowane porównania mają być dokonywane bez względu na
znak.
test Wartość, które ma być porównywana z wartością z pliku. Jeśli typ jest numeryczny, to wartość
jest podawana w postaci zgodnej z językiem C; jeśli typ jest łańcuchowy, to wartość jest
podawana jako łańcuch języka C z dozwolonymi znakami specjalnymi (np. \n dla nowego wiersza).
Wartości numeryczne mogą być poprzedzone znakami określającymi operację, jaka ma zostać
wykonana. Znakiem operacji może być =, określający, że wartość z pliku musi się równać wartości
podanej, <, określający, że wartość z pliku musi być mniejsza od podanej, >, określający, że
wartość z pliku musi być większa od podanej, &, określający, że wartość z pliku musi mieć
wszystkie bity, które są ustawione w podanej wartości, ^, określający, że wartość z pliku musi
mieć wyzerowane wszystkie bity, które są ustawione w podanej wartości, lub ~, określający, że
podana wartość ma zostać zanegowana przed przetestowaniem. x, określa, że pasować może dowolna
wartość. Jeśli znak operacji jest pominięty, używany jest =. Operatory &, ^ i ~ nie działają z
liczbami zmiennoprzecinkowymi i typu double. Operator ! określa, że wiersz zostanie dopasowany
jeśli test nie powiedzie się.
Wartości numeryczne są podawane w postaci zgodnej z językiem C, np. 13 to liczba dziesiętna,
013 to liczba ósemkowa, a 0x13 to liczba szesnastkowa.
Operacje numeryczne nie są przeprowadzane na typach daty; wartość numeryczna jest zamiast tego
interpretowana jako przesunięcie.
Dla wartości łańcuchowych, łańcuch z pliku musi odpowiadać podanemu łańcuchowi. Do łańcuchów
mogą być stosowane operatory =, < i > (lecz nie &). Długość, używana do porównywania jest
długością argumentu łańcuchowego z pliku magicznego. Znaczy to, że wiersz można dopasować do
dowolnego niepustego łańcucha (zwykle używane do późniejszego wypisania łańcucha), stosując >\0
(ponieważ wszystkie łańcuchy są większe od łańcucha zerowego).
Daty są traktowane jako wartości numeryczne w odpowiedniej wewnętrznej reprezentacji.
Specjalny test x zawsze daje prawdę.
message Komunikat do wypisania, jeśli porównanie powiedzie się. Jeśli łańcuch zawiera określenie formatu
printf(3), to wartość z pliku (po dokonaniu ewentualnego podanego przekształcenia) jest
wypisywana korzystając z komunikatu jako łańcucha formatu. Jeśli łańcuch zaczyna się od „\b”,
wypisywany komunikat jest resztą łańcucha bez dodanej przed nim spacji: wielokrotne dopasowania
są zwykle rozdzielone pojedynczą spacją.
Twórcę i typ APPLE w formacie 4+4 znaków można podać jako:
!:apple CREATYPE
Listę powszechnych rozszerzeń plików, rozdzieloną ukośnikiem, można podać jako:
!:ext rozsz[/rozsz...]
tj. jako dosłowny łańcuch “!:ext”, po którym następuje lista powszechnych rozszerzeń plików, rozdzielona
ukośnikiem; np. dla obrazów JPEG:
!:ext jpeg/jpg/jpe/jfif
Typ MIME jest podawany w osobnym wierszu, który musi wystąpić jako następny niepusty wiersz niebędący
komentarzem po wierszu magii identyfikującym typ pliku; ma on następujący format:
!:mime TYPMIME
tj. dosłowny łańcuch “!:mime”, po którym następuje typ MIME.
W osobnym wierszu można podać opcjonalną siłę, która odnosi się do aktualnego opisu magii; korzysta z
następującego formatu:
!:strength ARG WARTOŚĆ
Argumentem ARG może być: +, -, * lub /; natomiast WARTOŚĆ jest stałą z przedziału 0-255. Na aktualnie
obliczonej domyślnej sile magii przeprowadzane jest działanie podane w argumencie, którego drugim
elementem jest podana stała.
Niektóre formaty pliku zawierają dodatkowe informacje, które będą wypisane razem z typem pliku lub
wymagają dodatkowych testów aby określić prawdziwy typ pliku. Te dodatkowe testy są wprowadzane za pomocą
jednego lub wielu znaków > poprzedzających przesunięcie. Liczba znaków > w wierszu określa poziom testu;
wiersz bez > na początku jest na poziomie 0. Testy są ułożone w hierarchii drzewiastej: jeśli test w
wierszu na poziomie n powiedzie się, wykonywane są wszystkie kolejne testy na poziomie n+1, a komunikaty
są wypisywane jeśli testy powiodą się, do momentu pojawienia się wiersza na poziomie n (lub niższym). W
przypadku bardziej złożonych plików, można używać pustych komunikatów, aby uzyskać efektywną składnię
„jeżeli/to”, w następującej postaci:
0 string MZ
>0x18 uleshort <0x40 pl. wykonywalny MS-DOS
>0x18 uleshort >0x3f rozsz. pl. wyk. PC (np. MS Windows)
Przesunięcia nie muszą być stałe, mogą być też odczytywane ze sprawdzanego pliku. Jeśli pierwszym znakiem
po ostatnim > jest ( to łańcuch po nawiasie jest interpretowany jako niebezpośrednie przesunięcie.
Oznacza to, że liczba po nawiasie jest używana jako przesunięcie w pliku. Wartość na jakiej przesunięcie
jest odczytane, jest używana ponownie jako przesunięcie w pliku. Przesunięcia niebezpośrednie mają postać
(x [[.,][bBcCeEfFgGhHiIlmosSqQ]][+-][ y ]). Wartość x służy jako przesunięcie w pliku. Bajt, długości
id3 short lub long jest odczytywany na tym przesunięciu, w zależności od określenia typu
[bBcCeEfFgGhHiIlLmsSqQ]. Wartość jest traktowana jako ze znakiem, jeśli podano „,” lub bez znaku, jeśli
podano „.”. Typy pisane wielką literą są interpretowane jako wartość big endian, a małe litery
reprezentują wartość liczbową little endian; typ m interpretuje liczbę jako wartość middle endian
(PDP-11). Do tej liczby dodawana jest wartość y, a wynik służy jako przesunięcie w pliku. Domyślnym
typem, jeśli się go nie określi, jest long. Rozpoznawane są poniższe typy:
Typ Skrót od Kol. baj. Rozmiar
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 Tekstowa Zmienny
q Quad Little 8
Q Quad Big 8
W ten sposób można sprawdzić struktury o zmiennej długości:
# Pliki wykonywalne MS Windows są też prawidłowymi pl. wyk. MS-DOS
0 string MZ
>0x18 uleshort <0x40 Wykonywalny MZ (MS-DOS)
# pomiń poniższy blok, jeśli nie jest rozszerzonym pl. wykonywalnym
>0x18 uleshort >0x3f
>>(0x3c.l) string PE\0\0 Wykonywalny PE (MS-Windows)
>>(0x3c.l) string LX\0\0 Wykonywalny LX (OS/2)
Ten sposób ma swoje wady: trzeba się upewnić, że na końcu coś się wypisze albo użytkownicy mogą otrzymać
puste wyjście (np. gdy w powyższym przykładzie nie jest to ani PE\0\0 ani LE\0\0).
Jeśli nie da się bezpośrednio zastosować tego niebezpośredniego przesunięcia, możliwe są proste
obliczenia: dołączenie [+-*/%&|^]liczba wewnątrz nawiasów pozwala na modyfikację wartości odczytanej z
pliku, zanim zostanie użyta jako przesunięcie:
# Pliki wykonywalne MS Windows są też prawidłowymi pl. wyk. MS-DOS
0 string MZ
# czasem, wartość na 0x18 ma mniej niż 0x40 lecz wciąż jest to rozsz.
# plik wykonywalny, zatem po prostu dodajemy do pliku
>0x18 uleshort <0x40
>>(4.s*512) leshort 0x014c Wykonywalny COFF (MS-DOS, DJGPP)
>>(4.s*512) leshort !0x014c Wykonywalny MZ (MS-DOS)
Czasem dokładne przesunięcie nie jest znane, ponieważ zależy ono od długości lub pozycji (tam gdzie
wcześniej używano przesunięć niebezpośrednich) poprzednich pól. Można podać przesunięcie względem końca
ostatniego pola wyższego poziomu za pomocą ‘&’ stosowanego jako przedrostek przesunięcia:
0 string MZ
>0x18 uleshort >0x3f
>>(0x3c.l) string PE\0\0 Wykonywalny PE (MS-Windows)
# po którym występuje podpis PE będący typem procesora
>>>&0 leshort 0x14c dla Intel 80386
>>>&0 leshort 0x8664 dla x86-64
>>>&0 leshort 0x184 dla DEC Alpha
Przesunięcia niebezpośrednie i względne można łączyć:
0 string MZ
>0x18 uleshort <0x40
>>(4.s*512) leshort !0x014c Wykonywalny MZ (MS-DOS)
# jeśli to nie COFF, cofnij się o 512 bajtów i dodaj przesunięcie
# z bajtu 2/3, które stanowi inny sposób znalezienia początku
# rozszerzonego pliku wykonywalnego
>>>&(2.s-514) string LE Wykonywalny LE (ster. MS Windows VxD)
Lub na odwrót:
0 string MZ
>0x18 uleshort >0x3f
>>(0x3c.l) string LE\0\0 Wykonywalny LE (MS-Windows)
# na przesunięciu 0x80 (-4, ponieważ przesun. względne zaczynają się od
# końca dopasowania wyższego poziomu) wewnątrz nagłówka LE, znajdujemy
# absolutne przes. do kodu obszaru, gdzie szukamy określonego podpisu
>>>(&0x7c.l+0x26) string UPX \b, skompresowany UPX
Lub podać oba!
0 string MZ
>0x18 uleshort >0x3f
>>(0x3c.l) string LE\0\0 Wykonywalny LE (MS-Windows)
# na przesunięciu 0x58 w nagłówku LE, znajdujemy przesunięcie względne do
# obszaru danych, gdzie szukamy określonego podpisu
>>>&(&0x54.l-3) string UNACE \b, samorozp. się archiwum ACE
Jeśli w pliku zachodzi konieczność radzenia sobie z duetami przesunięcie/długość, z samego pliku można
pobrać nawet drugą wartość w wyrażeniu w nawiasie, za pomocą kolejnego zestawu nawiasów. Proszę zauważyć,
że to dodatkowe przesunięcie niebezpośrednie jest zawsze względem początku głównego przesunięcia
niebezpośredniego.
0 string MZ
>0x18 uleshort >0x3f
>>(0x3c.l) string PE\0\0 Wykonywalny PE (MS-Windows)
# szukamy sekcji PE o nazwie ".idata"...
>>>&0xf4 search/0x140 .idata
# ...i przechodzimy na jej koniec, obliczony jako początek+długość;
# są one zlokalizowane 14 i 10 bajtów po nazwie sekcji
>>>>(&0xe.l+(-4)) string PK\3\4 \b, archiwum samorozp. ZIP
Jeśli ma się listę znanych wartości na określonym poziomie kontynuacji i chce się udostępnić domyślny
przypadek w postaci przełącznikowej:
# wyczyść dopasowania danego poziomu kontynuacji
>18 clear x
>18 lelong 1 jeden
>18 lelong 2 dwa
>18 default x
# wypisz domyślne dopasowanie
>>18 lelong x niedopasowane 0x%x
ZOBACZ TAKŻE
file(1) - polecenie odczytujące ten plik.
USTERKI
Formaty long, belong, lelong, melong, short, beshort i leshort nie zależą od długość typów danych C short
i long na platformie, choć Single Unix Specification implikuje, że zależą. Jednak ponieważ OS X Mountain
Lion przeszedł zestaw walidacji Single Unix Specification i dostarcza wersję file(1) w której brak jest
zależności od rozmiarów typów danych C oraz która jest zbudowana dla środowiska 64-bitowego, w którym
long ma 8 bajtów, a nie 4, być może zestaw walidujący nie sprawdza czy np. long odnosi się to elementu o
tym samym rozmiarze, co typ danych C long. Prawdopodobnie powinny występować nazwy type takie jak int8,
uint8, int16, uint16, int32, uint32, int64 i uint64 oraz warianty o określonej kolejności bajtów tychże,
aby było jasne, że typy te mają określoną szerokość.
TŁUMACZENIE
Tłumaczenie niniejszej strony podręcznika: Przemek Borys <pborys@dione.ids.pl>, Andrzej Krzysztofowicz
<ankry@green.mf.pg.gda.pl> i Michał Kułach <michal.kulach@gmail.com>
Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać
zapoznając się z GNU General Public License w wersji 3: https://www.gnu.org/licenses/gpl-3.0.html lub
nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.
Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej
manpages-pl-list@lists.sourceforge.net .
Debian 27 listopada 2024 r. MAGIC(5)