MAGIC(5) File Formats Manual MAGIC(5) NAZWA magic - plik wzorcow magicznych polecenia file OPIS Ta strona podrecznika systemowego opisuje format pliku magicznego, uzywanego przez polecenie file(1) w wersji 5.46. Polecenie file(1) rozpoznaje typ pliku, korzystajac (poza innymi metodami) z testu, polegajacego na sprawdzeniu, czy plik nie rozpoczyna sie od pewnego ,,wzorca magicznego". Baza ,,wzorcow magicznych" znajduje sie zwykle w pliku binarnym /usr/share/file/misc/magic.mgc lub w katalogu z plikami zawierajacymi fragmenty zrodlowe tekstow wzorcow magicznych /usr/share/file/misc/magic. Baza okresla jakie wzorce sprawdzac i jakie komunikaty lub typy MIME wypisywac w przypadku znalezienia okreslonego wzorca magicznego oraz dodatkowe dane, ktore maja zostac pobrane z pliku. Format plikow z fragmentami zrodel sluzacymi do zbudowania tej bazy danych jest nastepujacy: Kazdy wiersz pliku fragmentarycznego okresla test, ktore ma byc wykonany. Test porownuje dane, rozpoczynajace sie przy okreslonym przesunieciu wzgledem poczatku pliku z wartoscia bajtowa, numeryczna lub lancuchem. Jesli test zakonczy sie pomyslnie, wypisywany jest komunikat. Wiersz sklada sie z nastepujacych pol: offset Liczba, okreslajaca przesuniecie (w bajtach) wzgledem poczatku pliku, przy ktorym nalezy szukac testowanych danych. Przesuniecie moze byc liczba ujemna, jesli jest: o Pierwszym bezposrednim przesunieciem wpisu magicznego (na poziomie kontynuacji 0), wowczas jest interpretowane jako przesuniecie liczone od konca pliku. Dziala to tylko, gdy dostepny jest deskryptor danego pliku i jest to zwykly plik. o Przesuniecie kontynuacji wzgledem konca ostatniego pola wyzszego poziomu (&). Jesli przesuniecie zaczyna sie od symbolu ,,+", to wszystkie przesuniecia interpretowane sa jako przesuniecia od poczatku pliku (domyslnie). type Typ testowanych danych. Dopuszczalne wartosci to: byte Wartosc jednobajtowa. short Wartosc dwubajtowa w natywnej kolejnosci bajtow tego komputera. long Wartosc czterobajtowa w natywnej kolejnosci bajtow tego komputera. quad Wartosc osmiobajtowa w natywnej kolejnosci bajtow tego komputera. float 32-bitowa liczba zmiennoprzecinkowa o pojedynczej precyzji IEEE, w natywnej dla tego komputera kolejnosci bajtow. double 64-bitowa liczba zmiennoprzecinkowa o podwojnej precyzji IEEE, w natywnej dla tego komputera kolejnosci bajtow. string Lancuch bajtow. Po okresleniu typu lancucha moze opcjonalnie wystapic opcja / oraz opcjonalnie zestaw flag /[bCcftTtWw]*. Szerokosc ogranicza liczbe znakow do skopiowania. Zero oznacza wszystkie znaki. Obslugiwane sa ponizsze flagi: b Wymusza test pliku binarnego. C Uzywa dopasowania niewrazliwego na wielkosc wielkich liter: wielkie litery w magii dopasuja zarowno male jak i wielkie litery w celu, natomiast male litery w magii dopasuja jedynie male litery w celu. c Uzywa dopasowania niewrazliwego na wielkosc malych liter: male litery w magii dopasuja zarowno male jak i wielkie litery w celu, natomiast wielkie litery w magii dopasuja jedynie wielkie litery w celu. Aby uzyskac dopasowanie calkowicie niewrazliwe na wielkosc liter, nalezy podac zarowno ,,c" jak i ,,C". f Wymaga, aby dopasowany lancuch byl pelnym slowem, a nie dopasowaniem czesci slowa. T Przycina lancuch, tzn. poczatkowe i koncowe biale znaki t Wymusza test pliku tekstowego W Kompaktuje biale znaki w celu, ktory musi zawierac przynajmniej jeden bialy znak. Jesli magia ma n kolejnych bialych znakow, cel musi miec przynajmniej n kolejnych bialych znakow, aby zostac dopasowanym. w Traktuje kazda spacje w magii jako opcjonalna. Jest ona usuwana przed wypisaniem lancucha. pstring Lancuch w stylu Pascala, gdzie pierwszy bajt/liczba typu short/liczba typu int jest interpretowany jako dlugosc bez znaku. Domyslna dlugoscia jest bajt i mozna go okreslic jako modyfikator. Obslugiwane sa nastepujace modyfikatory: B Dlugosc bajtu (domyslnie). H Dlugosc 2 bajtow big endian. h Dlugosc 2 bajtow little endian. L Dlugosc 4 bajtow big endian. l Dlugosc 4 bajtow little endian. J Dlugosc zawierajaca sie w swej liczebnosci. Lancuch nie konczy sie znakiem NUL. Zamiast bardziej wartosciowego ,,I" uzywane jest ,,J,,, poniewaz ten typ dlugosci jest cecha formatu JPEG. date Czterobajtowa wartosc, interpretowana jako data uniksowa. qdate Osmiobajtowa wartosc, interpretowana jako data uniksowa. ldate Czterobajtowa wartosc, interpretowana jako data w stylu uniksowym, ale interpretowana jako czas lokalny, a nie UTC. qldate Osmiobajtowa wartosc, interpretowana jako data w stylu uniksowym, ale interpretowana jako czas lokalny, a nie UTC. qwdate Osmiobajtowa wartosc interpretowana jako data w stylu windowsowym. msdosdate Dwubajtowa wartosc interpretowana jako data w stylu FAT/DOS. msdostime Dwubajtowa wartosc interpretowana jako czas w stylu FAT/DOS. beid3 32-bitowa dlugosc ID3 w kolejnosci bajtow big-endian beshort Wartosc dwubajtowa w kolejnosci bajtow big- endian. belong Wartosc czterobajtowa w kolejnosci bajtow big-endian. bequad Wartosc osmiobajtowa w kolejnosci bajtow big-endian. befloat 32-bitowa liczba zmiennoprzecinkowa o pojedynczej precyzji IEEE, w kolejnosci bajtow big-endian. bedouble 64-bitowa liczba zmiennoprzecinkowa o podwojnej precyzji IEEE, w kolejnosci bajtow big-endian. bedate Czterobajtowa wartosc w kolejnosci bajtow big-endian, interpretowana jako data uniksowa. beqdate Osmiobajtowa wartosc w kolejnosci bajtow big-endian, interpretowana jako data uniksowa. beldate Czterobajtowa wartosc w kolejnosci bajtow big-endian, interpretowana jako data w stylu uniksowym, ale interpretowana jako czas lokalny, a nie UTC. beqldate Osmiobajtowa wartosc w kolejnosci bajtow big-endian, interpretowana jako data w stylu uniksowym, ale interpretowana jako czas lokalny, a nie UTC. beqwdate Osmiobajtowa wartosc w kolejnosci bajtow big-endian, interpretowana jako data w stylu windowsowym. bemsdosdate Dwubajtowa wartosc w kolejnosci bajtow big- endian, interpretowana jako data w stylu FAT/DOS. bemsdostime Dwubajtowa wartosc w kolejnosci bajtow big- endian, interpretowana jako czas w stylu FAT/DOS. bestring16 Dwubajtowy lancuch unikodu (UCS16), w kolejnosci bajtow big-endian. leid3 32-bitowa dlugosc ID3 w kolejnosci bajtow little-endian leshort Wartosc dwubajtowa w kolejnosci bajtow little-endian. lelong Wartosc czterobajtowa w kolejnosci bajtow little-endian. lequad Wartosc osmiobajtowa w kolejnosci bajtow little-endian. lefloat 32-bitowa liczba zmiennoprzecinkowa o pojedynczej precyzji IEEE, w kolejnosci bajtow little-endian. ledouble 64-bitowa liczba zmiennoprzecinkowa o podwojnej precyzji IEEE, w kolejnosci bajtow little-endian. ledate Czterobajtowa wartosc w kolejnosci bajtow little-endian, interpretowana jako data uniksowa. leqdate Osmiobajtowa wartosc w kolejnosci bajtow little-endian, interpretowana jako data uniksowa. leldate Czterobajtowa wartosc w kolejnosci bajtow little-endian, interpretowana jako data w stylu uniksowym, ale interpretowana jako czas lokalny, a nie UTC. leqldate Osmiobajtowa wartosc w kolejnosci bajtow little-endian, interpretowana jako data w stylu uniksowym, ale interpretowana jako czas lokalny, a nie UTC. leqwdate Osmiobajtowa wartosc w kolejnosci bajtow little-endian, interpretowana jako data w stylu windowsowym. lemsdosdate Dwubajtowa wartosc w kolejnosci bajtow big- endian, interpretowana jako data w stylu FAT/DOS. lemsdostime Dwubajtowa wartosc w kolejnosci bajtow big- endian, interpretowana jako czas w stylu FAT/DOS. lestring16 Dwubajtowy lancuch unikodu (UCS16), w kolejnosci bajtow little-endian. melong Wartosc czterobajtowa w kolejnosci bajtow middle-endian (PDP-11). medate Czterobajtowa wartosc w kolejnosci bajtow middle-endian (PDP-11), interpretowana jako data uniksowa. meldate Czterobajtowa wartosc w kolejnosci bajtow middle-endian (PDP-11), interpretowana jako data w stylu uniksowym, ale interpretowana jako czas lokalny, a nie UTC. indirect Poczynajac od podanego przesuniecia, sprawdza ponownie baze danych magii. Przesuniecie magii indirect jest domyslnie przesunieciem absolutnym w pliku, ale mozna podac /r aby wskazac, ze przesuniecie jest wzgledne wobec poczatku wpisu. name Definiuje ,,nazwane" wystapienie magii, ktore mozna wywolac z innego wpisu magii use, jak wywolanie podfunkcji. Przesuniecia nazwanych wystapien bezposrednich magii sa wzgledem przesuniecia poprzednio dopasowanego wpisu, natomiast niebezposrednie przesuniecia sa liczone wzgledem poczatku pliku, jak zwykle. Nazwane wpisy magii sa zawsze dopasowywane. use Rekurencyjne wywoluje nazwana magie poczynajac od biezacego przesuniecia. Jesli nazwa odniesienia rozpoczyna sie od ^, to zamieniana jest kolejnosc bajtow magii; jesli magia wspominala np. leshort, jest traktowana jako beshort i na odwrot. Jest to przydatne, aby uniknac duplikowania regul dla roznych kolejnosci bajtow. regex Wyrazenie regularne w skladni rozszerzonych wyrazen regularnych POSIX (jak egrep). Przetworzenie wyrazen regularnych moze zajac wykladniczo wiecej czasu i ciezko przewidziec ich wydajnosc, zatem odradza sie ich uzywania. W srodowiskach produkcyjnych nalezy uwaznie sprawdzic ich wydajnosc. Nalezy tez ograniczyc rozmiar lancucha do przeszukania, podajac /, aby uniknac problemow z wydajnoscia przy skanowaniu dlugich plikow. Po okresleniu typu mozna opcjonalnie dodac /[c][s][l]. Flaga ,,c" czyni dopasowanie niewrazliwym na wielkosc znakow, natomiast ,,s" aktualizuje przesuniecie na poczatek przesuniecia dopasowania, zamiast jego koniec. Modyfikator ,,l" zmienia limit dlugosci, aby oznaczal on liczbe wierszy zamiast liczbe bajtow. Wiersze sa rozgraniczane przez ogranicznik zalezny od platformy. Gdy poda sie liczbe wierszy, obliczana jest tez niejawnie liczba bajtow zakladajac, ze kazdy wiersz ma 80 znakow. Jesli nie poda sie liczby bajtow ani wierszy, wyszukiwanie jest automatycznie ograniczane do 8KiB. ^ i $ dopasowuja poczatek i koniec poszczegolnych wierszy, a nie poczatek i koniec pliku. search Doslowny lancuch szukany od podanego przesuniecia. Mozna korzystac z tych samych flag modyfikujacych jak przy wzorcach lancuchowych. Wyszukiwane wyrazenie musi zawierac zakres w postaci /liczba, tj. liczbe pozycji, na ktorej dokonane beda proby dopasowania, zaczynajac od poczatkowego przesuniecia. Jest to wlasciwe przy wyszukiwaniu wiekszych wyrazen binarnych z roznymi przesunieciami, korzystajac z cytowania znakow specjalnych za pomoca \. Kolejnosc modyfikatorow i liczb nie ma znaczenia. default Zaprojektowane do uzycia z testem x (zawsze prawdziwym); nie ma typu. Dopasowuje, gdy inne testy na tym poziomie kontynuacji nic wczesniej nie dopasowaly. Za pomoca testu clear mozna wyczyscic dopasowane testy dla poziomu kontynuacji. clear Ten test jest zawsze prawdziwy i czysci flage dopasowania dla danego poziomu kontynuacji. Zaprojektowany do uzycia z testem default. der Przetwarza plik jako plik certyfikatu DER. Pole testowe sluzy jako typ der, ktory musi byc dopasowany. Wystepuja nastepujace 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 moze wystapic opcjonalny rozmiar numeryczny, ktory oznacza szerokosc pola w bajtach. guid Globalnie unikalny identyfikator (ang. Globally Unique Identifier - GUID), przetwarzany i wypisywany jako XXXXXXXX- XXXX-XXXX-XXXX-XXXXXXXXXXXX. Jest to format lancuchowy. offset Jest to wartosc typu quad wskazujaca aktualne przesuniecie pliku. Moze sluzyc do okreslenia rozmiaru pliku lub bufora magicznego. Przykladowe wpisy magiczne: -0 offset x ten plik ma %lld bajtow -0 offset <=100 musi miec wiecej niz 100 \ bajtow, a ma tylko %lld octal Lancuch oznaczajacy liczbe osemkowa. Ze wzgledu ma kompatybilnosc z Single UNIX Standard, okreslenia typu dC i d1 sa rownowazne byte, okreslenia typu uC i u1 sa rownowazne ubyte, okreslenia typu dS i d2 sa rownowazne short, okreslenia typu uS i u2 sa rownowazne ushort, okreslenia typu dI, dL, i d4 sa rownowazne long, okreslenia typu uI, uL, i u4 sa rownowazne ulong, okreslenie typu d8 jest rownowazne quad, okreslenie typu u8 jest rownowazne uquad, a okreslenie typu s jest rownowazne string. Dodatkowo okreslenie typu dQ jest rownowazne quad, a okreslenie typu uQ jest rownowazne uquad. Kazdy wzorzec magiczny najwyzszego poziomu (ponizej wyjasniono znaczenie poziomow) jest klasyfikowany jako tekstowy lub binarny, w zaleznosci od uzytego typu. Typy ,,regex" i ,,search" sa klasyfikowane jako tekstowe, chyba ze we wzorcu uzyto znakow niedrukowalnych. Wszystkie inne testy sa klasyfikowane jako binarne. Wzorzec najwyzszego poziomu uwaza sie za test tekstowy, jesli wszystkie jego wzorce sa wzorcami tekstowymi; w innym przypadku jest uwazany za wzorzec binarny. Przy dopasowywaniu pliku, jako pierwsze probowane sa wzorce binarne; jesli zaden nie zostanie dopasowany, a plik wyglada na tekstowy, to okreslane jest jego kodowanie i probowane sa wzorce tekstowe. Po typach numerycznych moze opcjonalnie wystapic & i wartosc numeryczna aby okreslic, ze wartosc ma byc zsumowana (AND) z wartoscia numeryczna przed dokonaniem jakiegokolwiek porownania. Wstawienie u przed typem oznacza, ze uszeregowane porownania maja byc dokonywane bez wzgledu na znak. test Wartosc, ktore ma byc porownywana z wartoscia z pliku. Jesli typ jest numeryczny, to wartosc jest podawana w postaci zgodnej z jezykiem C; jesli typ jest lancuchowy, to wartosc jest podawana jako lancuch jezyka C z dozwolonymi znakami specjalnymi (np. \n dla nowego wiersza). Wartosci numeryczne moga byc poprzedzone znakami okreslajacymi operacje, jaka ma zostac wykonana. Znakiem operacji moze byc =, okreslajacy, ze wartosc z pliku musi sie rownac wartosci podanej, <, okreslajacy, ze wartosc z pliku musi byc mniejsza od podanej, >, okreslajacy, ze wartosc z pliku musi byc wieksza od podanej, &, okreslajacy, ze wartosc z pliku musi miec wszystkie bity, ktore sa ustawione w podanej wartosci, ^, okreslajacy, ze wartosc z pliku musi miec wyzerowane wszystkie bity, ktore sa ustawione w podanej wartosci, lub ~, okreslajacy, ze podana wartosc ma zostac zanegowana przed przetestowaniem. x, okresla, ze pasowac moze dowolna wartosc. Jesli znak operacji jest pominiety, uzywany jest =. Operatory &, ^ i ~ nie dzialaja z liczbami zmiennoprzecinkowymi i typu double. Operator ! okresla, ze wiersz zostanie dopasowany jesli test nie powiedzie sie. Wartosci numeryczne sa podawane w postaci zgodnej z jezykiem C, np. 13 to liczba dziesietna, 013 to liczba osemkowa, a 0x13 to liczba szesnastkowa. Operacje numeryczne nie sa przeprowadzane na typach daty; wartosc numeryczna jest zamiast tego interpretowana jako przesuniecie. Dla wartosci lancuchowych, lancuch z pliku musi odpowiadac podanemu lancuchowi. Do lancuchow moga byc stosowane operatory =, < i > (lecz nie &). Dlugosc, uzywana do porownywania jest dlugoscia argumentu lancuchowego z pliku magicznego. Znaczy to, ze wiersz mozna dopasowac do dowolnego niepustego lancucha (zwykle uzywane do pozniejszego wypisania lancucha), stosujac >\0 (poniewaz wszystkie lancuchy sa wieksze od lancucha zerowego). Daty sa traktowane jako wartosci numeryczne w odpowiedniej wewnetrznej reprezentacji. Specjalny test x zawsze daje prawde. message Komunikat do wypisania, jesli porownanie powiedzie sie. Jesli lancuch zawiera okreslenie formatu printf(3), to wartosc z pliku (po dokonaniu ewentualnego podanego przeksztalcenia) jest wypisywana korzystajac z komunikatu jako lancucha formatu. Jesli lancuch zaczyna sie od ,,\b", wypisywany komunikat jest reszta lancucha bez dodanej przed nim spacji: wielokrotne dopasowania sa zwykle rozdzielone pojedyncza spacja. Tworce i typ APPLE w formacie 4+4 znakow mozna podac jako: !:apple CREATYPE Liste powszechnych rozszerzen plikow, rozdzielona ukosnikiem, mozna podac jako: !:ext rozsz[/rozsz...] tj. jako doslowny lancuch "!:ext", po ktorym nastepuje lista powszechnych rozszerzen plikow, rozdzielona ukosnikiem; np. dla obrazow JPEG: !:ext jpeg/jpg/jpe/jfif Typ MIME jest podawany w osobnym wierszu, ktory musi wystapic jako nastepny niepusty wiersz niebedacy komentarzem po wierszu magii identyfikujacym typ pliku; ma on nastepujacy format: !:mime TYPMIME tj. doslowny lancuch "!:mime", po ktorym nastepuje typ MIME. W osobnym wierszu mozna podac opcjonalna sile, ktora odnosi sie do aktualnego opisu magii; korzysta z nastepujacego formatu: !:strength ARG WARTOSC Argumentem ARG moze byc: +, -, * lub /; natomiast WARTOSC jest stala z przedzialu 0-255. Na aktualnie obliczonej domyslnej sile magii przeprowadzane jest dzialanie podane w argumencie, ktorego drugim elementem jest podana stala. Niektore formaty pliku zawieraja dodatkowe informacje, ktore beda wypisane razem z typem pliku lub wymagaja dodatkowych testow aby okreslic prawdziwy typ pliku. Te dodatkowe testy sa wprowadzane za pomoca jednego lub wielu znakow > poprzedzajacych przesuniecie. Liczba znakow > w wierszu okresla poziom testu; wiersz bez > na poczatku jest na poziomie 0. Testy sa ulozone w hierarchii drzewiastej: jesli test w wierszu na poziomie n powiedzie sie, wykonywane sa wszystkie kolejne testy na poziomie n+1, a komunikaty sa wypisywane jesli testy powioda sie, do momentu pojawienia sie wiersza na poziomie n (lub nizszym). W przypadku bardziej zlozonych plikow, mozna uzywac pustych komunikatow, aby uzyskac efektywna skladnie ,,jezeli/to", w nastepujacej postaci: 0 string MZ >0x18 uleshort <0x40 pl. wykonywalny MS-DOS >0x18 uleshort >0x3f rozsz. pl. wyk. PC (np. MS Windows) Przesuniecia nie musza byc stale, moga byc tez odczytywane ze sprawdzanego pliku. Jesli pierwszym znakiem po ostatnim > jest ( to lancuch po nawiasie jest interpretowany jako niebezposrednie przesuniecie. Oznacza to, ze liczba po nawiasie jest uzywana jako przesuniecie w pliku. Wartosc na jakiej przesuniecie jest odczytane, jest uzywana ponownie jako przesuniecie w pliku. Przesuniecia niebezposrednie maja postac (x [[.,][bBcCeEfFgGhHiIlmosSqQ]][+-][ y ]). Wartosc x sluzy jako przesuniecie w pliku. Bajt, dlugosci id3 short lub long jest odczytywany na tym przesunieciu, w zaleznosci od okreslenia typu [bBcCeEfFgGhHiIlLmsSqQ]. Wartosc jest traktowana jako ze znakiem, jesli podano ,,," lub bez znaku, jesli podano ,,.". Typy pisane wielka litera sa interpretowane jako wartosc big endian, a male litery reprezentuja wartosc liczbowa little endian; typ m interpretuje liczbe jako wartosc middle endian (PDP-11). Do tej liczby dodawana jest wartosc y, a wynik sluzy jako przesuniecie w pliku. Domyslnym typem, jesli sie go nie okresli, jest long. Rozpoznawane sa ponizsze typy: Typ Skrot 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 sposob mozna sprawdzic struktury o zmiennej dlugosci: # Pliki wykonywalne MS Windows sa tez prawidlowymi pl. wyk. MS-DOS 0 string MZ >0x18 uleshort <0x40 Wykonywalny MZ (MS-DOS) # pomin ponizszy blok, jesli 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 sposob ma swoje wady: trzeba sie upewnic, ze na koncu cos sie wypisze albo uzytkownicy moga otrzymac puste wyjscie (np. gdy w powyzszym przykladzie nie jest to ani PE\0\0 ani LE\0\0). Jesli nie da sie bezposrednio zastosowac tego niebezposredniego przesuniecia, mozliwe sa proste obliczenia: dolaczenie [+-*/%&|^]liczba wewnatrz nawiasow pozwala na modyfikacje wartosci odczytanej z pliku, zanim zostanie uzyta jako przesuniecie: # Pliki wykonywalne MS Windows sa tez prawidlowymi pl. wyk. MS-DOS 0 string MZ # czasem, wartosc na 0x18 ma mniej niz 0x40 lecz wciaz 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 dokladne przesuniecie nie jest znane, poniewaz zalezy ono od dlugosci lub pozycji (tam gdzie wczesniej uzywano przesuniec niebezposrednich) poprzednich pol. Mozna podac przesuniecie wzgledem konca ostatniego pola wyzszego poziomu za pomoca `&' stosowanego jako przedrostek przesuniecia: 0 string MZ >0x18 uleshort >0x3f >>(0x3c.l) string PE\0\0 Wykonywalny PE (MS-Windows) # po ktorym wystepuje podpis PE bedacy typem procesora >>>&0 leshort 0x14c dla Intel 80386 >>>&0 leshort 0x8664 dla x86-64 >>>&0 leshort 0x184 dla DEC Alpha Przesuniecia niebezposrednie i wzgledne mozna laczyc: 0 string MZ >0x18 uleshort <0x40 >>(4.s*512) leshort !0x014c Wykonywalny MZ (MS-DOS) # jesli to nie COFF, cofnij sie o 512 bajtow i dodaj przesuniecie # z bajtu 2/3, ktore stanowi inny sposob znalezienia poczatku # rozszerzonego pliku wykonywalnego >>>&(2.s-514) string LE Wykonywalny LE (ster. MS Windows VxD) Lub na odwrot: 0 string MZ >0x18 uleshort >0x3f >>(0x3c.l) string LE\0\0 Wykonywalny LE (MS-Windows) # na przesunieciu 0x80 (-4, poniewaz przesun. wzgledne zaczynaja sie od # konca dopasowania wyzszego poziomu) wewnatrz naglowka LE, znajdujemy # absolutne przes. do kodu obszaru, gdzie szukamy okreslonego podpisu >>>(&0x7c.l+0x26) string UPX \b, skompresowany UPX Lub podac oba! 0 string MZ >0x18 uleshort >0x3f >>(0x3c.l) string LE\0\0 Wykonywalny LE (MS-Windows) # na przesunieciu 0x58 w naglowku LE, znajdujemy przesuniecie wzgledne do # obszaru danych, gdzie szukamy okreslonego podpisu >>>&(&0x54.l-3) string UNACE \b, samorozp. sie archiwum ACE Jesli w pliku zachodzi koniecznosc radzenia sobie z duetami przesuniecie/dlugosc, z samego pliku mozna pobrac nawet druga wartosc w wyrazeniu w nawiasie, za pomoca kolejnego zestawu nawiasow. Prosze zauwazyc, ze to dodatkowe przesuniecie niebezposrednie jest zawsze wzgledem poczatku glownego przesuniecia niebezposredniego. 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 poczatek+dlugosc; # sa one zlokalizowane 14 i 10 bajtow po nazwie sekcji >>>>(&0xe.l+(-4)) string PK\3\4 \b, archiwum samorozp. ZIP Jesli ma sie liste znanych wartosci na okreslonym poziomie kontynuacji i chce sie udostepnic domyslny przypadek w postaci przelacznikowej: # wyczysc dopasowania danego poziomu kontynuacji >18 clear x >18 lelong 1 jeden >18 lelong 2 dwa >18 default x # wypisz domyslne dopasowanie >>18 lelong x niedopasowane 0x%x ZOBACZ TAKZE file(1) - polecenie odczytujace ten plik. USTERKI Formaty long, belong, lelong, melong, short, beshort i leshort nie zaleza od dlugosc typow danych C short i long na platformie, choc Single UNIX Specification implikuje, ze zaleza. Jednak poniewaz OS X Mountain Lion przeszedl zestaw walidacji Single UNIX Specification i dostarcza wersje file(1) w ktorej brak jest zaleznosci od rozmiarow typow danych C oraz ktora jest zbudowana dla srodowiska 64-bitowego, w ktorym long ma 8 bajtow, a nie 4, byc moze zestaw walidujacy nie sprawdza czy np. long odnosi sie to elementu o tym samym rozmiarze, co typ danych C long. Prawdopodobnie powinny wystepowac nazwy type takie jak int8, uint8, int16, uint16, int32, uint32, int64 i uint64 oraz warianty o okreslonej kolejnosci bajtow tychze, aby bylo jasne, ze typy te maja okreslona szerokosc. TLUMACZENIE Tlumaczenie niniejszej strony podrecznika: Przemek Borys , Andrzej Krzysztofowicz i Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3: https://www.gnu.org/licenses/gpl-3.0.html lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net Linux 6.19.10-arch1-1 27 listopada 2024 r. Linux 6.19.10-arch1-1