Z tego, co rozumiem, kompilator tworzy plik binarny, który składa się z 1 i 0, które procesor może odczytać. Mam plik binarny, ale jak mogę go otworzyć, aby zobaczyć jedynki i zera? Edytor tekstów mówi, że nie można go otworzyć ...
PS Mam skompilowany plik binarny zestawu, który powinien być zwykłym kodem binarnym 1 i 0?
Odpowiedzi:
Według tej odpowiedzi przez Tyranid :
Aktualizacja
Według tej odpowiedzi przez Emilio Bool :
źródło
Różne osoby odpowiedziały na niektóre aspekty zapytania, ale nie na wszystkie.
Wszystkie pliki na komputerach są przechowywane jako 1 i 0. Obrazy, pliki tekstowe, muzyka, aplikacje wykonywalne, pliki obiektowe itp.
Wszystkie są zerami i jedynkami. Jedyna różnica polega na tym, że są one interpretowane różnie w zależności od tego, co je otwiera.
Gdy przeglądasz plik tekstowy przy użyciu
cat
, plik wykonywalny (cat
w tym przypadku) odczytuje wszystkie jedynki i zera oraz przedstawia je, konwertując je na znaki z odpowiedniego alfabetu lub języka.Kiedy przeglądasz plik za pomocą przeglądarki obrazów, bierze wszystkie jedynki i zera i zamienia je w obraz, w zależności od formatu pliku i pewnej logiki, aby wszystko wypracować.
Skompilowane pliki binarne nie różnią się, są przechowywane jako 1 i 0.
Odpowiedź arzyfex daje narzędzia do przeglądania tych plików na różne sposoby, ale czytanie pliku jako pliku binarnego dla dowolnego pliku na komputerze, podobnie jak wyświetlanie go w postaci ósemkowej, szesnastkowej lub ASCII, może nie mieć sensu w każdym tych formatów.
Jeśli chcesz zrozumieć, co robi wykonywalny plik binarny, musisz go wyświetlić w sposób pokazujący język asemblera (na początek), który możesz zrobić, używając:
objdump -d /path/to/binary
który jest deasemblerem, pobiera zawartość binarną i konwertuje ją z powrotem na asembler (który jest językiem programowania na bardzo niskim poziomie).
objdump
nie zawsze jest instalowany domyślnie, więc może być konieczne zainstalowanie go w zależności od środowiska Linux.Niektóre zewnętrzne czytanie.
Uwaga: jak wskazuje @Wildcard, należy pamiętać, że pliki nie zawierają znaków 1 i 0 (jak widać na ekranie), zawierają rzeczywiste dane liczbowe, poszczególne fragmenty informacji, które są albo na (1) lub wyłączone (0). Nawet ten opis jest jedynie przybliżeniem prawdy. Kluczową kwestią jest to, że jeśli znajdziesz przeglądarkę, która pokazuje jedynki i zera, nawet to nadal interpretuje dane z pliku, a następnie pokazuje znaki ASCII dla 0 i 1. Dane są przechowywane w formacie binarnym ( patrz link Numer binarny powyżej). Wpis wiki społeczności Pierre-Oliviera opisuje to bardziej szczegółowo.
źródło
cat
, plik wykonywalny (cat
w tym przypadku) odczytuje wszystkie jedynki i zera i przedstawia je, konwertując je na znaki z odpowiedniego alfabetu lub język."cat
nie robi tego; wszystko cocat
robi to zapisywanie bajtów na standardowe wyjście (chyba że używasz opcji „szkodliwych” ). Program terminala (i / lub sprzęt terminala, jeśli dotyczy, tj. Jego oprogramowanie układowe) określa sposób renderowania bajtów jako znaków, prawdopodobnie przy pomocy sterownika TTY.Na niskim poziomie plik jest kodowany jako sekwencja zer i jedynek.
Ale nawet programiści rzadko tam chodzą w praktyce.
Po pierwsze (i ważniejsze niż ta historia zer i jedynek) musisz zrozumieć, że wszystko, czym manipuluje komputer, jest kodowane liczbami .
Znak jest kodowany liczbą przy użyciu tabel zestawu znaków. Na przykład litera „A” ma wartość 65 po zakodowaniu za pomocą ASCII. Zobacz http://www.asciitable.com
Piksel jest kodowany za pomocą jednej lub więcej liczb (istnieje wiele formatów graficznych). Na przykład w standardowym formacie 3 kolorów żółty piksel jest kodowany jako: 255 dla czerwonego, 255 dla zielonego, 0 dla niebieskiego. Zobacz http://www.quackit.com/css/css_color_codes.cfm (wybierz kolor i zobacz komórki R, G i B)
Plik wykonywalny binarnie zapisywany jest w asemblerze; każda instrukcja montażu jest kodowana jako liczby. Na przykład instrukcja asemblacji
MOVB $0x61,%al
jest kodowana dwoma liczbami: 176,97 Patrz http://www.sparksandflames.com/files/x86InstructionChart.html (Każda instrukcja ma przypisany numer od 00 do FF, ponieważ używana jest notacja szesnastkowa, patrz poniżej)Po drugie : każda liczba może mieć wiele reprezentacji lub notatek .
Powiedz, że mam 23 jabłka.
Ale mogę też zrobić grupy 16 jabłek. Więc wezmę jedną grupę 16-osobową i 7 samotnych jabłek. W notacji szesnastkowej (tak nazywa się 16 podstawnikiem) napiszę: 17 (16 + 7). Aby odróżnić notację dziesiętną, notacja szesnastkowa jest zazwyczaj zapisywana z prefiksem lub sufiksem: 17h, # 17 lub 17 $. Ale jak reprezentować więcej niż 9 grup po 16 lub więcej 9 samych jabłek? Po prostu używamy liter od A (10) do F (15). Liczba 31 (jak w 31 jabłkach) jest zapisywana jako # 1F w systemie szesnastkowym.
Na tej samej linii możemy zrobić grupę dwóch jabłek. (I grupa dwóch grup dwóch jabłek, tj. Grupa 2x2 jabłek i tak dalej). Zatem 23 to: 1 grupa-2x2x2x2-jabłek, 0 grupa-2x2x2-jabłek, 1 grupa-2x2x-jabłek, 1 grupa 2 jabłek i 1 samotne jabłko, które zostanie odnotowane 10111 w systemie dwójkowym.
(Zobacz https://en.wikipedia.org/wiki/Radix )
Fizycznie mechanizmy pozwalające na dwa stany (przełączniki) są łatwe do wykonania, jak również na dysku, który jest w pamięci.
Dlatego dane i programy, traktowane jako liczby, są zapisywane i przetwarzane w formie binarnej.
Następnie przetłumaczone - w zależności od typu danych - na odpowiednią formę (litera A, żółty piksel) lub wykonane (instrukcja MOV).
hexdump
wyświetla liczby kodujące dane (lub program asemblacyjny) w postaci szesnastkowej. Następnie można użyć kalkulatora, aby uzyskać odpowiednią formę binarną.źródło
Zaczynam od
od
(zrzut ósemkowy) i, w zależności od systemu, mogą znaleźćobjdump
przydatne narzędzia .źródło
Możesz go otworzyć w edytorze szesnastkowym, który pokazuje go jako ciąg wartości szesnastkowych.
xxd file
Co próbujesz osiągnąć
źródło
bvi
jest edytorem Binary VIsual z skrótami klawiszowymi vim. Jest dostępny w większości systemów Linux.źródło
Komenda Linux strings drukuje ciągi znaków do wydrukowania w plikach, np .:
itp ... jest o wiele bardziej czytelny niż binarny.
źródło
strings
polecenie usunie większość bajtów, które chce zobaczyć.strings
polecenie - zwłaszcza o dłuższej długościstrings -n 6
- naprawdę pomaga dowiedzieć się, co zawiera plik binarny, jeśli zawiera on stałe ciągów itp. Ta odpowiedź powinna być komentarzem, a następnie było dobrze.strings
przydatności polecenia, tylko fakt, że nie odpowiada tutaj pytanie OP.Ważna część, o której nadal się mylisz: Wartości szesnastkowe to po prostu inna reprezentacja wartości binarnych. Większość edytorów szesnastkowych lub zrzutów szesnastkowych wyświetla wartości w bazie szesnastkowej, ponieważ jest ona bardziej czytelna niż w bazie binarnej.
Na przykład:
Dwójkowy:
Czyli 35 i 32 w systemie dziesiętnym
Również 35 i 32 w systemie dziesiętnym
źródło
vim
zainstalowaćxxd
.Możesz wyświetlić plik w formacie binarnym w
vim
:vim
:% !xxd -b
xxd
Polecenie to może być modyfikowane dalej, na przykład:-g4
, który zgrupuje bity w pakietach 32-bitowych-c4
, który sformatuje dane wyjściowe, aby mieć 4 bajty na linięDodanie obu powyższych flag da jedną 32-bitową liczbę całkowitą na linię.
źródło
Możesz to zrobić np. Za pomocą tej rubinowej jednowarstwowej:
Tradycyjny system oparty na C ma kiepską obsługę wysyłania plików w formacie binarnym, AFAIK. Zwykle nie jest bardzo przydatny, ponieważ jest trudny do odczytania w przeciwieństwie do zrzutów szesnastkowych.
źródło
%08b
powoduje zgrupowanie danych wyjściowych w bajty.GHex jest twoim przyjacielem :)
Możesz zainstalować go za pomocą wiersza poleceń
Ubuntu:
Fedora:
źródło