Linux'ta İkili Dosyalar Nasıl Karşılaştırılır

Yayınlanan: 2022-08-20
Bir bash istemi gösteren Linux dizüstü bilgisayar
fatmawati achmad zaenuri/Shutterstock.com

İki Linux ikili dosyasının aynı olup olmadığını nasıl kontrol edebilirsiniz? Yürütülebilir dosyalarsa, herhangi bir farklılık istenmeyen veya kötü niyetli davranış anlamına gelebilir. Farklı olup olmadıklarını kontrol etmenin en kolay yolu burada.

İkili Dosyaları Karşılaştırma

Linux, metin dosyalarını karşılaştırma ve analiz etme açısından zengindir. diff komutu sizin için iki dosyayı karşılaştıracak ve farklılıkları vurgulayacaktır. Hatta değiştirilen satırların etrafında bir bağlam sağlamak için değişikliklerin her iki tarafında birkaç satır sağlayabilir. Ve colordiff komutu, farklılıkları görsel olarak ayrıştırmayı daha da kolaylaştırmak için renk ekler.

Geliştiriciler ve yazarlar, program kaynak kodu dosyalarının veya taslak metinlerin farklı sürümleri arasındaki farkları vurgulamak için diff kullanır. Hızlı ve kolaydır ve metin dizeleri arasındaki farkları görmek için herhangi bir teknik beceriye ihtiyacınız yoktur.

İkili dosyalar dünyasında işler o kadar basit değil. İkili dosyalar düz metinden oluşmaz. Sayısal değerler içeren birçok bayttan oluşurlar. TAR arşivi veya ZIP dosyası gibi sıkıştırılmış bir dosyaysa, bu değerler dosyaların açılması ve çıkarılması için gerekli sembol tablolarıyla birlikte arşiv dosyasında saklanan sıkıştırılmış dosyaları temsil eder.

Linux Terminalinde İki Metin Dosyası Nasıl Karşılaştırılır
İLGİLİ Linux Terminalinde İki Metin Dosyası Nasıl Karşılaştırılır

İkili dosya yürütülebilir bir dosyaysa, dosyanın baytlarının sayısal değerleri, CPU, meta veriler, etiketler veya kodlanmış veriler için makine kodu talimatları gibi şeyler olarak yorumlanır. İkili dosyada veya kitaplık dosyasında yapılan değişiklikler, ikili dosya başka bir uygulama tarafından çalıştırıldığında veya kullanıldığında davranış farklılıklarına neden olabilir.

Bir dosyanın oluşturulma veya değiştirilme tarihini ve saatini taklit etmek kolaydır. Bu, bir dosyanın aynı ada, dosya boyutuna (değişiklikler bayt için mevcut içerik baytını değiştirirse) ve tarih damgalarına sahip iki sürümü olabileceği anlamına gelir. Yine de, dosyalardan biri değiştirilmiş olabilir.

Güvenli Hash Algoritmaları

Güvenli bir karma algoritma, matematik tabanlı bir algoritmadır. Bir dosyadaki tüm baytları tarayarak ve karma değeri oluşturmak için bunlara matematiksel bir dönüşüm uygulayarak 64 bitlik bir değer oluşturur. Herhangi bir günde, aynı dosya her zaman aynı hash'i üretecektir. Bir baytlık bir fark bile, kökten farklı bir karma ile sonuçlanacaktır.

İndirme sayfasında görüntülenen bir dosyanın karmasını sık sık görürsünüz. İndirdikten sonra dosya için bir karma oluşturmalısınız. Web sayfasında görüntülenen karmadan farklıysa, dosyanın güvenliğinin ihlal edildiğini bilirsiniz. İnsanların kusurlu dosyayı indirmesini sağlamak için ya kurcalanmış ve orijinal dosyanın yerine geçmiştir ya da aktarım sırasında bozulmuştur.

Test bilgisayarımızda aynı dosyanın iki kopyası var, paylaşılan bir kitaplık. Dosyalar, aynı dizinde olabilmeleri için yeniden adlandırıldı. Teoride, bu dosyalar aynı olmalıdır. Sonuçta, paylaşılan kitaplığın aynı sürümü olmaları gerekiyordu.

 ls -l *.so 

Aynı görünen iki ikili dosya

Dosyalar aynı boyuta, aynı tarih damgalarına ve aynı zaman damgalarına sahiptir. Sıradan bir gözlemciye, aynı görüneceklerdir. sha256sum komutunu kullanalım ve her dosya için bir hash üretelim.

 sha256sum binary_file1.so
 sha256sum binary_file2.so 

İki ikili dosya için karma oluşturma

Karma değerleri tamamen farklıdır, bu açıkça iki dosya arasında farklılıklar olduğunu gösterir. Web sitesi orijinal dosyanın karmasını gösteriyorsa, eşleşmeyen dosyayı atabilirsiniz.

Farklılıkları Bulma

Değişikliklere bakmak isterseniz, bunu yapmanın da yolları var. Değişiklikleri görmek için dosyayı yeniden derleyebilmeniz veya derleme veya makine kodunu anlamanız gerekmez. Bu değişikliklerin ne anlama geldiğini ve amaçlarının ne olduğunu anlamak elbette daha derin teknik bilgi gerektirecektir. Ancak, değişikliklerin ne kadar önemli olduğunu bilmek, dosyaya ne olduğunun göstergesi olabilir.

İki ikili dosyada diff kullanırsak, biraz ezici bir yanıt alırız.

 diff binary_file1.so binary_file2.so 

diff'i iki ikili dosyayla kullanmak çok az bilgi verir

Dosyaların farklı olduğunu zaten biliyorduk. cmp deneyelim.

 cmp binary_file1.so binary_file2.so 

cmp'yi iki ikili dosyayla kullanmak biraz daha fazla bilgi verir, ancak çok fazla değil

Bu bize biraz daha fazlasını anlatıyor. İki dosya arasında farklılık gösteren ilk bayt, bayt numarası 13451'dir. Yani, ikili dosyanın başlangıcından itibaren sayılan bayt 13451, iki ikili dosyada farklıdır. Yani 13451, dosyanın başlangıcından itibaren ilk farkın ofsetidir.

Şans eseri, dosya boyunca, 0x10'un onaltılık değerini içeren baytlar olacaktır. Bu, Linux'un metin dosyalarında satır sonu karakteri olarak kullandığı değerdir. cmp komutu, ikili dosyanın başlangıcı ile ilk farkın konumu arasında bu değerle 131 baytla karşılaştı. Yani 132. hatta olduğunu düşünüyor. Bu bağlamda gerçekten hiçbir şey ifade etmiyor.

-l (ayrıntılı) seçeneğini eklersek faydalı bilgiler almaya başlayacağız.

 cmp -l binary_file1.so binary_file2.so 

Değiştirilen baytları listelemek için -l seçeneğini cmp ile kullanma

Tüm farklı baytlar listelenir. Bayt numarası veya ofset, ilk dosyadaki değer ve ikinci dosyadaki değer, çıktı satırı başına bir bayt olacak şekilde gösterilir.

Bayt değerleri, ikili dosyalarda kullanılan olağan onaltılık biçim yerine sekizli olarak gösterilir. Bununla birlikte, bir şey daha öğrendik. Değiştirilen tüm baytlar tek bir sürekli sıradadır. Ofsetleri her bayt için bir artırılır.

hexdump aracı, terminal penceresine bir ikili dosya atar. -C (kurallı) seçeneğini kullanırsak, çıktı her satırda ofseti, o ofsette 16 baytlık değerleri ve eğer varsa, bayt değerlerinin ASCII temsilini listeler.

 hexdump -C binary_file1.so 

Bir ikili dosyanın hexdump kurallı çıktısı

hexdump çıktısını diff için girdi olarak kullanabilir ve diff iki metin dosyasını okuyormuş gibi çalışmasına izin verebiliriz.

 diff <(hexdump binary_file1.so) <(hexdump binary_file2.so) 

İki dosya arasındaki farkları elde etmek için diff ve hexdump kullanma

diff , farklı olan satırları bulur ve ilk dosyadaki onaltılık bayt değerlerini ikinci dosyadaki değerlerin üzerinde gösterir. İlk satırın ofseti 0x3480 veya ondalık olarak 13440'tır. Daha önce, cmp bize ilk değişikliğin 0x348B olan 13451 baytında meydana geldiğini söyledi. Bu aslında burada gördüğümüzle eşleşiyor.

diff çıktısı iki baytlık bloklar halindedir. İlk bayt çifti, 0x3480 ofsetinden 0 ve 1 baytlarıdır, ikinci blok ofsetten 2 ve 3 baytlarını tutar. Blok 6, bayt 0xA ve 0xB'yi veya ondalık olarak 10 ve 11'i tutacaktır. Bunlar 13450 ve 13451 baytlarıdır. Ve onların farklılık gösteren ilk baytlar olduğunu görebiliriz. İlk beş bayt çifti her iki dosyada da aynıdır.

Ancak diff sıfır tabanından sayıldığından, cmp 13451 olarak adlandırdığı şey diff için bayt 13540 olacaktır. Ve işleri daha da kafa karıştırıcı hale getirmek için, her iki baytlık bloktaki bayt sırası diff tarafından tersine çevrilir. Baytlar aslında şu sırayla listelenir: 1 ve 0, 3 ve 2, 5 ve 4, 7 ve 6, vb.

Komut aynı zamanda hesaplama açısından da pahalıdır; özellikle karşılaştırılan dosyalar büyükse, aynı anda iki hexdumps ve bir diff .

Ancak hexdump -C , ikili dosyanın ASCII sürümünü terminal penceresine gönderebiliyorsa, neden çıktıyı metin dosyalarına yönlendirmiyoruz ve sonra bu iki metin dosyasını diff ile karşılaştırmıyoruz?

 hexdump -C binary_file1.so > binary1.txt
 hexdump -C binary_file2.so > binary2.txt
 diff binary1.txt binary2.txt 

İki metin dosyası oluşturmak için hexdump'ı yeniden yönlendirme ve metin dosyalarını karşılaştırmak için diff kullanma

İki dosya arasındaki fark, iki kısa alıntıda görüntülenir. Yanlarında bir ASCII gösterimi var. Dosyalar arasındaki her fark için bir çift alıntı olacaktır. Bu örnekte, sadece bir fark var.

Hepsi çok güzel, ama tüm bunları sizin için yapan bir şey olsaydı harika olmaz mıydı?

VBinDiff

VBinDiff programı, tüm büyük dağıtımlar için olağan depolardan kurulabilir. Ubuntu'ya kurmak için şu komutu kullanın:

 sudo apt kurulum vbindiff 

VBinDiff'i Ubuntu'ya Kurmak

Fedora'da şunu yazmanız gerekir:

 sudo dnf vbindiff'i kurun 

VBinDiff'i Fedora'ya Kurmak

Manjaro kullanıcılarının pacman kullanması gerekir.

 sudo pacman -Sy vbindiff 

VBinDiff'i Fedora'ya Kurmak

Programı kullanmak için iki ikili dosyanın adını komut satırına iletin.

 vbindiff binary_file1.so binary_file2.so 

Komut satırında iki ikili dosyayı VBinDiff'e geçirme

Her iki dosyayı da kayan bir görünümde gösteren terminal tabanlı uygulama açılır.

VBinDiff iki ikili dosya dağıtıyor

Dosyalar arasında gezinmek için fare kaydırma tekerleğini veya “UpArrow”, “DownArrow”, “Home”, “End”, “PageUp” ve “PageDown” tuşlarını kullanabilirsiniz. Her iki dosya da kayar.

İlk farka atlamak için “Enter” tuşuna basın. Fark her iki dosyada da vurgulanmıştır.

VBinDiff iki ikili dosya arasındaki farkları vurgulama

Daha fazla fark olsaydı, “Enter”a basmak bir sonraki farkı görüntülerdi. “q” veya “Esc” tuşlarına basmak programdan çıkacaktır.

Fark ne?

Başkasına ait bir bilgisayarda çalışıyorsanız ve herhangi bir paket kurmanıza izin verilmiyorsa, cmp , diff ve hexdump kullanabilirsiniz. Daha fazla işlem için çıktıyı yakalamanız gerekiyorsa, bunlar da kullanılacak araçlardır.

Ancak paketleri kurmanıza izin verilirse, VBinDiff iş akışınızı daha kolay ve daha hızlı hale getirir. Ve aslında, VBinDiff'i tek bir ikili dosya ile kullanmak, ikili dosyalar arasında gezinmenin kolay ve kullanışlı bir yoludur, bu da güzel bir bonus.

İLGİLİ: Linux Komut Satırından İkili Dosyaların İçine Nasıl Bakılır