Geri Dön
ImHex'in geliştiricisi bilinmeyen dosya biçiminin tersine mühendisliğini anlattı
SiTech AI Team2 წთ. საკითხავი

ImHex'in geliştiricisi bilinmeyen dosya biçiminin tersine mühendisliğini anlattı

Açık kaynak hex editörü ImHex'in geliştiricisi, FEZ'in kayıt dosyası örneğiyle bilinmeyen ikili biçimlerin nasıl çözüleceğini adım adım gösterdi. Yazı, her bilinmeyen biçim için genel bir tarifle sona eriyor.

Açık kaynak hex editörü ImHex'in geliştiricisi WerWolv, bilinmeyen bir ikili dosya biçiminin tersine mühendisliğini adım adım anlatan bir rehber yayımladı. Örnek, 2012 yapımı FEZ oyununun kayıt dosyası: ham baytlardan ImHex'in Pattern Language dilinde yazılmış eksiksiz bir tanıma kadar. ImHex ücretsiz ve açık kaynaklı.

Derlemeden doğru fonksiyona

FEZ'in kayıt verisi ne sıkıştırılmış ne şifrelenmiş, ayrıca bir dosya imzası da taşımıyor; bu yüzden dosyayı ilk bakışta tanımlayan hiçbir şey yok. Oyun C# ile yazıldığı için JetBrains Rider gibi araçlar ikili dosyaları neredeyse özgün kaynak koda dönüştürebiliyor. İlgi çekici derlemeler FEZ.exe, FezEngine.dll, Common.dll, ContentSerialization.dll ve EasyStorage.dll oluyor. PCSaveDevice sınıfında dosya adının "SaveSlot" ile bir indeksten oluşturulduğu görülüyor; Save() metodu ise 40.960 baytlık (0xA000) bir tamponu dolduruyor: önce Windows FILETIME biçiminde geçerli zaman, sonra kayıt verisi yazılıyor, kısa dosyalar sıfırla dolduruluyor, daha büyükleri ise istisna fırlatıyor. Çağrı zincirini SaveFileOperations.Write'a kadar izlemek serileştirilen tüm alanları ortaya çıkarıyor: okuyucunun 6 olmasını şart koştuğu sürüm numarası, oluşturma zaman damgaları ve New Game Plus bayrakları.

ImHex'te pattern oluşturmak

Pattern Language'de yazar struct'ı sıfır ofsetine yerleştiriyor, kod gerçek uygulamaya benzeyen tip takma adları yazıyor ve zaman damgasının okunabilir bir tarih olarak görünmesi için standart kütüphanedeki FILETIME tipini içe aktarıyor. Dizeler, uzunluğu 7 bitlik kodlamayla yazılmış biçimde çıkıyor; yazar bunu, devam biti sıfırlanana kadar bayt okuyan bir döngüyle uyguluyor ve değerin arayüzde görünmesi için format ile transform niteliklerini ekliyor. Nesneler isteğe bağlı bir değerden önce mantıksal bayrak tutan nullable sarmalayıcılar, listeler sayı önekli diziler olarak modelleniyor; enum'lar ise C#'tan neredeyse olduğu gibi aktarılıyor. Sonunda dosyanın sondaki dolgu dışındaki her baytı çözülmüş oluyor ve değerler arayüzden düzenlenebiliyor.

Bilinmeyen biçimler için genel tarif

Kapanışta yazar süreci genelleştiriyor: önce biçimin zaten bilinip bilinmediğine bakın — ImHex'in magic tanıması ve binwalk gibi araçlar yardımcı olur, belgelenmiş biçimler için hazır ayrıştırıcılar bulunabilir. Ardından dosyayı okuyan ya da üreten kodu bulun: dile uygun bir araçla derleyin — .NET için Rider, yerel kod için Ghidra, IDA veya Binary Ninja, JVM dilleri için Recaf — ve dosya giriş-çıkış çağrılarını ya da dosya adını içeren dizeleri arayın. Sonra yapı taşlarını belirleyin: tam sayılar, mantıksal değerler, dizeler ve veri yapıları. Bulgularınızı belgeleyen ve doğrulayan bir pattern dosyası yazın.

Her program FEZ kadar kolay çözülemez, diye kabul ediyor yazar, ama yaklaşım aynı kalıyor. Tam pattern yazıyla birlikte yayımlandı; sorular ImHex Discord sunucusunda memnuniyetle karşılanıyor.

SSiTech

SiTech — AI destekli web geliştirme

Hızlı ve modern web siteleri kuruyor, AI'yı gerçek iş akışlarına taşıyoruz. Projeniz veya sorunuz mu var? Yardımcı olmaktan mutluluk duyarız.