Ön Açıklamalar
Her şeyden önce, bir ikili programın doğru bir şekilde sökülmesinin ne olduğu konusunda anlaşmamız gerekir. Şu tanımı öneririm:
Bir ikili programın doğru bir şekilde sökülmesi , girdi ne olursa olsun program tarafından yürütülebilecek tüm olası komutlar kümesini verecektir
Bunu belirtmenin bir başka yolu, alabileceği her girdide programın tüm olası çalıştırmalarının talimatlarını ifşa ettiğimizi söylemektir.
Durma Problem
Burada, bir Turing makinesindeki durma problemiyle şu şekilde tanımlanabilecek bir paralellik kurabiliriz ( Wikipedia):
Durma sorunu , gelişigüzel bir bilgisayar programının açıklamasından ve bir girdiden, programın çalışmasını bitirip bitirmeyeceğini veya sonsuza kadar çalışmaya devam edip etmeyeceğini belirleme sorunudur.
Bu (görünüşe göre) çok basit problem Turing tarafından kararlaştırılamaz olarak gösterilmiştir, yani bir programla belirli sayıda vakayı otomatik olarak halledebilsek bile, bazı patolojik vakalar her zaman makinenin / programın verilen girdide evet mi hayır mı olduğunu söyleyemeyecek olan programımız.
Ve tabii ki bu tür patolojik vakalar sonsuz sayıda (bu nedenle, bunları saymak için bir umut yok) özel durumlar olarak birer birer).
Demontaj sorunumuza geri dönelim!
Bir programın tüm olası yollarını keşfetmek, gerçekten de durdurma sorunu nedeniyle !
Gerçekten de, durma problemini formüle etmenin ikili bir yolu, erişilebilirlik problemidir , burada belirli bir noktaya ulaşmanıza izin veren bir girdi olup olmadığını bilmek istediğiniz programı. Ve bellekteki belirli bir yere program tarafından erişilip bir talimat olarak yorumlanıp yorumlanamayacağını bilmek ( yani , talimat işaretçisi bir noktada bu adresin değerini alır) şudur bir erişilebilirlik sorunu.
Yani, parçalarına ayırma karar verilemez .
Ama Gerçek Dünyada?
Biliyorum, biliyorum, bu sadece Matematik ... Gerçek değil ... Gizemlerin çoğu (gönüllü olsun ya da olmasın) çözülebilir ve ikili koddan otomatik olarak kaldırılabilir ...
Bunun nedeni esasen bu gizlemeleri yapan kişilerin karar verilemez hale problemler ...
Programınıza, karar verilemeyen bir problemin hesaplamasını, hatta ona uygulanan herhangi bir otomatik muhakemeyi bozacak kadar zor ve karmaşık bir şeyi eklediğinizi hayal edin.
Bir örnek vermek gerekirse, Collatz dizisini ( Wikipedia) alalım, bu dizinin bir süre sonra her zaman 1'de biteceği varsayılır. Ancak, arkasındaki aritmetik problem o kadar karmaşıktır ki, bu varsayım yaklaşık bir yüzyıldan beri geçerlidir ... Bu, kullanılacak mükemmel bir opak yüklemdir! Elbette, böyle bir varsayımın kanıtı mevcut olabilir, ancak bu sorun, üzerine inşa etmeye başlayacak ve bilgisayarın bir programın durum uzayını keşfetmesini karıştıracak kadar karmaşıktır.
Aslında, şu anki durum budur. günümüzde güçlü gizlemede araştırma yönü ... Daha önce kullanılan küçük numaralarla neredeyse bitirdik ve insanlar daha iyi temelli problemler üzerine bir şeyler inşa etmeye başladılar. Kriptoloji ile karşılaştırılacak yazılım gizleme konusunda bir Shannon 'un (bilgi teorisinin babası) bir eşdeğerini hala kaçırsak bile.
Son Kelimeler
Böylece, sökme sorununun durma sorunuyla güçlü bir şekilde bağlantılı olduğunu gördük. Ayrıca, oldukça karmaşık problemlerin kullanılması, modern yazılım gizlemesinde bir sonraki adım olabilir.
Sökme tekniklerinde en son teknolojiye bağlı kalmak zorunda olsaydık, mevcut sökme araçlarının muhtemelen yapabileceğimizin çok gerisinde olduğu gerçeğiyle ilgili son bir söz söylemek istiyorum. Tarih öncesi araçların ne kadar tarih öncesi olduğunu gördüğümde hep acı içinde ağlıyorum ... ama tüm modern teknikleri uygulamaya koymak o kadar çok geliştirme ve bakım çabası gerektirecek ki hiç kimse bunu yapmaya hazır görünmüyor (ama bu sadece benim mütevazı görüş).