Reverse Engineering - Self Modifying

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.

Tarih:
Hit: 3145
Yazar: FireX

Taglar: reverse engineering - self modifying


Yorumlar


Siftahı yapan siz olun
Yorum yapabilmek için üye girişi yapmalısınız.