folder Tahribat.com Forumları
linefolder Assembly - Reverse Engineering
linefolder Reverse Engineering - Self Modifying



Reverse Engineering - Self Modifying

  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 dökümanımla Reverse Engineering hakkında yazdığım dökümanlara son vermiş bulunuyorum.Reverse Engineering hakkında hemen hemen her türlü konudan bahsettim,uygulayarak gösterdim.Genel birçok konuyu konulara ayırarak,detaylardanda yazı aralarında bahsettim.Dökümanlar öncedende söylediğim gibi assembly ve programlama mantığını iyi kavramış kişilere yönelik yazdım.Çünkü sadece assembly yada programlama bilmekle bu iş olmuyor.Reverse Engineering ayrı bir konu.Dökümanlar bu konuyla uğraşan arkadaşlar için klavuz olacak, ileriye taşımak yada daha fazla detaya inmek size bağlı olacaktır.Forumda kaldığım sürece dökümanlarım hakkında yada Reverse Engineering konuları hakkında sorularınız varsa hepsini cevaplamaya çalışacağım.Dökümanlarımı birbiriyle bağlantılı olarak yazdım.O yüzden en eskisinden en yenisine doğru gidiniz.Ayrıca bu konularla ilgili çektiğim videolarada assembly/reverse engineering bölümünden ulaşabilirsiniz.Okuyan arkadaşlar yorumlarını eksik etmezlerse sevinirim.Umarım Türkçe Reverse Engineering döküman eksiğini bir ölçü azaltabilmiş ve tahribat.com üyelerine bu konuda birşeyler verebilmişimdir.Bu konuda desteğini esirgemeyen arkadaşlara ve tahribat.com döküman arşivine ekleyen reneye teşekkür ederim//

    Merhaba arkadaşlar bu yazımda self-modifying’den bahsedeceğim. Self-modifying’e programın verilerini şifreleme tekniği diyebiliriz.Örneğin yazdığımız programı kısıtlı ve register edince sınırlamalar kalkıyor diyelim.Seri numara doğru girilince “Teşekkür ederiz.Programınız kaydedildi” gibi bir mesaj penceresi çıkarttığımızı varsayalım.Eğer programı korumadıysak 1 dakika içerisinde stringleri taratıp çıkan tabloda bunun yerini bulabilir ve hangi adresteyse oraya gidebiliriz.Yada güvenlik önlemi alınmamış programın assembly kodlarının ortada olması programın kısa sürede analizi ve kırılmasıyla sonuçlanır.

    Selfy-modifying tekniğinde program kendisi üzerinde değişiklik yapar.Her birleştiği dosyada farklı görünüm alan virüslerde buna örnektir.Self-modifying mantığını açıklarsak;

    Öncelikle elimizde programımızı şifreleyecek harici bir program olduğunu düşünelim.İlk olarak harici program programımızın verileri çeşitli matematiksel işlemlerden geçirerek farklı bir görünüme sokar.Daha dosyaya programın verilerini eski haline getirecek kod eklenir.Son olarakta Entry point(başlangıç noktası) kodların eklendiği yerin ilk kodundaki adrese ayarlanır.

    Burada unutmamamız gereken önemli bir nokta var.Assembly’den bildiğiniz üzere her programın code ve data section’ı var.İşletim sistemi ve platformlara göre bunun dışında birçok section daha var.Fakat bunlar temel olanları.Code section çalıştırılabilir ve okunabilir.Data section ise okunabilir ve yazılabilir.Yani gördüğünüz üzere code section’a yazma izni verilmiyor.Eğer code section’a veri yazılmak istenirse program orada kırılır.Bunun için PE Header’da değişiklik yaparak.Code section’ın characteristics değerine yazılabiliri ekleyeceğiz.Bu şekilde code section’a veri yazabileceğiz.

    Çalışma mantığına gelirsek.Hatırlarsanız verileri eski haline getirecek kod eklemiş ve entry point’i buraya ayarlamıştık ve code section’ı yazılabilir hale getirmiştik.Programı akışı entry pointten başlayacak ve programa eklenen döngülerle ve işlemi terse çeviren matematiksel işlemlerle programımızın orjinal verileri eski haline getirilecek.Herşey tamamlandığında programımızın OEP (Original entry point) zıplanacak ve program akışına devam edilecek.

    Programımızı korumasının yanında kötü niyetli program yazan kişilerde bu yöntemi kullanarak antivirüslerden programlarını gizleyebilmekteler.Fakat günümüzde antivirüsler genel olarak bu tür şeylere karşı duyarlı hale geldiler.Fakat hala işe yaramakta.Örneğin programımızın kodlarını eski haline getirip bir yerden sonra yeniden şifreleyebiliriz.Şöyle düşünürsek;

    Örnek amacıyla bu şekilde gösterilmiş.Yoksa program akışında böyle çizgisel bir ilerleyiş yoktur.Aralarda dallanmaya sebep olacak fonksiyonlar,zıplamalar vs olabilir.Yani 45500de program 60000’e gidip sonra geri dönüşle 50000den devam edebilir.

    45000 Alttaki verileri çöz
    ...
    46000 Üstte kalan verileri tekrar şifrele,alttakileri çöz
    ...
    48000 Üstte kalan verileri tekrar şifrele,alttakileri çöz
    ...

    Bu şekilde devam ettiğini düşünelim program akışının.Önceden geçtiğimiz yerleri tekrar şifreliyor.Sonradan geçeceğimiz yerlerin bir kısmınıda çözüyoruz.

    Bunları anlattıktan sonra gerçek bir program üzerinde bunu kısaca uygulayalım.

    Gerekenler

    Ollydbg

    LordPE (Entry point ve code section’ın karakteristiğini Olldbg’da PE Headerda değişiklik yaparak değiştirebiliriz.Fakat bu programla kısa sürede kolay bir şekilde bu değişiklikleri yapabiliriz)

    Örnek program olarakta sadece form’dan oluşan Kod Enjeksiyonu dökümanımda kullandığım programımı kullanıyorum.Tahribat dosya arşivinden buradan indirebilirsiniz.

    Ayrıca kodların eklendiği örnek programı da buradan indirebilirsiniz.

    Öncelikle kendimize boş alan arıyoruz ve yeterli alanı bulduğumuzda seçerek çift tıklıyoruz.



    Karşımıza gelen pencereden itibaren ve takiben programı şifrelememize yarayan kod bloğunu yazıyoruz.Programın sadece küçük bir kısmında yapacağız bu işlemi.Yani sadece üstteki resimde gözüken kod bloğunu.

    MOV ECX,44CA98              //Programı OEP’den itibaren şifrelemeye başlıyoruz.ECX’e OEP değerini veriyoruz.
    XOR DWORD PTR DS:[ECX],12345 // 12345 ile xorluyoruz
    INC ECX  // ECX’i arttırıyoruz
    CMP ECX,44CADE  // Kod bloğunda resimde görüldüğü üzere son adres 44CADD Son olarak DDli biten                                                                                  adresinde üstünden geçiyor ve 1 artıyor.Bizde 1 üstü olan DE ile karşılaştırıyoruz.
    JNZ SHORT 0044CAED // ECX 0044CAED olana kadar xorlamaya devam ediyoruz.Olduysa program akışına devam ediyoruz.

    Aynı işlemi tersine çevirecek kod bloğu. Xorlardığımız birşeyi tekrar aynı değerle xorlarsak karşımıza aynı sonuç çıkar.

    MOV ECX,44CA98
    XOR DWORD PTR DS:[ECX],12345
    INC ECX
    JNZ SHORT 0044CB01
    JMP SHORT 0044CA98  // İşlem tamamlandıysa OEP’e zıplıyoruz.



    Şimdi olayı açıklayalım.Programımıza önce şifreleyecek daha sonrada çözecek kod bloğu yerleştirdik.Resimde gözüken kod bloğunun ilk adresinden son adresine kadar hepsini xorlayacağımız için bir döngüye ihtiyacımız var.ECX’e ilk adresin değerini veriyoruz ve o registerdaki değeri,yani içerisindeki adresi pointerla işaret ediyoruz. İşaret ettiğimiz adresteki verileri bizim belirlediğimiz herhangi bir değerde olabilir bu 12345 ile xorluyoruz.ECX’i 1 arttırıyoruz.Son adrese geldikmi diye kontrol ediyoruz.Gelmediysek xorladığımız yere geri dönüyoruz.

    İşlem tamamlandığında anlamsız veriler göreceğiz.Yani şifrelendi.F8 ile adım adım izlerseniz anlık olarak olayı takip edebilirsiniz.

    Daha sonra şifreyi çözeceğimiz yere geçiyoruz yine aynı mantıkla karşılaşıyoruz.Aynı değerle tekrar xorluyoruz ve değerler eski haline dönüyor.Son adrese ulaşmamızı kontrol ediyoruz.Geldiysek zaten program deşifre olmuş oluyor ve OEP’e zıplıyoruz.

    Şimdi xor’dan bahsedelim. Xor kullanmamızın sebebi bir veriyi xorladıktan sonra çıkan veriyi tekrar xorlarsak eski veriyi elde edebiliyoruz.Örneğin abc 123 ile xorlanınca BF9 değeri ortaya çıkıyor. BF9 ile 123’ü xorlarsak tekrar abc değerini elde ederiz.Bunun yerine and kullandığımızı düşünelim ve sonuçlara bakalım.Aynı zamanda xor’u açıklayalım.

    XOR                               Çıkan değeri tekrar XORluyoruz

    1 0 1 0                          1 0 0 1
    0 0 1 1                          0 0 1 1
    -------                             --------
    1 0 0 1                          1 0 1 0


    AND                             Çıkan değeri tekrar ANDliyoruz

    1 0 1 0                         0 0 1 0
    0 0 1 1                         0 0 1 1
    -------                            --------
    0 0 1 0                         0 0 1 0

    Gördüğünüz üzere AND ile ilk değeri geriye getiremedik.Olayın işleme mantığı bitlere göre olduğu için.Bitleri göstererek anlattım.Matematiksel mantıksal kapılar..

    Verilerimizi şifrelerken başka geri getirme garantisi olan başka matematiksel işlemlerden de faydalanabilirdik.Fakat işlem çok uzamasın diye genel olarak kullanılan xordan bahsettim.

    Şimdi LordPE ile programın entry pointini(şifreleme için yazdığımız ilk kod - 0004CAE8) değiştirelim ve code section’ı yazılabilir hale getirelim.





    Ve yaptığımız değişikleri kaydediyoruz.Herşeyi doğru yaptıysak programımız sorunsuzca çalışıyor.

    Şimdi programın işleyişiyle ilgili birkaç ekran görüntüsüne gözatalım.









    Ollydbg self-modifying olan programlarda olay karıştığı için yanlış gösterebiliyor.O yüzden kod ekranında sağ tıklayıp analysis->remove analysis seçerseniz daha düzgün bir şekilde takip edebilirsiniz.Eğer remove analysis çıkmıyorsa analiz edilmemiştir.O şekilde devam ediniz.En son OEP’e zıpladığınızda eski kodları aynen göreceksiniz.

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

    FireX

  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    MaxDreameR
    MaxDreameR's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek
    teşekkür etmekten yorulduk bee! =))) eywallah hacı, ben işlerimi bi toparlasam şunlara baştan bida bakıcamda =/
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Leustad
    Leustad's avatar
    Kayıt Tarihi: 04/Mart/2007
    Erkek
    Ben karar verdim bu adamın bi yerlerinde motor var eheuheuheu
    Hoja şaka bi yana valla takdire şayan şeyler yapıyorsun sağol okuyacağım...
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Ayro
    Ayro's avatar
    Kayıt Tarihi: 08/Ağustos/2005
    Erkek
    açıklıyoruz firex aslında sırf döküman yazmak için yapılmış bir holy botudur.Sizinde fark ettiğiniz gibi hiç bir insan bu akdar dökümanı veremez.Bir kaç eleman toplaşıp dökümanlar buluyoruz firex adında ekliyoruz oh be rahatladım.
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Musket
    Musket's avatar
    Üstün Hizmet Madalyası
    Kayıt Tarihi: 09/Haziran/2002
    Erkek
    zumsuk bunu yazdı:
    -----------------------------
    açıklıyoruz firex aslında sırf döküman yazmak için yapılmış bir holy botudur.Sizinde fark ettiğiniz gibi hiç bir insan bu akdar dökümanı veremez.Bir kaç eleman toplaşıp dökümanlar buluyoruz firex adında ekliyoruz oh be rahatladım.
    -----------------------------
    Açıklamasaydın keşke sırrımızı ?
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    efsun
    efsun's avatar
    Kayıt Tarihi: 28/Ağustos/2005
    Erkek
    abi şükür bitirdim dökümanları bunları okumak için bize 1-2 ay wer sonra yenilerine başlarsın:D
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    EntelKoylu
    EntelKoylu's avatar
    Kayıt Tarihi: 13/Eylül/2005
    Erkek
    hacı deadın dedigi gibi firex programın olam crakle beni:D olum yeter hepsini bi ekitap haline getirip tek seferde yayınlasan daha süper olcak
  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    blue_dream
    blue_dream's avatar
    Kayıt Tarihi: 04/Mart/2007
    Erkek
    bi firex basyapıtı daha... tskler.
  9. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Ravage
    Ravage's avatar
    Kayıt Tarihi: 02/Ocak/2006
    Erkek
    artık alıstım ooooooo ne çok bilgililer var demiyorum BU KESİN FİREX diyorum saol firex kardesim...
  10. KısayolKısayol reportŞikayet pmÖzel Mesaj
    tatarramazan
    tatarramazan's avatar
    Kayıt Tarihi: 08/Ekim/2003
    Erkek

    şimdi o 45500 den 60000 e atlıo ya

    neyse boşver :))))

     

     

  11. 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
    tatarramazan bunu yazdı:
    -----------------------------
    şimdi o 45500 den 60000 e atlıo ya

    neyse boşver :))))
    -----------------------------

    Evet hoca onbinlerce satır asm kodu var.Dikey dalışa geçiyor :)

Toplam Hit: 1782 Toplam Mesaj: 16