Bajt

Co prawda liczba binarna może mieć dowolną długość na przykład 1001110100010010110001000100011010, jednak współczesne procesory mogą działać jedynie na blokach o zwartej strukturze. Umówiono się zatem kiedyś dawno temu, że bity, będą grupowane w bajty. Bajt jest najmniejszą jednostką obsługiwaną przez procesor. Coś jak z taksówką, ośmioosobowym mikrobusem. Nawet jeśli chcemy pojechać sami, to i tak siedem siedzeń pojedzie pustych. Spróbujmy poprosić taksówkarza żeby wymontował te zbędne i że zapłacimy tylko 1/8 ceny. Tak samo zareagował by procesor poproszony o przetworzenie jednego bitu.

Bajt składa się z ośmiu bitów. Bit o najmniejszej wartości znajduje się z prawej strony. Mam nadzieję, że pamiętamy jeszcze tabelę z poprzedniej strony:

Pozycja87654321
Potęga2^72^62^52^42^32^22^12^0
Mnożnik1286432168421
Przykładowy bajt10011001
Przykładowa wartość12800168001

Jaka jest zatem największa wartość, jaką może mieć bajt? Abby odpowiedzieć na to pytanie wszystkie bity ustawiamy jako jedynki; największą liczbą będzie 1111 1111. Teraz musimy tylko dodać wszystkie wartości mnożnika:

1+2+4+8+16+32+64+128 = ?

Zgadza się, to 255.

Kolejne pytanie. Ile wartości może mieć bajt? 255? Nie. 256,

Bajt może mieć wartości z zakresu od 0 do 255 czyli 256. Zero też jest wartością. Warto o tym pamiętać. Jeżeli obudzimy w nocy informatyka śledczego krzycząc do niego “Bajt?” to odpowie automatycznie 255. Czasem jednak pytanie nie dotyczy najwyższej wartości ale liczbie wszystkich potencjalnych wartości jaką może mieć bajt – na przykład ile jednostek pamięci można zaadresować używając jednego bajta.

Bajt ma zatem wartość liczbową od 0 do 255 i może mieć 256 wartości. Wartości te można interpretować bezpośrednio, jako liczby, jednak można je również interpretować jako tekst, czas, tabelę konfiguracyjną itp. Wszystko zależy od tego w jakim kontekście bajt został użyty, czyli co programista miał na myśli.

Interpretację bajtu można często porównać do szyfrowania podstawieniowego. Na przykład kody ASCII:

ASCII_table

Programiści umówili się, że tekst kodowany będzie zgodnie z powyższą tabelą. Tabela znana jest wszystkim i każdy może konwertować liczby binarne na znaki ASCII. Jeżeli, jednak tabela utrzymana zostałaby w tajemnicy, byłby to typowy system szyfrowania podstawieniowego. Moglibyśmy bez trudu zamieszać wartościami ASCII w tabeli i stworzyć własny system szyfrowania. Nie trudźmy się jednak zbytnio, gdyż systemy podstawieniowe są dosyć łatwe do złamania dzięki analizie częstotliwości znaków.

Informatyk śledczy musi więc analizując wartość bajtu, interpretować to co programista miał na myśli. Bajt 0101 0001 może być na przykład dużą literą S, liczbą 123 lub konfiguracją ustawień z jakimi ma się uruchomić program.

Co ciekawsze, bajt 0011 0001, interpretowany bezpośrednio może być liczbą 61 a jako kod ASCII cyfrą 1, a raczej znakiem 1.

W bajcie można zapisać wartości od 0 do 255. Często to za mało do obliczeń jakie należy wykonać. Dlatego bajty łączy się w grupy:

  • Słowo (Word) – 2 bajty, czyli 16 bitów
  • Dword – 4 bajty, czyli 32 bity
  • Qword – 8 bajtów, czyli 64 bity

Istnieją większe jednostki, jednak, nie będę ich tutaj przytaczał. Deklarując zmienne podczas programowania w głównej mierze decydujemy właśnie ile bajtów powinna mieć zmienna (bajt, słowo, dword, qword) i jak powinna być interpretowana (liczba, data, czas). W przypadku zmiennych tekstowych długość będzie znacznie dłuższa niż powyższe jednostki i interpretowana jako ASCII lub inne kodowanie tekstu.

Endianizm

Teraz uwaga, wkraczamy na terytorium Indian. Poległ tutaj niejeden informatyk śledczy, dlatego należy zachować niezwykłą ostrożność, Chodzi o koncepcje Big Endian i Little Endian. W Big Endian duży Indianin idzie przodem a w Little Endian Mały, a dlaczego to poniżej.

Koncepcja endiańska dotyczy zapisów multibajtowych (Word, Dword, Quord). Spójrzmy na worda dziesiętnej liczby 258:

00000001 00000010

W lewym bajcie jedynka jest na pozycji z mnożnikiem 256, natomiast w prawym na pozycji z mnożnikiem  2. Razem daje to nam 258. Zgadza się? Proponuję sobie przeliczyć.

Co na to prawy bajt? “A dlaczego właściwie moje jedynki są mniej warte od lewego bajtu? Jakim prawem? To w lewym bajcie mnożnik powinien być jeden a w moim 512, czyli razem jesteśmy liczbą 513!”

Na to lewy bajt: “Jesteśmy przeliczani w systemie Big Endian – ja jestem z przodu, więc moje bity są ważniejsze. To ja jestem dużym Indianinem! Dlatego jesteśmy liczbą 258”

A wszystko to działo się na starym procesorze motoroli. Procesor je przeliczył i wyświetlił 258.

Minęło kilka lat i obydwa bajty spotkały się na procesorze x86, czyli typowym komputerze z procesorem Intela lub AMD, Procesor spojrzał na te same bajty, w tej samej kolejności i przeliczył, ku zaskoczeniu lewego bajtu na 513.

“Widzisz” – powiedział prawy bajt – “teraz to my jesteśmy na procesorze x86 i się chyba trochę skurczyłeś. Twoja prawa jedynka jest warta tylko jedynkę”.

Jak zatem widać w systemie Big Endian największy bajt (z największymi mnożnikami) znajduje się z przodu. W praktyce przód oznacza bajta, którego adres pamięci jest najmniejszy. Aplikacje do informatyki śledczej wyświetlą go z lewej strony ciągu worda, dworda lub quorda. Na przykład w qwordzie 4C 15 12 5F z przodu jest 4C.  Kalkulator Windows oraz większość aplikacji wyświetla liczby w systemie Big Endian, bez względu na to jak je oblicza procesor.  Głównie z tego względu, że system Big Endian jest bardziej intuicyjny dla człowieka, a przynajmniej takiego człowieka, który czyta z lewej do prawej i używa systemu dziesiętnego.

Większość komputerów które znamy obecnie, opartych na architekturach Intela i AMD, używa jednak systemów Little Endian. Przeliczając ręcznie znalezionego na dysku twardym qworda 4C 15 12 5F, zaczynamy zeliczanie od bajta 5F – to jego bity będą miały najmniejszy mnożnik.

Little Endian i Big Endian są zapisem odwrotnym. Jeżeli chcemy przeliczyć quorda Little Endian 4C 15 12 5F na przykład na system dziesiętny w kalkulatorze Windows należy wpisać 5F 12 15 4C.

Trzeba pamiętać, że “endianizm” w informatyce śledczej. jest konwencją związana z kolejnością bajtów a nie bitów. Bity będą zawsze uszeregowane będą w kolejności od najwyższego z lewej. Czyli Big Endian!  Oczywiście na to “zawsze” też należy wziąć sobie poprawkę.

Która koncepcja jest lepsza? Żadna. Endianizm pochodzi z podróży Guliwera. Liliputanie zaczynający jajko od grubszego końca to Big Endianie a od tego bardzie szpiczastego to Little Endianie.  Powodowało to tam ogromne spory polityczne. Dotyczy to wszystkich sytuacji gdzie zamiast kłócić się, lub dyskutować, lepiej rzucić monetą.

W informatyce teoria ta jest trochę myląca, gdyż za koniec (END) ciągu 4C 15 12 5F uznalibyśmy 5F. Little End oznacza małego na końcu, czyli intuicyjnie 5F, a jednak jest na odwrót. W Little Endian mały jest na początku. Z tego względu właśnie należy raczej pamiętać o małym Indianinie z przodu.

Heks

Wspominałem powyżej o heksie, czyli systemie szesnastkowym. Dla niewtajemniczonych wymaga on kilku słów wyjaśnienia. Heks to taki system liczb, gdzie każda cyfra może mieć 16 wartości od 0 do 15. Podstawą potęgi mnożnika jest liczba 16.

W systemie dziesiętnym mamy tylko 10 cyfr, od zera do dziewięciu. Jak zapisać cyfry 10-15 jednym znakiem? Używa się w tym celu liter od A do F.

A to 10 a F to 15, a oto wszystkie możliwe wartości:

Cyfry w heksieWartość dziesiętna
00
11
22
33
44
55
66
77
88
99
A10
B11
C12
D13
E14
F15

Najwyższą wartość jaką może mieć dwucyfrowa liczba szesnastkowa to 255. FF to właśnie 15*16 + 15 czyli 240+15 czyli 255. Brzmi znajomo? Tak – jeden bajt to właśnie 2 liczby szesnastkowe. Lewą literę nazywamy left nimble a prawą right nimble. Polskiego odpowiednika tej nazwy niestety nie ma.

Przykładowe dwa bajty 12 i 5F przedstawione są w poniższej tabeli. Czy bajty pokazane zostały w porządku Big Endian czy Little Endian?

Pozycja4321
Potęga16^316^216^116^0
Mnożnik4096256161
Przykładowe słowo - dwa bajty125F
Przykładowa wartość40965128015

To Big Endian gdyż bajt z przodu ma większe mnożniki.

Little Endian wyglądałoby tak:

Pozycja4321
Potęga16^316^216^116^0
Mnożnik1614096256
Przykładowe słowo - dwa bajty125F
Przykładowa wartość162204803840

W tekstach i raportach z informatyki śledczej często spotkamy się z liczbami. Na przykład liczbą 12. Bez dodatkowego wyjaśnienia, nie możemy mieć pewności czy jest ona zapisana w systemie dziesiętnym czy szesnastkowym. Ma to znaczenie gdyż w szesnastkowym oznaczałaby 18. A 18 w szesnastkowym? 24. A 24 w szesnastkowym? 36…

Wracając do liczby 12. Jeżeli autor tekstu chce przedstawić liczbę szesnastkową, a nie dziesiętną powinien użyć specjalnej notacji. Liczbę należy poprzedzić znakami 0x.

0x12 będzie oznaczało 12 w zapisie szesnastkowym a samo 12  w dziesiętnym. Zapis wywodzi się z programowania w języku C, jednak przyjął się również w normalnych tekstach.

Alternatywnie używa się zapisu z h na końcu liczby. 12h będzie oznaczało heksa.

Jeżeli zapisujemy ciąg tekstowy w heksie, poprzedzamy go ukośnikiem i x-em np \x12. W takim wypadku 12 należy zinterpretować zgodnie z kodowaniem tekstu, którym będzie domyślnie kod ASCII.  Na moim komputerze wyświetla się dla tego kodu znak ↕

Na koniec jeszcze sztuczka z ASCII. Kody ASCII można w Windowsie wpisywać bezpośrednio. \x12 to w dziesiętnym 18. Aby się upewnić proszę spojrzeć do powyższej tabeli ASCII. Aby wpisać ten znak należy wcisnąć i przytrzymać lewy ALT, wpisać na klawiaturze numerycznej 18 (cyfry z góry klawiatury nie będą działały) i puścić alt. Znak ASCII zostanie wygenerowany. Polecam wypróbowanie. Można tej sztuczki użyć na przykład do swoich haseł w celu użycia niestandardowych znaków.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *