folder Tahribat.com Forumları
linefolder Assembly - Reverse Engineering
linefolder Reverse Engineering - Kod Enjeksiyonu



Reverse Engineering - Kod Enjeksiyonu

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

    Merhaba arkadaşlar bu yazımda sizlere herhangi bir programa nasıl kod enjekte edebileceğimizi göstereceğim.

    Gerekenler

    Ollydbg

    LordPE

    Benim deneme amaçlı yazdığım,sadece formdan oluşan hedef aldığımız programı burdan 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.Bu yazı,program ve ekstra dökümanlar tamamen FireX tarafından hazırlanmıştır.Kopyalayanlar emeğe saygı duysunlar.Saygılarımla..

    -anonimleştirildi-



    λ
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Quetzalcoatl
    Quetzalcoatl's avatar
    Kayıt Tarihi: 21/Mayıs/2006
    Erkek
    Reverse Engineering yazısını görünce aklıma hemen sen geliyosun firex =)
    yine süper bi döküman olmuş eline sağlık..

    Özgürlüğü anladıkça ona daha az sahip olursun.
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    ExcaliburTBT
    ExcaliburTBT's avatar
    Kayıt Tarihi: 06/Aralık/2005
    Erkek

    Reverse Engineering de bir dünya markası = FireX :)

    Süper doc yine bunuda arşive kodum.

    Ellerine sağlık.

  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    EntelKoylu
    EntelKoylu's avatar
    Kayıt Tarihi: 13/Eylül/2005
    Erkek
    firex gene yaptın yapacagını firex o bir dunya markası:)

    ANDY // Burası mezopotamya, küresel oyunun bumerang cehennemi. Tanrı bile dünya düzeni için peygamberlerini hep buraya göndermiş. Çünkü burası aslında yeryüzü cennetiymiş. Daha Fazla Bilgi İçin Profilimi İnceleyiniz...
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    wasd
    wasd's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek
    Hani şu crackingde yapılan cracklar patchlar böyle extra kodlar esas çalıştırıcıya enjekte ediliyor sanırım?Doğrumu düşünüyorum?

    :)
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    renegadealien
    renegadealien's avatar
    Üstün Hizmet Madalyası Savaş Madalyası Başarı Madalyası Üstün Hizmet Madalyası Developer Madalyası
    Kayıt Tarihi: 23/Mart/2003
    Erkek

    Eklendi..

    Süper hoca...


    Sanıyorum kendi atasözümü yaptım, kaynak belirterek kullanabilirsiniz. 10.05.2013 tarihli google arama sonucu : Aradığınız - "herşeyin hayırlısı rampanın bayırlısı" - ile ilgili hiçbir arama sonucu mevcut değil. Not : Söyleyeni belli olduğu için(Ben) atasözü değil, özlüsöz oluyormuş, dolayısı ile kendi özlüsözümü yapmış oldum :)
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    inside
    anonim6918524
    anonim6918524's avatar
    Banlanmış Üye
    Bilgi/Destek Madalyası Üstün Hizmet Madalyası
    Kayıt Tarihi: 16/Temmuz/2005
    Erkek
    ---RudeboY--- bunu yazdı:
    -----------------------------
    Hani şu crackingde yapılan cracklar patchlar böyle extra kodlar esas çalıştırıcıya enjekte ediliyor sanırım?Doğrumu düşünüyorum?
    -----------------------------

    Kısmen, bazı programlarda zıplama noktasında veya bazı kodlarda değişiklik yapmak yeterli oluyor.Kod ekleme kilit noktada boş alan bulamadığımız zaman gerçekleştirilen bir olay.Bir programda onlarca kontrol noktası,zıplama noktası varsa bu program register edilmişmi diye bütün zıplama noktalarını kaldırmakla uğraşılmaz.Mesela ax registeri 0 ise register edilmemiş 1 ise register edilmiş diyelim.Programın register edilip edilmediğinin kontrol edildiği yerde sonuca göre registere değer yükleniyor ve hafızada saklanıyor.Yeri geldiğinde o hafıza noktasına erişilip kontrol ediliyor.Bizde kaynağına inip register edildi edilmedi diye değeri registera yükleyen yeri buluyoruz ve orada ona 1 değerini veriyoruzki register edildiğini sansın.Fakat bazen buna yer yetmeyebiliyor.Eğer üstüne yazarsak dosyayıda bozarız.Bizde dosyada boş bir alan arayıp oraya ekstra kodumuzu ekleyip program akışını oraya yönlendiriyoruz işlem tamamlandığında tekrar eski yerine yönlendirerek normal halinde programı akışına bırakıyoruz.

    λ
  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    wasd
    wasd's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    FireX bunu yazdı:

    -----------------------------
    Kısmen, bazı programlarda zıplama noktasında veya bazı kodlarda değişiklik yapmak yeterli oluyor.Kod ekleme kilit noktada boş alan bulamadığımız zaman gerçekleştirilen bir olay.Bir programda onlarca kontrol noktası,zıplama noktası varsa bu program register edilmişmi diye bütün zıplama noktalarını kaldırmakla uğraşılmaz.Mesela ax registeri 0 ise register edilmemiş 1 ise register edilmiş diyelim.Programın register edilip edilmediğinin kontrol edildiği yerde sonuca göre registere değer yükleniyor ve hafızada saklanıyor.Yeri geldiğinde o hafıza noktasına erişilip kontrol ediliyor.Bizde kaynağına inip register edildi edilmedi diye değeri registera yükleyen yeri buluyoruz ve orada ona 1 değerini veriyoruzki register edildiğini sansın.Fakat bazen buna yer yetmeyebiliyor.Eğer üstüne yazarsak dosyayıda bozarız.Bizde dosyada boş bir alan arayıp oraya ekstra kodumuzu ekleyip program akışını oraya yönlendiriyoruz işlem tamamlandığında tekrar eski yerine yönlendirerek normal halinde programı akışına bırakıyoruz.
    -----------------------------

    Yani şu "made backup" seçeneği o yüzden konuyor patchlere.Sorun olursa geri alabilmek için :) süper yararlı bir döküman daha :) bir bu,birde şu 0lar 1ler çok işe yarar crackingde :) sağolasın :) 


    :)
  9. KısayolKısayol reportŞikayet pmÖzel Mesaj
    AntiOksidan
    AntiOksidan's avatar
    Kayıt Tarihi: 03/Ekim/2005
    Erkek
    bir firex klasiği : ) .ona buna eyv saol demeden de paylaşım yapılabiliyor demek ki ; ) saol firex süper olmuş.dökmanlara eklenmş zaten
Toplam Hit: 2809 Toplam Mesaj: 9