Soru:
BinDiff nasıl çalışır?
perror
2013-04-02 14:35:57 UTC
view on stackexchange narkive permalink

BinDiff yazılımının temel ilkelerinin (ve belki de optimizasyonlar ve sezgisel yöntemlerle ilgili birkaç şeyin) ne olduğunu bilmek istiyorum. Bunun hakkında güzel ve pedagojik bir açıklaması olan var mı?

@Nirlzr: 'bindiff' etiketlerini 'tool-bindiff' olarak değiştirmenin herhangi bir şeyi nasıl geliştirdiğini anlamıyorum ... Ama, sadece çarpık bir zihne sahip olabilirim, bu yüzden bana bundan biraz daha bahset ...
Belki de http://meta.reverseengineering.stackexchange.com/questions/322/bindiff-verses-bin-diffing-tags'de seslendirmelisiniz.
@kennytm: Ah, bunu kaçırdım ... İyi yakaladım, teşekkürler.
Iki yanıtlar:
#1
+16
newgre
2013-04-03 02:01:48 UTC
view on stackexchange narkive permalink

Genel olarak, bu yazı itibariyle mevcut sürümünde (4.x) BinDiff, işlev seviyesindeki öznitelikleri eşleştirerek çalışır. Temel olarak, eşleştirme iki aşamaya bölünmüştür: ilk eşlemeler üretilir ve daha sonra detaylandırma aşamasında iyileştirilir.

İlk Eşleşmeler

Her şeyden önce BinDiff, her işlev için aşağıdaki öznitelikler:

  • temel blokların sayısı
  • bu bloklar arasındaki kenarların sayısı
  • alt işlevlere çağrı sayısı

Bu adım bize her ikili dosya için bir dizi imza verir ve bunlar da ilk eşleşmeler kümesini oluşturmak için kullanılır. Bire bir ilişkinin ardından BinDiff, yukarıdaki özelliklere göre bu ilk eşleşmeleri seçer.

Bir sonraki adım, her ikilinin çağrı grafiğinde eşleşmeleri bulmaya çalışır: doğrulanmış bir eşleşme için, Eşleşen işlevden denilen işlevler, olay daha fazla eşleşme bulmak için incelenir. Bu süreç, yeni eşleşmeler bulunduğu sürece tekrarlanır.

Detaya Gitme

Pratikte, tüm işlevler ilk eşlemenin neden olduğu bire bir ilişki ile eşleşmeyecektir. stratejisi, dolayısıyla ilk eşleşmeler belirlendikten sonra hala eşleşmeyen fonksiyonların bir listesine sahibiz. Detay aşamasının fikri, bir eşleşme bulunana kadar uygulanan birden fazla farklı işlev eşleştirme stratejisine sahip olmaktır. Bu stratejileri uygulama sırası önemlidir: BinDiff önce en yüksek güveni üstlendiği stratejileri dener. Ancak hiçbir eşleşme bulunamazsa, bir sonraki strateji ile devam eder. Bu, BinDiff stratejileri bitene kadar veya tüm işlevler eşleşene kadar tekrarlanır. Örnekler arasında MD dizini, işlev adlarına dayalı eşleşme (yani içe aktarmalar), arama kenarları MD dizini vb. Yer alır.

MD-Dizin kağıdı

Yürütülebilir Nesnelerin Grafik Tabanlı Karşılaştırması

Yürütülebilir Nesnelerin Yapısal Karşılaştırması

(Sorumluluk reddi: working @ team zynamics / google, umarım hiçbir şeyi mahvetmemişimdir, aksi takdirde Soeren beni kızdırır ;-))

Yani hala üzerinde mi çalışıyorsun? Yoksa bu sadece her Cuma projesi mi?
Üzerinde çalışmıyorum ve hiç yapmadım, ancak kastettiğin buysa BinDiff iptal edilmedi !?
BinDiff'in arkasındaki şirket olan Zynamics, Google tarafından satın alındı. Tersine mühendislik redditinde oturan bazı çalışanlara mesaj gönderebilirsiniz.
#2
+7
fasmotol
2013-04-02 15:47:17 UTC
view on stackexchange narkive permalink

Kontrol akış grafiği oluşturma hakkında sadece birkaç kelime söyleyebilirim, ancak cevabım kesinlikle tam cevap değil.

BinDiff, yürütme akışlarını tespit etmek için statik bir tür kullanıyor, sanırım kodu çalıştırdığı için her zaman mümkün değildir (örneğin, 0 sürücüleri için) veya makul değildir (kötü amaçlı yazılım). Aslında, verilen dosya demonte edilir, daha sonra temel bloklara bölünmelidir (bunlar, düz yürütme yöntemine sahip kod parçalarıdır, ancak bu tanım tam da bu durumda doğrudur). jxx gibi komutların bir programın kontrol akışını değiştirdiği açıktır (örneğin x86 mimarisi dikkate alındığında). Dolayısıyla temel bloklar genellikle onlar tarafından sonlandırılır. Bu kodu bloklara bölme süreci karmaşık bir iş değildir, daha zor olan kısım atlama hedefini belirlemektir.

Örneğin, bunun gibi bir şey:

  ... jz eax  

Bu nedenle, bu çağrının nereye yönlendirildiğini otomatik statik analizle (kolayca) anlayamayız. Önemsiz vakalar "taklit edilebilir", ancak genel olarak bu iş çok zor ve sinir bozucu. Diğer seçenek, hangi yolların kod çalıştırdığına bakmak için programı izlemektir (bu, manuel olarak yapılabilir). Bu bloklar bulunduğunda geriye kalan tek şey, insan tarafından okunabilir grafik oluşturmaktır.

Neyse var yürütme akışının değiştirilebileceği bir yığın yol (istisnalar, başka bir iş parçacığı tarafından sıcak yama, sisteme bağlı olaylar vb.).

Grafik homomorfizmi algoritması hakkındaki [orijinal makale] (http://www.zynamics.com/downloads/bindiffsstic05-1.pdf) iyi bir başlangıçtır. Daha yakın zamanlarda, bazı [araçlar] (https://github.com/MartialB/BinSlayer) önerildi (bu [makaleye] (http://dl.acm.org/citation.cfm?id=2430557) [poster] (http://royalsociety.org/uploadedFiles/Royal_Society_Content/grants/labs-to-riches/2012/Andy%20king.pdf)). Ancak bu [Reddit dizisi] (http://www.reddit.com/r/ReverseEngineering/comments/16bc9t/binslayer_fast_comparison_of_binary_executables/) BinDiff üzerinde bazı iyileştirmeler yapıldığını göstermektedir.


Bu Soru-Cevap, otomatik olarak İngilizce dilinden çevrilmiştir.Orijinal içerik, dağıtıldığı cc by-sa 3.0 lisansı için teşekkür ettiğimiz stackexchange'ta mevcuttur.
Loading...