Hex Edit - oczy programisty - Programowanie jest łatwe

Czasami programista zostaje postawiony w sytuacji, gdzie algorytm, nad którym pracuje, robi “coś” i nie da się tego czegoś wyświetlić w tradycyjny sposób (np. na ekranie konsoli). Cokolwiek by to nie było, jest to binarne, a wszystko co binarne można podejrzeć za pomocą heksadecymalnego edytora.

Edytor hexadecymalny- i wszystko staje się jasne Gdy już ochłoniemy po wydźwięku nazwy tego narzędzia, która jest równie "magiczna" jak to, co wyświetla sam edytor, skupmy się na idei, która się za nią kryje. Skrótowo (bo programiści je uwielbiają), "hex edit" służy do edycji danych binarnych, które są prezentowane w postaci heksadecymalnej, czyli szesnastkowej.

Krótkie przypomnienie o systemach liczbowych

O systemach liczbowych możesz poczytać w "Podręczniku do nierzeczywistości". Tutaj bardzo krótkie słowo wstępu. Rejestry procesora są stworzone tak, aby umożliwiały dostęp do komórki pamięci. Najmniejszą z nich jest bajt, czyli osiem bitów. Procesor, pomimo, że przetwarza bity, nie operuje bezpośrednio na nich tylko właśnie na bajtach. Jeden oktet (osiem bitów) to jeden bajt, nazywany również słowem (ang. “WORD”).

System szesnastkowy

System szesnastkowy pozwala zapisać wartości: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 (łącznie różnych wartości) za pomocą symboli, kolejno: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. Kolejne wartości tworzone są w sposób identyczny jak w przypadku dziesiętnym, gdy kończy się zakres cyfr jedności (9) i następuje "przepełnienie", które zapisujemy jako 0 poprzedzone jedynką (która symbolizuje rząd wartości dziesiętnych), czyli 10. Dla systemu heksadecymalnego, przepełnienie następuje po wystąpieniu wartości F, czyli wartość 16 jest zapisywana jako 10, kolejne przepełnienie zachodzi przy wartości 32, ponieważ 31 (dziesiętnie) to 1F (szesnastkowo) więc 32 (dziesiętnie) to 2F szesnastkowo. Jeden bajt jest w stanie pomieścić maksymalnie 255 wartości (od 0 do 255 daje to 256 wartości). W systemie szesnastkowym 255 (dziesiętnie) zapisywana jest jako FF. FF to maksymalna wartość jednego bajtu zapisana szestnastkowo (heksadecymalnie). Przyjmuje się oznaczenie 0x jako symbol poprzedzający wartości zapisane w systemie heksadecymalnym, np. 0x4B oznacza tyle samo co 4B. Po prostu łatwiej jest zrozumieć kontekst wartości, że jest to wartość liczbowa, a nie ciąg znaków (string/etykieta). Możliwe, że już spotkałeś się z takim zapisem.

Narzędzia z pomocą

Trudno jest przeglądać wartości binarne, które są po prostu ciągami zer i jedynek, zdecydowanie łatwiej jest ogarnąć wzrokiem wartości szesnastkowe, ponieważ jeden bajt jest reprezentowany przez maksymalnie dwa znaki alfanumeryczne. Używając 0 jako dopełnienie w przypadku wartości, od 0-F, otrzymujemy śliczne wydruki wartości binarnych (np. 0A czy 0x0A).

Hex edytor posiada zazwyczaj trzy podstawowe elementy widoku:

Widok takiego programu wygląda np. tak jak ten powyżej 0xED (taka gra słów, 0x- symbol hex oraz "ED", pierwsze litery od editor).

0xED - edytor hexadecymalny

Dodatkowo możemy spotkać także wartości, które oznaczają tzw. Offset, czyli odległość bajtu od początku pliku, który jest przeglądany. Jest to umieszczane po to, aby łatwiej poruszać się po pliku i namierzać poszczególne bajty. Np. mówiąc "offset 410" mamy na myśli 410 bajt od początku.

Poniżej rysunek z zaznaczonymi poszczególnymi elementami interface'u edytora. 0xED - opis interface'u

Zastosowanie

Potrzeba jest matką wynalazku, więc jeżeli zaczynasz programować to najprawdopodobniej hexeditor nie będzie Tobie potrzebny. Jego użyteczność pojawia się wtedy, gdy np. zapisujesz coś do pliku binarnie i chcesz zweryfikować, co w tym pliku się zapisało. Szczególnie użyteczne, gdy odczytujesz w programie wcześniej zapisany plik (np. zapis stanu gry, wyniki pomiarów, etc) i coś nie działa tak jak powinno. Wtedy szybki rzut okiem za pomocą edytora i wszystko staje się jasne.

Kolejne zastosowanie pojawia się wtedy, gdy np. pracujesz z danymi, których nie da się prezentować za pomocą znaków alfanumerycznych. Powiedzmy, robisz program graficzny. To, co widzisz na ekranie (grafika) jest prezentowane w pamięci komputera jako (w dużym uproszczeniu) bitmapa, czyli zbiór bajtów, który każdy z nich prezentuje osobny kolor pixela. Edytorem możesz podejrzeć poszczególne bajty kolorów wszystkich pixeli, a także zmieniać poszczególne wartości. Bywa tak, że zapisując dane bitmapy, bajty nie do końca układają się tak jak powinny i wynikiem jest plik graficzny, który jest daleki od zakładanego efektu. Taka anegdota- błędy graficzne są najwdzięczniejsze w świecie programowania, ich wyniki czasem tworzą naprawdę niesamowite kreacje, nierzadko ciekawsze niż pożądany efekt. Edytorem tekstu można sprawdzić poszczególne linie bitmapy i dowiedzieć się, że np. któraś iteracja pętli nie działa jak należy, co zdecydowanie ułatwia i przyspiesza poprawę algorytmu.

Błędy bitmap, czyli co może powstać, gdy algorytm nie działa dobrze

Przeglądając dziesiątki plików w edytorze, można szybko zauważyć powtarzające się wzorce. Początek pliku zawsze będzie taki sam dla konkretnego rodzaju rozszerzenia pliku. Pliki .png będą miały ciąg "PNG" zaczynający się od offsetu 1, a pliki .jpg będą charakteryzować się ciągiem "JFIF" od offsetu 6. To są tzw. sygnatury plików, które determinują ich format. W przypadku, gdy masz do czynienia z nieznanym plikiem, ponieważ brakuje mu rozszerzenia (ja nie potrafię żyć z ukrytymi rozszerzeniami), zawsze możesz posłużyć się edytorem hex i samemu rozpoznać z czym masz do czynienia.

Niektóre pliki, z którymi się spotkasz będą stricte binarne, bez określonego formatu. Za pomocą edytora możesz analizować strukturę pliku, i (mozolnie) odtworzyć znaczenie jego poszczególnych bajtów. Ta technika nosi nazwę "reverse engineering" czyli inżynieria odwrotna. Takie pojęcie ze świata hackerów.

Narzędzia

Edytorów jest sporo i tak jak w przypadku IDE, jest to wybór indywidualny. Niektóre środowiska posiadają wbudowane edytory hex albo posiadają odpowiednie wtyczki, które rozszerzają je o tę funkcjonalność.

Od siebie dodam, że pracują na MacOS X, korzystam x 0xED a będą na Ubuntu korzystałem z Bless Hex Editor.

Jaki jest Twoje ulubione narzędzie? Do czego szalonego wykorzystałeś edytor hexowy?

Dodano: 2018-02-13 09:01 przez Piotr Poźniak

narzędzia , hex edit , heksadecymalny , 0xED , system szesnastkowy , pliki binarne , procesor ,
Piotr Poźniak
O autorze:

Programuję od ponad 15 lat. Prowadzę software house. Angażuję i zachęcam wszystkich do programowania w ramach inicjatywy Programowanie jest łatwe.