İkili dosya nasıl görüntülenir?


45

Anladığım kadarıyla, derleyici bir CPU'nun okuyabileceği 1 ve 0'lardan oluşan bir ikili dosya oluşturur. İkili dosyam var ancak 1 ve 0'ları orada görmek için nasıl açarım? Bir metin editörü açamadığını söylüyor ...

PS 1 ve 0'lı düz ikili kod olması gereken bir derleme derlenmiş ikili var mı?


1
bir ikili dosya görüntülediğinizde ascii karakter olarak göreceksiniz
mazs


no - OP belirtilen "montaj derlenmiş ikili". Bu soruya değinmiyor. Mesela bu bir müzik dosyası değil ve yapısı var. OP ek bilgi sağlamadıkça, yapılandırılmamış bir araç başlangıç ​​noktasıdır.
Thomas Dickey

1
Cevabımı gör. İkilik teriminin pratikte tamamen farklı iki şekilde kullanıldığı konusunda uyarılmalıdır: "İkili dosya", içeriği saf ASCII-metni olmayan bir dosya anlamına gelir. "İkili sayı", ikili biçimini kullanarak yazılmış bir sayı anlamına gelir.
Pierre-Olivier Vares

@mazs ASCII? UTF-8'in daha muhtemel olduğunu düşünüyorum, ya da programın bu şekilde bir yöntemle kodlanmış gibi göründüğünü düşünürse bir kısım kod sayfası.
JDługosz

Yanıtlar:


99

Göre bu cevap ile tyranid :

hexdump -C yourfile.bin 

Tabii düzenlemek istemiyorsanız. Çoğu Linux dağıtımı hexdumpvarsayılan olarak var (ancak elbette hepsi değil).


Güncelleme

Göre bu cevap ile Emilio Bool :

xxd hem ikili hem de onaltılık yapar

Çöp kutusu için:

xxd -b file

Altıgen için:

xxd file

Bu gerçekten yardımcı oldu! Teşekkür ederim
Shravya Boggarapu

45

Çeşitli insanlar sorgunun bazı yönlerini cevapladı, fakat hepsini değil.

Bilgisayarlardaki tüm dosyalar 1 ve 0 olarak depolanır. Resimler, metin dosyaları, müzik, çalıştırılabilir uygulamalar, nesne dosyaları vb.

Hepsi 0 ve 1'dir. Tek fark, onları neyin açtığına bağlı olarak farklı yorumlamalarıdır.

Kullanarak bir metin dosyasını görüntülediğinizde cat, çalıştırılabilir ( catbu durumda) tüm 1 ve 0'ları okur ve bunları ilgili alfabe veya dilinizden karakterlere dönüştürerek size sunar.

Bir resim görüntüleyiciyi kullanarak bir dosyayı görüntülediğinizde, tüm 1 ve 0'ları alır ve dosyanın biçimine ve hepsini çözmek için bazı mantıklara bağlı olarak bunları bir görüntüye dönüştürür.

Derlenmiş ikili dosyalar farklı değildir, 1'ler ve 0lar olarak depolanırlar.

arzyfex'in cevabı, bu dosyaları farklı şekillerde görüntülemek için araçlar sunar, ancak bir dosyayı bilgisayardaki herhangi bir dosya için, sekizlik, onaltılık veya ASCII olarak görüntülemek gibi, her biri için mantıklı olmayabilir gibi okumak için kullanılır. bu formatların.

Yürütülebilir bir ikili dosyanın ne yaptığını anlamak istiyorsanız, onu kullanarak yapabileceğiniz assembler dilini (başlangıç ​​olarak) gösterecek şekilde görüntülemeniz gerekir.

objdump -d /path/to/binary

Bu bir sökme işlemidir, ikili içeriği alır ve tekrar birleştirme programına dönüştürür (ki bu çok düşük seviyeli bir programlama dilidir). objdumpher zaman varsayılan olarak yüklenmez, bu nedenle Linux ortamınıza bağlı olarak yüklenmesi gerekebilir.

Bazı harici okumalar.

Not: @Wildcard'ın işaret ettiği gibi, dosyaların 1 ve 0 karakterlerini içermediğine dikkat edin (bunları ekranda gördüğünüz gibi), gerçek sayısal verileri, ya da (1) 'deki özel bilgi bitlerini içerir. veya kapalı (0). Bu tanım bile, sadece gerçeğin bir tahminidir. Buradaki kilit nokta, size 1 ve 0'ları gösteren, hatta hala dosyadaki verileri yorumlayan ve ardından ASCII karakterlerini 0 ve 1 için gösteren bir görüntüleyici bulursanız, veriler ikili biçimde depolanır. Yukarıdaki İkili sayı bağlantısına bakınız). Pierre-Olivier'in topluluk wiki girişi bunu daha ayrıntılı olarak ele alıyor.


İyi teşhir Sen bir metin satırı karakterler gördüğünüz eklemek isteyebilir "1" veya "0" olan değil tek bir "1" veya bilgisayar tarafından "0" olarak depolanan; OP'nin bu konuda bir karışıklığı var gibi görünüyor.
Joker

1
"Kullanarak bir metin dosyası görüntülediğinizde cat, çalıştırılabilir ( catbu durumda) tüm 1 ve 0'ları okur ve bunları ilgili alfabenizdeki karakterlere dönüştürerek size sunar. dil." catbunu yapmaz; bunların hepsi catstandart çıktıya bayt yazmaktır ( "zararlı" seçenekleri kullanmıyorsanız ). Terminal programı (ve / veya eğer varsa, donanım yazılımı) terminal donanımı, muhtemelen TTY sürücüsünün yardımı ile baytların karakter olarak nasıl oluşturulacağını belirler.
G-Man

Katılmıyorum, ama bir noktada, tüm basit açıklamalar bozuldu, soru, basitçe tanımlamayı bırakmadan önce tavşan deliğinin ne kadar altına indiğinizdir.
EightBitTony

14

Düşük seviyede, bir dosya 0 ve 1 dizileri olarak kodlanır .

Ancak programcılar bile pratikte oraya nadiren gider.

Öncelikle (ve 0 ve 1'lerin bu hikayesinden daha önemli), bilgisayarın manipüle ettiği her şeyin sayılarla kodlanmış olduğunu anlamanız gerekir .

  • Bir karakter, karakter kümesi tablolarını kullanarak bir numara ile kodlanır. Örneğin, 'A' harfi, ASCII kullanılarak kodlandığında 65 değerindedir. Http://www.asciitable.com adresine bakın.

  • Bir piksel bir veya daha fazla sayıyla kodlanır (Çok sayıda grafik formatı vardır) Örneğin, standart 3 renk biçiminde sarı bir piksel şu şekilde kodlanır: Kırmızı için 255, Yeşil için 255, Mavi için 0. Bkz http://www.quackit.com/css/css_color_codes.cfm (bir renk seçim ve R, G ve B hücreleri bakınız)

  • İkili çalıştırılabilir dosya Assembly'de yazılmıştır; Her montaj talimatı sayı olarak kodlanmıştır. Örneğin, montaj talimatı MOVB $0x61,%aliki sayı ile kodlanmıştır: 176,97 Bkz. Http://www.sparksandflames.com/files/x86InstructionChart.html (Onaltılık gösterim kullanıldığından, her bir talimatın 00 ile FF arasında ilişkili bir numarası vardır, aşağıya bakınız)

İkincisi : Her numara birden fazla gösterime veya gösterime sahip olabilir .

Diyelim ki 23 elmam var.

  • Eğer on elmanın grubunu yaparsam, alacağım: 2 grup on ve 3 yalnız elmanın. 23: 2 (onlarca), sonra 3 (birim) yazarken tam olarak kastediyoruz.
  • Ama aynı zamanda 16 elmanın grubunu da yapabilirim. Bu yüzden 16 kişilik bir grup ve 7 yalnız elma alacağım. In onaltılık (16 radix denilen nasıl en o), ben yazacağım gösterimde: 17 (16 + 7). Ondalık gösterimden ayırmak için, onaltılık gösterim genellikle bir önek veya sonek ile belirtilir: 17h, # 17 veya 17 $. Fakat 9'dan 16 kişilik bir gruptan veya 9 yalnız elmadan daha fazlasının nasıl temsil edileceği? Basitçe, A (10) - F (15) arasındaki harfleri kullanıyoruz. 31 sayısı (31 elmada olduğu gibi) onaltılı olarak # 1F olarak yazılmıştır.

  • Aynı satırda, iki elmalı grup yapabiliriz. (Ve iki grup iki elmadan, yani 2x2 elma grubundan oluşan grup). Öyleyse 23: 1 grup-2x2x2x2-elma, 0 grup-2x2x2-elma, 1 grup-2x2-elma, 1 grup 2 elma, ve iki tane de 10111 olarak belirtilecek olan 1 yalnız elma.

(Bkz. Https://en.wikipedia.org/wiki/Radix )

Fiziksel olarak, iki durumun (anahtarların) yapılmasına izin veren mekanizmaların hafızada depolandığı diskte olduğu gibi kolayca yapılabiliyor.

Bu nedenle, sayılar olarak görülen veri ve programlar, ikili biçimlerde yazılır ve manipüle edilir.

Ardından - veri türüne bağlı olarak - uygun biçimlerine (A harfi, sarı piksel) veya yürütülür (MOV komutu).

hexdumpVerileri (veya montaj programını) kodlayan sayıları onaltılık biçimde listeler. İlgili ikili formu almak için bir hesap makinesi kullanabilirsiniz.



4

Bir onaltılık değer dizisi olarak gösteren bir hex editöründe açabilirsiniz. xxd file

Ne yapmaya çalışıyorsun?


Fakat bilgisayarın sadece 1 ve 0 okuyabildiğini düşündüm. Bunları görebilir miyim? Bilgisayarların nasıl çalıştığını anlamaya çalışıyorum
Martin Zeltin

2
Yalnız bu size pek yardımcı olmaz. Tam olarak nasıl çalıştığını öğrenmek istiyorsanız, bir Linux kutusundaki ELF dosya biçimine ve en.wikipedia.org/wiki/X86_instruction_listings dosyasına bakın . Sadece derleyici tarafından oluşturulan kodu görmek istiyorsanız, onu gdb ile çalıştırmaya bakın. Daha "düşük seviye" almak istediğiniz için, nand2tetris.org adresini de inceleyin. Assembly dili için, 6502 ve mips meclisinin x86_64 / x86 meclisinden çok daha güzel olduğunu
duydum

@ theblazehen Modern x86 aile montajcısı bir canavardır. 8086 yönetilebilirdi ve bence o dönemden (1970'lerin sonundan 1980'lerin ilk yarısına kadar) herhangi bir CPU'yu montajcıya kadar dayanılabilir olması gerektiğini düşünüyorum.
CVn

4

bvivim keybindings ile İkili VIsual editörüdür. Çoğu linux sistemde bulunur.

görüntü tanımını buraya girin


3

Linux dizeleri komutu, yazdırılabilir karakterlerin dizelerini dosyalarda yazdırır, örneğin:

$ strings /usr/bin/gnome-open 
/lib64/ld-linux-x86-64.so.2
3;o:)
libgnome-2.so.0
_ITM_deregisterTMCloneTable
g_object_unref
gmon_start__
g_dgettext
_Jv_RegisterClasses
g_strdup
_ITM_registerTMCloneTable
g_error_free
gnome_program_init
libgnome_module_info_get
libgio-2.0.so.0
g_ascii_strncasecmp

vs ... ikiliden daha okunaklı.


OP, orada 1'leri ve 0'ları görmek için nasıl açacağımı sordu. ancak stringskomut görmek istediği baytların çoğunu kaldıracak.
jlliagre

jlliagre - haklıyken, stringskomut - özellikle daha uzun uzunluklu strings -n 6- gerçekten herhangi bir dize sabiti, vs. içeriyorsa, bir ikili dosyanın içinde ne olduğunu bulmakta gerçekten yardımcı olur. iyi olmuş.
Joe,

@Joe Evet, stringskomutun kullanışlılığını sorgulamıyorum , sadece OP sorusunu yanıtlamaması gerçeğini.
jlliagre

3

Hala kafanız karışmış gibi görünen önemli bir bölüm: Onaltılık değerler sadece ikili değerlerin farklı bir gösterimidir. Çoğu hex editörü veya hexdumps onaltılık bazda değerleri gösterecektir, çünkü bu ikili tabandan daha okunaklıdır.

Örneğin:

İkili:

xxd -b README.md                                                                
00000000: 00100011 00100000

35 ve 32 olan ondalık

xxd README.md                                                                   
00000000: 2320

Ayrıca 35 ve 32 ondalık


Diğer insanlar bundan bahsetti. Ancak, bu iyi bir özetidir. İlk paragrafı değiştirmek isterseniz, cevabınızı düzenleyebilirsiniz.
wizzwizz4

Çok iyi, bundan bahseden kimseyi görmedim, kaçırmış olabilirim.
Perşembe Gelecek

Kullanmak için vimyüklü olması gerektiğini unutmayın xxd.
starbeamrainbowlabs

2

Dosyayı şu şekilde ikili dosyada görebilirsiniz vim:

  • Dosyanın açılması vim
  • girme :% !xxd -b

xxdKomut, örneğin, daha fazla ince ayara tabi tutulabilir:

  • Ekleyerek -g4, bitleri 32 bitlik paketler halinde gruplandıracak
  • -c4Çıktıyı biçimlendiren, satır başına 4 bayt olacak şekilde ekleyerek

Yukarıdaki bayrakların her ikisini de eklemek, her satıra 32 bit tam sayı verir.


1

Örneğin, bu yakut tek astar ile yapabilirsiniz:

$ ruby -e 'while c=STDIN.read(1); printf "%08b" % c.bytes.first; end'

Geleneksel C tabanlı sistem ikili AFAIK’te eşyaların çıkışı için berbat bir desteğe sahip. Onaltılık dökümlerin aksine okumak oldukça zor olduğu için genellikle çok kullanışlı değildir.


Teşekkürler! Hemen ardından bir boşluk eklemek %08b, çıktının bayt olarak gruplanmasına neden olur.
starbeamrainbowlabs

0

GHex arkadaşınız :) Ubuntu
komut satırını kullanarak kurabilirsiniz

:

sudo apt-get install ghex

Fedora:

sudo yum yüklemek ghex

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.