Linux'ta İkili Dosyalar Nasıl Karşılaştırılır
Yayınlanan: 2022-08-20İ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.
İ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
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
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
Dosyaların farklı olduğunu zaten biliyorduk. cmp
deneyelim.
cmp binary_file1.so binary_file2.so
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
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
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)
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 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
Fedora'da şunu yazmanız gerekir:
sudo dnf vbindiff'i kurun
Manjaro kullanıcılarının pacman
kullanması gerekir.
sudo pacman -Sy vbindiff
Programı kullanmak için iki ikili dosyanın adını komut satırına iletin.
vbindiff binary_file1.so binary_file2.so
Her iki dosyayı da kayan bir görünümde gösteren terminal tabanlı uygulama açılır.
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.
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