folder Tahribat.com Forumları
linefolder Assembly - Reverse Engineering
linefolder Reverse Engineering - Hedef Bölge



Reverse Engineering - Hedef Bölge

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    inside
    FireX
    FireX's avatar
    Bilgi/Destek Madalyası Üstün Hizmet Madalyası
    Kayıt Tarihi: 16/Temmuz/2005
    Erkek

    //Bu yazımda Reverse Engineering'e programın kilit noktalarını bulmamızla ilgili bazı ipuçları verdim.Dökümanda anlamadığınız terimler olabilir.En eskiden en yeniye doğru gitmenizi öneririm.Dökümanlarımın birer bütün olduğu ve asıl konuya yönelmem gerektiğinden her seferinde en baştan bütün terimleri açıklayamıyorum.Bu,diğer dökümanlarım yada reverse engineeringle ilgili sorucaklarınız varsa sorunuz.Okuyan arkadaşlar yorumlarını eksik etmezlerse sevinirim.Bu konuda destekleyen tüm arkadaşlara ve tahribat bilgi bankasına ekleyen reneye teşekkür ederim.//

    Merhaba arkadaşlar bu yazımda Reverse Engineeringde hedef bölgeye ulaşma yöntemlerinden bahsedeceğim.Hedef bölge olarak kasdettiğimiz yerler; Programın register olup olmayacağına karar verildiği noktalar,program açıldığında daha önce register edilmişmi diye kontrol eden ve ona göre kısıtlamaları kaldıran noktalar  vb.Bu yöntemlerle birçok programda ulaşmamız gereken yerlere en az ıskalamayla konumlanabiliriz.Biraz bilgi ve kafamızı çalıştırmak programın korunuş şekline göre belirli sürede istediğimiz yere ulaşmamızı sağlayacak.Debugger ile programı açtığımız zaman binlerce satır assembly kodu görürüz.Bizim işimize yarayacak kısım bu binlerce satırın arasındaki tek satır kod olabilir.Sadece tek zıplama noktası program durumunu belirleyebilir.Peki ona nasıl ulaşacağız?

    Programına göre ihtimaller,karmaşalar artabilir.Packlenmenin dışında(Packli dosyanın üstünde unpack etmeden çalışmak iyi bir fikir değildir) programcının kendine özel programa dahil ettiği koruma yöntemleri olabilir.Bunlarda işin uzamasına sebep olur ve crackerın caymasına sebep olabilir.Örneğin programda self-modifying (kendi üzerinde değişlik yapan programlar) yöntemi kullanılıyorsa programı dikkatli bir şekilde takip etmemiz gerekir.Bu tür programlarda kilit noktaları bulmak zaman alabilir.Örneğin programa bir döngü dahil edilir ve bu döngü daha önceden şifrelenmiş verileri çeşitli işlemlerden geçirerek eski normal haline sokar.Orası ile işimiz tamamlandığında tekrar şifrelenir ve program akışı devam eder.Self-modifying’den daha sonraki yazımda ayrıntılı olarak bahsedeceğim için şimdilik geçiyorum.

    Program yazarken bazı sınırlar,kurallar,ölçütler vardır.Bunların dışına çıkamayız.Bu sebeple de genel olarak programlar derleyicisine bağlı olarak birbirine benzemektedirler.Bu tür işlere biraz aşina olduktan sonra bir programı debugger ile açtığımızda hangi derleyici ile derlendiğini assembly kodlarına bakarak anlayabiliriz.

    Eğer programı yazan adamda bunları biliyorsa işimiz dahada zorlaşacaktır.Fakat azimle ve sabırla mutlaka üstesinden gelinebilir.Korunmasına bağlı olarak saatler,günler alabilir.Örneğin starforce koruma sisteminin aşılması epey zaman almıştı.

    Şimdi işe koyulalım.Ben daha önceden keygenleri anlatırken Visual C++ ile kısa bir program yazmıştım.Aynı programı burada da kullanmayı uygun gördüm.Programı buradan indirebilirsiniz.

    Anlatacağım yöntemler her zamanki gibi Ollydbg temel alınarak anlatılacaktır.Son zamanların en gelişmiş ve kullanışlı debuggerı.Kullanmasını bilirseniz gerçekten çok işe yaradığını göreceksiniz.Diğer ilkel Reverse Engineering araçlarıyla sürünmenin anlamı yok.

    Öncelikle programı Ollydbg ile açıyoruz ve kısaca gözatıyoruz ve yöntemlerimizi sıralamaya başlıyoruz.Unutmayınki bunlar genel olarak kullanılan yöntemler.Programın çalışma mantığına yada sizin edindiğiniz tecrübelerle kendinize ait yöntemlerde bulabilirsiniz.

    İlk olarak string arama yöntemiyle başlıyoruz.Kodların olduğu pencerede sağ tıklıyoruz ve Search for->All referenced strings’e basıyor ve karşımıza çıkan string tablosunda arama yaptırıyoruz.Örneğin örnek programda seri numara doğru olmayınca “invalid serial number” yazıyor.Bunu karşımıza çıkan string tablosunda aratırsak programı packlemediğim için kolayca bulabilecek ve üstüne çift tıklayarak o bölgeye konumlanmış olacaksınız.Ondan sonra tek yapacağınız zıplama noktasında değişiklik yapmak olacak.

    Birde dipnot olarak bir uyarıda bulanayım.String tablosu karşımıza çıktığında en aşağılarda bir yerde olacağız.Bu yüzden string tablosunda en üste çıkıp en üstlerden birisini seçip,büyük küçük harf duyarlılığını kaldırıp aratın.Yoksa sonuca doğru yapsanızda ulaşamazsınız.



    String tablosuna bunun dışında “register”,”registered”,”thanks”,”unregistered” gibi programlarda sıkça kullanılan anahtar kelimeleri aratarakta yerleri hakkında bilgi sahibi olabiliriz.Bir programda öncelikle string tablosuna gözatmamız çok önemlidir.Çünkü burada işimize yarayacak birşey bulduysak süreyi muazzam oranda kısaltır.

    İkinci olarak program hata mesajı verdiğinde “invalid key” vs veya bir form açıldığında pencereyi kapatmadan programı duraklatarak call stack’a gözatmaktır.Call stack’a yukarıda üstünde “K” olan butona tıklayarak ulaşabilirsiniz.Şimdi bunu uygularsak

    Öncelikle debugger ile programı çalıştırıyoruz.Daha sonra seri numara kısmına kafamızdan birşey sallayarak hata mesajı verdiriyoruz.Karşımıza “invalid serial number” hata mesajı gelecek.Pencereyi kapatmadan Ollydbg’da pause butonuna basıyoruz ve call stack’a giriyoruz (“K” yazan buton)  Karşımıza gelen call stack penceresinde mesaj penceresinin verdiği hatayı ve hangi dll’den hangi apinin çağrıldığını göreceğiz.Örneğin USER32.dll’den MessageBoxA apisi çağrılmış.Bu USER32.MessageBoxA  olarak bize ekranda sunulur.



    Buradan mesaj penceresinin çağrıldığı yeri bulup üzerine tıklayıp o bölgeye ulaşıyoruz.Çağrıldığı yerden bahsedersek.Call stack penceresinde üstte “called from” göreceksiniz.Eğer biz called from sütununda başında user32 veya herhangi bir dllnin ismi ile başlayana tıklarsak o dllye gideriz.Bunun için programımızın adı ile başlayana tıklıyoruz. Yani programımızın adı “register.exe” ise Ollydbg register.xxxxxx olarak otomatik olarak heryere yerleştirir ve işimiz kolaylaşır.

    Called from sütununun yanındada procedure/arguments sütunu yeralmakta oradada nereden ne çağrılmış ve hangi argümanlar hangi değerleri almış izleyebilmekteyiz.Bizim için mesaj penceresinin çıktığı yer gerekli olduğu için procedure sütununda USER32.MessageBoxA, Called from sütununda da register.xxxxxxx yazan satırı seçip tıklıyoruz.Yani register programı xxxxxxx adresinde USER32.dll’den MessageBoxA apisini çağırmış.Tıkladıktan sonrada o bölgeye gözatıyor ve gerekli değişiklikleri yaparak programı kırmış oluyoruz.

    Şimdi üçüncü yöntemimize geçelim.Bu sefer programın formundaki label’da yazan “Name:” yazısını “isim:” olarak değiştirelim.String tablosunda bulamadığımızı farzedelim.Bu yöntemde memory’de arama yapacağız.Eğer aradığımız string’İ string tablosunda bulamadıysak oraya gözatıyoruz.Yapacağımız şey üstte “M” harfi yazan butona tıklayıp çıkan pencerede sağ tıkladıktan sonra labeldaki yazıyı unicode kısmına (ascii kısmıda bazı durumlarda gerekebilir) yazıp aratmak.Şimdi arama yaptık ve başarılı olduysak karşımza dump penceresi gelecek.Orada “Name:” yazısını görmüş olacağız.Oranın solunda yazan adresi alıyoruz ve ana penceredeki  hex dumpta sağ tıklayıp Goto->Expression diyoruz ve bu adresi yazarak oraya konumlanıyoruz.





    Daha sonra “isim:” yazısını seçip sağ tıklayıp Binary->Edit diyoruz ve gerekli değişikliği yaptıktan sonra okleyip.Değişiklik yaptığımız bölgeyi seçip sağ tıklatıp copy to executable file dedikten sonra karşımıza çıkan pencerede sağ tıklayıp save file diyoruz ve kaydediyoruz.

    Gelelim 4. yöntemimize.Bu sefer system stack’ı izlemeyi öğrenelim.Ekranın sağ alt köşesinde olan pencere.Girdiğimiz bir fonksiyondan nasıl bir üst konuma çıkabileceğimizi göstereceğim.Programı çalıştırıyoruz hata mesajı verdiriyoruz yine ve pause butonuna basıyoruz.Daha sonra sağ alt köşedeki system stack’ı inceleyince bazı string ifadelerin geçtiğini ve en son yapılan işlemin en üstte olduğunu göreceksiniz.Buradaki return to xxxxxx yazann ifadeler bizim geri dönmemizi sağlayacak.Bunların çok işinize yaradığını ileride göreceksiniz.Geri dönüş için return to xxxxxx ifadesine sağ tıklayıp Follow in Disassembler diyoruz ve bir üstten çağrıldığı yere geri dönmüş oluyoruz.



    Bunuda ek not olarak söyleyeyim.Örneğin programımız kısıtlı her yapacağı işlemde programın register olup olmadığını kontrol ediyor ve onu kontrol eden hep aynı fonksiyonu çağırıyor.Bizde işlemleri takip ettik ve fonksiyonun çağrıldığı yeri yakaladık diyelim.O fonksiyonun içine girince en üstteki  satırda sağ tıklayarak Find references to->Selected command diyoruz ve hangi adreslerden çağrıldığına dair karşımıza bir liste çıkıyor.Eğer sağ tıkladığımız yerde adres varsa Adress Constant çıkacak ve o adrese nerelerden ulaşıldığına dair liste karşımıza çıkmış olacak.Bu da işimize çok yarıyor.

    5.Yöntemimiz api aratma.Örneğin program registrye bakarak register olup olmadığını anlıyor ve okuduğu değerleri karşılaştırıp programın register olup olmadığını belirliyor.Bizde RegOpenKeyA apisinin programda kullanıldığı yeri bulursak orada değişiklik yaparak programı önceden register olmuş gibi aldatabiliriz.Bunun için Ctrl+N kısayolula apilerin olduğu pencereyi açıyor ve aradığımız apiyi yani RegOpenKeyA yazıyoruz ve sağ tıklayıp set breakpoint on every reference’a basıp bütün RegOpenKeyA kullanılan yerlere breakpoint koyuyoruz.Eğer girişte program registry’i kontrol ediyorsa programı restart edip çalıştırdığımızda program akışı breakpoint koyduğumuz için duraklayacak ve RegOpenKeyA apisinin çağrıldığı yerde duracak bizde gerekli araştırmaları ve değişiklikleri yapıp programı kırmış olacağız.



    Son olarakta genel olarak yapabileceğimiz birkaç şeyden bahsedeyim.Ollydbg’da search for ,find references to’nun diğer fonksiyonlarını kullanarak  string,komut bloğu,komut,sabit,komuta referans,adrese referans olmak üzere birçok şey aratabiliriz.Hex dump’ın üstündeki pencereyi ve registerları izleyerek gideceğimiz adresi görebiliriz.Self-modifying vs gibi durumlarda breakpointler koyarak şifreli bölgeleri şifrelerinin çözüldüğü anda izleyebiliriz.Yani orası tekrar şifrelenmeden programı duraklatıyoruz ve o bölgeye gözatıyoruz.

    Bunun dışında programına göre daha  birçok yöntem uygulayabiliriz.Gösterdiklerim genel olarak kullanılan yöntemlerdir.Programların korunmasına bağlı olarak yapmamız gereken bazı şeyler değişkenlik gösterebilir.Fakat sonuç hep aynı kapıya çıkacaktır.Bir programı kırmanın birden fazla yolu vardır.

    Bu konu hakkında anlatacaklarım bu kadar.Bu yazı,örnek program ve ekran görüntüleri tamamen FireX’e aittir.Copy paste yapanlar emeğe saygı gösterirlerse sevinirim.Saygılarımla..

    FireX

  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Ayro
    Ayro's avatar
    Kayıt Tarihi: 08/Ağustos/2005
    Erkek
    saolasın firex ellerine sağlık.
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    MaxDreameR
    MaxDreameR's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek
    eline koluna bacanaa saaglık hocam=))
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Leustad
    Leustad's avatar
    Kayıt Tarihi: 04/Mart/2007
    Erkek
    Teşekkürler hoja...
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    EntelKoylu
    EntelKoylu's avatar
    Kayıt Tarihi: 13/Eylül/2005
    Erkek
    parmakların zeval görmesin hacı
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Quetzalcoatl
    Quetzalcoatl's avatar
    Kayıt Tarihi: 21/Mayıs/2006
    Erkek
    paralı programın olıyım crackle beni firex =)
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    efsun
    efsun's avatar
    Kayıt Tarihi: 28/Ağustos/2005
    Erkek
    abi anlamadıgım konu cracklenmicek program yok o zaman :S ee neden parlaı yapıyolar o zamanS:
  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    inside
    FireX
    FireX's avatar
    Bilgi/Destek Madalyası Üstün Hizmet Madalyası
    Kayıt Tarihi: 16/Temmuz/2005
    Erkek
    efsun bunu yazdı:
    -----------------------------
    abi anlamadıgım konu cracklenmicek program yok o zaman :S ee neden parlaı yapıyolar o zamanS:
    -----------------------------

    Abi şimdi olay şu.Küçük firmaların programlarının büyük firmalara oranla daha çok korunduğunu görürsün.Çünkü küçük firmanın pazar payı çok küçük 3-5 kişiye satsamda para kazansam diye bakıyor adam.Ama büyük firmalar zaten pazarın büyük kesimine hitap ettikleri için adamların zaten geliri var.Birde reklamını yapayım diye uğraşıyorlar bunlara göz yumuyorlar bir miktar.İş yerleri falan satın almak zorunda programlarını.Birde hitap ettikleri kesim büyük olunca.Cracker teamlerin hedefide ilk olarak bunlar oluyor.Onunda büyük katkısı var tabi.
  9. KısayolKısayol reportŞikayet pmÖzel Mesaj
    V1PER
    V1PER's avatar
    Üstün Hizmet Madalyası Başarı Madalyası
    Kayıt Tarihi: 12/Mart/2003
    Erkek

    DeAd_BoDiEs bunu yazdı:
    -----------------------------
    paralı programın olıyım crackle beni firex =)
    -----------------------------

    zuahuahaahua :D

    bu arada firex harbi güzel yazıyosun tebrikler, ama ben okumuyorum :) yalan yok bizde, ilgi alanım deil ondan :)

  10. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Tarikat Şeyhi
    HolyOne
    HolyOne's avatar
    Kayıt Tarihi: 01/Haziran/2002
    Erkek
    sağlam döküman olmus
  11. KısayolKısayol reportŞikayet pmÖzel Mesaj
    ExcaliburTBT
    ExcaliburTBT's avatar
    Kayıt Tarihi: 06/Aralık/2005
    Erkek
    Yine güzel bi döküman hoca (:
Toplam Hit: 2362 Toplam Mesaj: 19