INFORMATION

Hello. It's been a long time. I rewrote my experimental operating system's kernel for UEFI. I am still working on the upper layers. I put it on hold because of time issues and not to hurry. (27.08.2022)

Düzenleme(2012): Doküman yazılım güvenliği bilinci oluşturmak üzere eğitim amaçlı yazılmıştır. Hedef alınan program şahsıma aittir ve test amaçlıdır. Yazı lise yıllarıma aittir.

Gerekenler 

Ollydbg 

LordPE 

Benim deneme amaçlı yazdığım,sadece formdan oluşan hedef aldığımız programı buradan indirebilirisiniz. 

Programa basit olması açısından mesaj penceresi ekleyeceğiz.Farklı apileri kullanarak daha birçok şey ekleyebilir.Programa birçok şekilde hükmedebilir,yeni fonksiyonlar kazandırabiliriz.İlk olarak messagebox apisini inceleyelim. 

int MessageBox( 

HWND hWnd, // Sahiplenen pencerenin handle değeri 

LPCTSTR lpText, // Mesaj penceresindeki yazı 

LPCTSTR lpCaption, // Mesaj penceresinin başlığı 

UINT uType // Mesaj penceresinin türü 

); 

Gördüğünüz üzere bu şekilde.Aslında soldan sağa doğru işlem yapmamız gerekirken normalde böyledir.Assemblyde stack’a yolladığımız için tersten yapmak zorundayız.Çünkü stack mantığında son giren ilk çıkar.Aşağıya bakınca olay daha net hale gelecek. 

push 0 //Mesaj penceresinin türü 
push xxxxxx // Mesaj penceresinin başlığı 
push xxxxxx // Mesaj penceresindeki yazı 
push 0 // Sahiplenen pencerenin handle değeri 
call xxxx // Messagebox apisini çağır 

Gördüğünüz üzere tersten verileri stacka yolladık.Mesaj penceresinin türünü 0 olarak belirledik.Çünkü default olarak MB_OK değerini alıyor.Yani tek buton var tıklıyoruz kapanıyor.Evet hayırlı versiyonları falanda var vs.Mesaj penceresinin başlığı ve yazısındaki xxxxxler adres oluyor.Oralardan ascii değerleri çağıracağız.Mesaj penceresi bağımsız olacağından handle değerini 0 yapıyoruz ve en sonda messagebox apisini çağıracağız. 

Öncelikle ollydbgda programı açıyoruz ve kendimize veri yazabileceğimiz boş yerler arıyoruz.Dosyaların sonunda yeterince alan oluyor.Resimde görebilirsiniz. 

 

Yeterince alan bulduktan sonra kendimize herhangi bir yer seçip üstteki assembly kodlarını yazıyoruz.Kodu yazıp assemble dedikten sonra nop çıkarsa önemsemeden üstüne tıklayarak kodu yazmaya devam edin.Nop hiçbirşey yapmadan program akışına devam etmeyi sağlar.Aşamaları resimde görebilirsiniz.String değerleri girmeyi aşağıda göstereceğim.Alttaki resimde gözüken adresler onların çağrıldığı yerler. 

 

Messagebox apisini çağırmak için adresini bulmamız gerek adresini bulmamız için Ctrl+N tuşuna basıyoruz ve karşımıza apilerin olduğu pencere geliyor.Orada messagebox yazıyoruz ve MessageBoxA apisi geliyor.Ona sağ tıklayıp “Find references to import” diyoruz.Karşımıza çıkan pencerede jmp dword ptr... olarak giden yerin adresini alıyoruz ve call’un yanına bu adresi yazıp assembly tuşuna basıyoruz.Eğer doğru adresi girdiysek olly apiyi gösteriyor. 

 

Şimdi messagebox’ın caption ve text kısmına yazacağımız string ifadeleri yazalım.Alt taraftaki boş alanlardan herhangi bir yer belirleyip çoklu alan alan seçiyoruz ve sağ tıklayıp binary->edit diyoruz.Ne kadar çok alan seçerseniz o kadar uzunlukta yazı yazmaya yeriniz olacak.Edit’e bastıktan sonra çıkan pencerede ascii kısmını doldurarak yazımızı yazıyoruz ve onaylıyoruz.Biraz boşluk bıraktıktan sonra yine aynısını yaparak bir string ifade daha giriyoruz.Birisi caption diğeri text olacak.Yazıları girip onayladıktan sonra garip assembly komutları gözükecektir bunlara aldırmayınız.Şimdi en önemli kısıma gelirsek boş alanı nerden seçmeye başladıysak oranın adresini alıyoruz.Örneğin 0044CB1E adresinden seçmeye başladık ve aşağıya doğru indik yazımızı yazdık ve onayladık.O kapladığı alan kadarı dolduracaktır.Bizim için başlangıç adresi önemli .Girdiğimiz iki string ifadeninde başlangıç adresini aldıktan sonra yukarıda belirttiğim push xxxxx olan yerleri dolduruyoruz.Hangisini text hangisini caption(başlık) yapmak istiyorsanız orası size kalmış. 

 

İşlemleri doğru yapıp yapmadığınızı kontrol etmek amacıyla sağ tıklayıp analysis analyse code derseniz messagebox penceresinde hangisi title hangisi caption hOwner vs hepsini göreceksiniz. 

 

Şimdi yapacağımız bir işlem daha var.Her programın bir giriş noktası(entry point) vardır.İşletim sisteminin loaderı bu değeri PE Headerdan okur ve ona göre programın akışının başlayacağı adresi belirler.Biz program açılır açılmaz mesaj penceresi gözüksün istiyoruz.O yüzden programın giriş noktasını mesaj penceresini göstermek için yazdığımız kodların başlangıcı yaparsak mesaj penceresi gösterilir ve asıl programın akışına devam edilir.Bizim burada yapacağımız programın giriş noktasını değiştirip mesaj penceresi yazdığımız kodların olduğu bölümden başlatıp (alttaki resimde gözüküyor) oradan itibaren program akışını devam ettirmek.Mesaj penceresini gösterdikten sonrada önceki değiştirdiğimiz orjinal giriş noktasına zıplayarak devam etmek. 

 

Öncelikle yaptığımız değişiklikleri kaydedilim ve ondan sonra giriş noktasını değiştirelim.Kodların arasında herhangi bir yer seçip sağ tıklayın copy to executable->all modifications->copy all Çıkan pencerede tekrar sağ tıkayıp save file diyoruz ve kaydediyoruz.Şimdi giriş noktasını değiştirmeye gelirsek; 

Giriş noktasını ollydbg ile değiştirebiliriz.Fakat olayı daha basit yoldan çözmek için lordPE isimli programı kullanıyoruz. 

Entry point’i Olly ile değiştirecekler; 
Üstteki menüden M(Memory) harfinin olduğu tuşa basın.Hemen altta PE Header göreceksiniz ona tıklayın.Aşağıya inin “AdressofEntryPoint” göreceksiniz.Adresini alın ve hexdumpta(ana penceredeki) oraya gidin(Sağ tıklayıp go to->expression) Gittiğiniz adreste entry pointi göreceksiniz.Yeni enrty pointi aynı formatta tersten yazın. Örneğin 44 CA FD ise FD CA 44 yazacaksınız(little endian düzeni) 
Daha sonrada değişiklik yaptığınız yeri seçerek sağ tıklayıp copy to executable dedikten sonra save file diyoruz. 

LordPE ile değiştirecekler; 
Programı açtıktan sonra PE Editor butonuna tıklıyoruz ve kaydettiğimiz programımızı seçiyoruz.Karşınıza çıkan pencerede Entry Point bölümünü göreceksiniz.Oraya yeni giriş noktasını yazıp save tuşuna basıyoruz okleyip programı kapatıyoruz ve programımızı test ediyoruz. 

 

Dikkat: Ollyde gördüğünüz RVA cinsinden değeridir.Image base değeri 400000 olduğu için toplamı cinsinden gözükmektedir.Ollyde 44CA98 iken LordPE ile açtığınızda 04CA98 olarak göreceksiniz.Sizde adresi yazarken 400000 eksiğini yazacaksınız yani entry point yapmak istediğiniz yer 44CAEA ise 04CAEA olarak yazacaksınız. 

Bu konuda anlatacaklarım bu kadar.