Vefa Lök’ten Osmanlıca ve Crack

osman_2

Vefa Lök ile iritibata geçtikten sonra nette sürekli değişen adresi sebebiyle tüm vefa lök arşivini sitemde taşıyordum ve çok ağırdan da olsa şifre koruması olan yazılımları tek tek kırıyordum. Bu işe bir süre ara vermiştim, Dragon’s Breath Türkçesi moralimi bozduğu için. Dragon’s Breath sadece yazılım değil, donanımdan korunuyor, bu sebepten bir kopyasını adf haline getiremiyorsunuz, teknik kapasitem henüz Dragon’s Breath’i kırmama yeterli olmadı, donanımla ilgilenen arkadaşların mfm hakkındaki bilgilerini toplamam gerekiyor. Ya da kryoflux almam gerekiyor. Fakat bu arada Osmanlıca tekrar gündeme geldi. Tayko’nun osmanlıca çıkışına anlam veremesem de, konu üzerine bu programın ortaya çıkmaı tesadüf değil elbette.

Sonuçta, yarısını kırmış olduğum Osmanlıca disketini kırmayı tamamlamaya karar verdim. Hikayenin bir kısmını retrojen forumlarında anlattım, ama buraya bıraktığım bir iki detay var, anlatalım:

En başa dönersek, diski amigaya yüklediğinizde karşınıza ilk çıkan şey korsan kopya uyarısı. 90’larda amiga yazılımlarını sadece kopya olarak elde edebiliyorduk. Türk yazılım sektörü diye birşey yoktu (hala da var denemez), yine de türk amatör programcılar bu kopya meselesine çok takıyordular. Ben de o zaman kopya korumaları tasarlayarak eğlenirdim -kimsenin göreceği şeyler değildi-. Bu iş de eğlencenin bir parçasıydı ve belki de büyük bir kıskançlığın sonucuydu: “Benim yazılımlarım da korsan kopyalanmaya değer!”. Sonuçta o dönemde birçok amatör programcı yerel bilgisayarcısına bıraktığı oyunun kaç kişi tarafından kopyalandığını duymak için sabırsızlanıyordu ve seve seve tüm şifreleri oyunu isteyene veriyorlardı ama yine de hayalinde bir Monkey Island yazmak olduğu için kopya korumasını da eklerlerdi. Yani özetle, Vefa Lök’ün kopya koruma yazmasındaki amaç aslında korsanı engellemek değil, biraz daha fazla eğlenmekti büyük ihtimal.

Programa baktığımızda kod koruma kısmının programın kendisinden daha fazla yer tuttuğunu görüyoruz. Kod ekranında med-res 19 farklı grafik var, 19 farklı anahtar kelime var, bunlar tntdata ve oztdata isimli data dosyalarından karıştırılıyor, ayrıca program iki farklı exe’den oluşuyor (intro ve osmanlıca) ve bu exe’ler bazı dosyaların sağlamlığını kontrol ediyorlar. Örneğin Para ve Güç tüm kopya koruma verisini iki boyutlu matriste ve tablo içinde tutuyordu. Bu matrisi tek bir komutla hafızada aratıp sıfırladığınızda kolayca kopya korumayı yok etmiş oluyordunuz. Fakat burada aranacak bir şey bile yok. Görüntülenen resim ve kelimeler gerçek değerler değil. Birkaç çataldan sonra ulaşılıyor. Tabii amos kodunun kendisini görmedim, bu çatallanmayı Amos Compiler de yaratmış olabilir fakat veri sadece CPU register’larına yazılıyor ve genelde görüntülenmeden önce hafızadaki sürekli yeri değişen bir yere yazılıyor. Tahminime göre Vefa Lök kopya kodunu 3-4 değişkende elden ele geçirdikten sonra nihayet karşılaştırıyordu, bu durumda compiler registerler el verdikçe veriyi ram’e yazma gereği görmüyor. Tabii bu değerler bu durumda gerçek zamanlı hesaplanıyor ve ram’de yansımasını ve sıfırlayacak birşey bulamıyorsunuz.

Bu durumda iki yöntem var, birincisi kopya korumasının ardında kalan bir alana güzel bir giriş noktası bulup direkt oraya atlamak. Ki programın 1997’de yazıldığını düşünürsek programın çalışmasına kopya korumasının katkıda bulunmadığını varsayıyorum. İkincisi, kodu hesaplayan rutinin hep aynı sonucu elde etmesini sağlamak, ki ben en son kararda bunu uyguladım çünkü “amos sanal makinesi” bana atlayabilecek güvenli bir rota yaratmadı, yüzlerce birbirini çağıran alt rutin var ve birinden diğerine direkt atlamak makine yığınını bozuyordu, program bir süre çalışıp sonunda stack bozuk olduğu için guru ile son buluyordu.

Basamaklar:

  1. Osmanlica DMS dosyasını inceledim. Hex editörle içindeki olası kod tablolarını araştırdım, fayda etmedi.
  2. Oyunun ikinci kısmı (osmanlıca) direkt olarak çalışmıyordu, bunu nasıl yapabildiğini araştırdım.
  3. “intro”nun gizlice ram’de Peri isminde bir dosya açtığını gördüm, aynısını yaptım ama “osmanlıca” kısmı yine de çalışmadı.
  4. Ucuz bir hamle ile Peri ismindeki dosyayı ram yerine dh0’a açmasını sağladım, böylece içindeki mesajı okudum, “osmanlıca” kısmı Ram’deki dosya içeriğini de test ediyordu. Vefa Lök’ün iç dünyasından bir parça da aynı metinde içtenlikle paylaşılmıştı. Bu tür şeyler bir cracker için büyük keyif noktalarıdır. Bu dosyayı ram’e koyduktan sonra test işlemim daha kolay oldu, artık intro kısmını yüklemek zorunda değildim.
  5. Kod kısmında ok tuşlarına basıldığında ne olduğunu gözlemlemek için UAE debugger’ından yardım aldım: kesme noktası oluşrurmak için “f”, izleme noktası oluşturmak için “w” komutlarını kullanabilirsiniz. Örneğin, hafızanın $0028BF44 adresini gözlemek istiyorsanız w 0 0028BF44 1 yazmanız yeterli. Bu konu hakkında bir döküman yazacağım yakında, lütfen blog’u uae debugger anahtar kelimesi ile taratınız.
  6. Bu işlemden sonra toplam 18 anahtar kelime olduğunu farkettim, bunlar $00-$12 arasında değer alıyorlar, şanslıyız bunları peş peşe giden bir array’e koymuş. Bir dahaki sefere farklı değişkenlere dağıtırsa işim daha zor olur. Bu durumda birinci kod $00-AHGUN, son kod $12-NATU oluyor.
  7. Geçtim sorulan kodu bulmaya. Debugger düzgün çalışsa kodu bulmak çok kolay. Ama burda ciddi bir bug var. Oluşturduğunuz breakpointler hiçbir kondisyonu kabul etmiyor. Yani dökümante edilmelerine karşın, sadece değişiklik olduğunda (C), okuma olduğunda (R), yazma olduğunda (W) gibi bayraklar çalışmıyor, ve ne yaparsanız yapın breakpoint her seferinde tetikleniyor. Bu sebepten baştaki kodu karıştırma anının bellekte nereye yazıldığını tam olarak bulamadım. Ama yazmaçlardaki değerleri görebiliyordum, sonunda kodu modifiye etmeye karar verdim ve normalde toplama yapan ve kod sorusunu karıştıran rutine küçük bir müdahale ile Normalde D3 yazmacına A3 yazmacındaki veriyi toplayan ve rastgele bir sonuç üreten MOVE.L (a3)+,(D3) ve peşi sıra gelen komutları, MOVE.L $0,D3 ve NOP benzeri komutlarla değiştirerek sonucun hep 0 kalmasını sağladım.
  8. Eh, fakat vefa boş durmamış, Kod kelimeleri de farklı bir hesapla karıştırılıyor. Bunun yerini bulmakla vakit harcamadım. Bunun yerine kullanıcının el ile sıfır numaralı kod’a ulaşmasını sağladım, indekslenmiş kodları yönergelerle değiştirerek biraz daha komik bir hale geldi 🙂
  9. Elbette ki kod ekranındaki metinlere sanki büyük bir iş yapmışım gibi adımı yazmak zorunlu 🙂 Bu sefer kendimle beraber retrojen.org’u da ekledim.
  10. Debugger’da bunları yapmak yetmiyor, bunları yaparak CRC’si sağlam bir amiga uygulama dosyası oluşturmak gerekiyor. Yaptığım değişikliklerin bulunduğu adresleriden 15-20 byte’lık kopyalamalar yapıp bu alanları hex editörle arayıp “osmanlica” dosyasının içinde buldum ve değişiklikleri tekrar uyguladım.
  11. CRC kontrolü yaptıktan sonra orjinal osmanlica disketine geri kopyaladim. Test sonucu hiçbir validasyon hatası almadan disket hazırdı. Disketin hızlanması açısından bir dosya düzenlemesini de DOPUS üzerinden yaptım.
  12. Elbette ki açılış metnini de değiştirdim. İsteyen kolayca ulaşabilsin diye S klasöründeki “mesaj” isimli orjinal dosyaya dokunmadım.
  13. Son olarak DMS formatındaki diski ADF formatına çevirdim ve baştaki utility bootloader’ı silerek yerine orjinal amigados bootloader’ı yükledim. Eski bootloader’ı geçmek için mouse’un bir tuşuna basmanız gerekiyor. Fakat osmanlıca programının hiçbir aşamasında mouse kullanılmıyor. Bu bootloaderı kaldırdığımda mouse’a gerek kalmamış oluyor.
  14. Disketi TOSEC isimlendirme kurallarına göre isimlendirip internete yükledim 🙂 Güle güle kullanın.

Dosyayı indirmek için OSMANLICA 1.3 – KIRILMIŞ SÜRÜM 510kb Zip dosyası – ADF Programın kırılmamış sürümü için diğer Vefa Lök başlığına bakınız.

osman_1

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir