Derlenmiş bir ikili dosyanın içeriğini neden anlayamıyoruz?


11

Bildiğim kadarıyla, her program işlemci kayıtlarında çalışmak için belirli veri değişkenleri (float, int, char ...) içeren bir işlemci talimatları paketinden oluşur .

Yani, bu konuda düşündüğüm ilk şey (uzun zaman önce), ASCII değerinin %¨#$¨#(sadece rastgele bir örnek) bir x86'nın yığın işaretçi kaydının (sadece örnekleyici) adresi olarak yorumlanabileceğidir. işlemci. Bu doğruysa, bir ikili dosyanın içeriğini okurken bu "okunamayan" değeri her bulduğunuzda, yığın işaretçisi kaydının bazı veri değişkenlerini yönetmek için kullanıldığını yorumlayabilirsiniz.

Ne yazık ki bu gerçekleşmiyor. Aşağıda, ping.exeWindows ile açılan program içeriğine bir örnek verilmiştir notepad.exe:

MS Not Defteri'nde görüntülendiği gibi ping.exe

Bu bir ikili dosyadır ve verileri insanlar için anlaşılmazdır (makineler için anlaşılabilir.) Montaj kodunu (makine dilinin en düşük seviyesi) bilmelerine rağmen hiç kimseye bir anlam ifade etmiyor .

Yani, eğer her şeyi doğru anladıysam, birisi

  1. İkili bir kod neden aynı şekilde Meclis koduna geri döndüklerinde, aynı şekilde?
  2. Eğer montaj kodunu anlayabiliyorsanız, derlenen ikili kod neden bu koddan "okunabilir" kalıyor?

12
Yapabilirsin, sadece bir sökücüye ihtiyacın var .
David Schwartz

Yani herhangi bir .exe dosyasını sökebilir ??? Yönetilen kodla çalıştığını biliyordum ...
Diogo

13
Yürütülebilir herhangi bir parçayı sökebilirsiniz. Demonte edilmiş çıktıyı anlayabileceğiniz başka bir hikaye.
David Schwartz

5
Derleme veya montaj, değişken adları, şube etiketleri vb. Gibi insan açısından önemli birçok bilgiyi kaldırır.
mpez0

1
Ayrıca kod gizleme , demontajı engelleyebilir.
matematik

Yanıtlar:


13

İlk olarak, kayıtların adresleri yoktur. Herhangi bir montaj dilindeki her bir talimat bir opcode anlamına gelir. X86'daki opcodlar bir, iki, üç veya daha fazla bayt olabilir (diğer bazı işlemcilerde "sabit genişliktedir"). Genellikle opcode talimatı, adresleme modunu ve ilgili kayıtları tanımlar. "Adresleme modu", CPU tarafından opcode'dan daha fazlasının gerekip gerekmediğini belirler, yani "acil" adresleme modu, söz konusu talimatın talimatından hemen sonra (veya "hemen sonra") ek veri olduğu anlamına gelir - "mutlak" adresleme modları, bellek adresi talimatı izler ve bu talimat tarafından kullanılır.

MOV AL,SPBenzer veya benzer bir şeyin kodunu bulabilir ve sonra arayabilirsiniz. x86, yığın işaretçisinde çalışan birçok yönergeye sahiptir.

Lütfen, lütfen Not Defteri'ni kullanarak çıkın ve bunun yerine onaltılık bir düzenleyici kullanın. Diğerleri olmasına rağmen HxD, tavsiye ederim.

Ve @David Schwartz doğrudur. Bir sökücü bir dosyada yinelenir ve opcode'ları tekrar okunabilir metne çevirir. Yapmak istediğin şey tamamen mümkün.

Ancak, komutların dosyanın neresinde başladığını bilmeniz gerekir, çünkü yanlış adresten başlatırsanız, opcodes için "işlenenler" olması gereken bazı veriler (bir işlenen veya "bağımsız değişken" için adres alan talimatlar gibi) opcode olarak yanlış yorumlanabilir. Bunu bilmek, çalıştırılabilir formatın bilgisini gerektirir; bu, Windows için "Taşınabilir Yürütülebilir" veya PE formatıdır (ve genellikle Linux sistemleri için ELF'dir). Eminim ki PE, vb.


1
IDA daha yaygın PE dağıtıcılarından biridir. Linux ve Mac dosyalarıyla da çalışır. Sürüm 5.0 hala ücretsiz olarak mevcuttur
Scott Chamberlain

1
> Yanlış adresten başlarsanız… yanlış yorumlanabilir. Bu nedenle, tüm oluşumları %¨#$¨#yığın işaretçisine bir referans olmayacaktır; sadece iki farklı komutun ortasında olabilir : _3p%¨#ve $¨#b5F( _3p   %¨#$¨#   b5F).
Synetech

12

Yani, eğer her şeyi doğru anladıysam

Pek değil.

Bu bir ikili dosyadır ve verileri insanlar için anlaşılmazdır

Tipik bir ikili dosya, özellikle dosyanın amacı bilinmediğinde, insan ve makine için anlaşılmazdır. Tüm ikili dosyaların yürütülebilir dosyalar olmadığını unutmayın. Birçok ikili dosya, herhangi bir makine talimatı içermeyen veri dosyalarıdır. Bu nedenle dosyaları adlandırırken dosya uzantıları kullanılır (bazı işletim sistemlerinde). . com uzantısı, yürütülebilir bir dosyayı belirtmek için CP / M tarafından kullanılmıştır. . exe uzantısı başka bir yürütülebilir dosya biçimini belirtmek için MS-DOS tarafından eklendi. * nixes, kodun yanı sıra komut dosyası olabilmesine rağmen hangi dosyaların yürütülebileceğini belirtmek için execute özelliğini kullanır.

Başkaları tarafından daha önce de belirtildiği gibi, sayı içeren ikili dosyalar, metin görüntüleyici tarafından değil, onaltılık döküm programı veya onaltılık düzenleyici tarafından görüntülenmelidir.

ping.exe programının içeriğine bir örnek var

Bu dosya aslında yeniden yerleştirilebilir bir programdır ve bu dosyadaki tüm veriler makine kodunu temsil etmez. Program hakkında hangi dinamik kütüphanelere ihtiyaç duyduğu, hangi rutinlerin bağlanması gerektiği, yığın ve program ve veri belleği için gereksinimler ve programın giriş noktası gibi bilgiler vardır. Dosyadaki adres işlenenleri, mutlak değerlere hesaplanması gereken göreli değerler veya çözümlenmesi gereken referanslar olabilir.

Muhtemelen düşündüğünüz "program dosyasına" ikili görüntü dosyası veya program belleğinin dökümü denir. Böyle bir dosya yalnızca makine kodu ve verileri içerecektir ve tüm adres referansları yürütme için uygun şekilde ayarlanmıştır.

Montaj kodunu (makine dilinin en düşük seviyesi) bilmelerine rağmen.

Montaj dili makine dili ile aynı değildir . Tipik (üst düzey dil bilgisayarlarını hariç tutmak için) CPU, makine kodunu giriş olarak kabul eder, her seferinde bir komut. İşlenenler ya kayıtlar ya da sayısal bellek adresleridir. Montaj dili, talimat konumları ve değişkenleri için sembolik etiketler kullanabilen ve sayısal op kodları anımsatıcılarla değiştirebilen daha üst düzey bir dildir . Bir montaj dili programı, yürütülmeden önce makine diline / koduna dönüştürülmelidir (genellikle montajcı, bağlayıcı ve yükleyici olarak adlandırılan yardımcı programlar tarafından).

Ters işlem, sökme, bazı başarılı ve sembolik bilgi kaybı ile program dosyalarında gerçekleştirilebilir. Bir bellek dökümü veya program görüntü dosyasının sökülmesi daha deneme yanılma yöntemidir, çünkü kod ve veri konumları manuel olarak tanımlanmalıdır.

BTW (sayısal) makine kodunu okuyabilen ve kodlayabilen kişiler var. Tabii ki bu bir 8 bit CPU veya mikrodenetleyici üzerinde bir düzine bellek adres modu olan 32 bit CISC işlemciden çok daha kolay.


3

Not Defteri aracılığıyla bir ikili dosyanın doğru, amaçlanan kodlamasını göremezsiniz. Lütfen ileride başvurmak üzere gözden geçirin. Çoğu metin düzenleme programı ikili kodlama formatlarını ayrıştırmaz ve ASCII karakter kodu formatını ayrıştırması beklenir.

Bu nedenle, bir metin düzenleyicide ikili bir dosyayı açmak, metin düzenleyicisi tarafından ayrıştırıldığı şekliyle ikili verilerin orijinal biçimini anlamayan eşdeğer ASCII karakterleri verecektir. Belirtildiği gibi, altıgen editörler ve bazılarının içeriği saf ikili biçimde görüntülemek için ikili özelliklere sahiptir.

İkili dosya içeriğinin anlaşılamaması yanlıştır. Onlar sert ve modern bilgisayar mimarileri de olacak olsa son derece sert vb yürütme (veya taklit sanal / CPU), CPU tarafından tanınan uygun talimatlara el-sökmeye ikili yalnız ila, bu yapılabilir.

Emülatörlerin nasıl programlandığını düşünüyorsunuz? Geliştiricinin, gerçek donanımı bir şekilde tanıyacak ve davranacak şekilde kurgusal sistemi programlayabilmesi için opcod'ları bilmesi gerekir. Belgeler birçok CPU mimarisini açıklıyor ve hatta GPU'lar bile bunlara sahip (daha gizli olsalar da).

Dikkat edilmesi gereken başka bir şey, en düşük seviyede, korelasyonlu olmasına rağmen, "ikili veriler" gerçekten bir grup sıfır ve bir değil, akım olarak bir elektrik devresi aracılığıyla yükseltilen / değiştirilen yüksek ve düşük voltajlardır.

İkili genellikle bununla 1: 1'dir, bu nedenle sayı sistemini bunun için kullanmak çok mantıklıdır.

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.