Announcements

Hello. It's been a long time. I have translated many of my latest projects and documents. I have hidden the all Turkish content except the document about the A* algorithm. I will translate it but I decided to keep it for a while because of the time issue. Also, there are a lot of old projects of mine are waiting to be translated.

Thanks.

Düzenleme(2012): Doküman yazılım güvenliği bilinci oluşturmak üzere eğitim amaçlı yazılmıştır. Örnek yazılımlar eski olup test amaçlı kullanılmışlardır. Yazı lise yıllarıma ait olduğundan sürç-i lisan ettiysem af dilerim.

Artık günümüzde programları korumak adına packer kullanmak zorunlu hale gelmiştir.Packerlar verileri şifreleme,self-modifying,pe headerda değişiklikler yapma,api redirect,stolen bytes ve crc check gibi yöntemleri kullanırlar.Packerlar sadece tecrübesiz crackerlarda işe yararlar.Packerların memorye programın tamamını açmak zorunda olması,kullandıkları teknikler birbirine benzemektedir. 

Packerlar programı packledikten sonra tekrar dosyayı hafızada açmaya yarayacak kodların olduğu bölümün başlangıcını entry point(başlangıç noktası) olarak belirlerler ve program akışı başlar.Döngüler ,şifrelenen verilerin tekrar matematiksel işlemlerle eski haline getirilmesi,IAT’ın(Import adress table) yaratılması ve memory’de harici bir program ile erişilip verilerde değişiklik yapılıp yapılmadığının kontrolü vs. 

Üstte anlattığım bazı kısımlar yabancı gelmiş olabilir.O yüzden geçmişte yazdığım dökümanlara ve PE Header hakkında bilgi sahibi olmanızı tavsiye ederim. 

Packlenmiş bir program debugger ile açtığımızda anlamsız stringler ve nitelik taşımayan kod toplulukları görürüz.Bunun sebebi packerın self modifying yöntemiyle oraları matematiksel işlemlerden geçirerek eski haline sokacak olmasıdır.Self-modifying programın kendi üstünde değişiklikler yapmasıdır.Yani programı packlediğimiz zaman şifrelenir ve şifrelenmiş veriler kaydedilir bunun yanında şifrelenmiş verileri çözecek kodda dosyaya eklenir. 

Piyasada kullanılan aspack vb yaygın packerlar güvensizdir.Çünkü bunlara unpackerlar yazılmış ve haklarında birçok döküman bulunmaktadır.Tecrübesiz bir cracker bunları edinir ve unpack edip işine devam etmesi zor olmaz.Bunun için kaliteli fakat hakkında fazla bilgi bulamayacağınız packerları tercih etmelisiniz.Konumuz unpacking olduğu için reverse engineering’e karşı alınabilecek önlemler isimli dökümanımı referans göstererek buraları es geçiyorum. 

Packerlar kısmen birbirinden farklıdırlar.Çünkü programın işleyişine zarar vermemek için belirli bir çizgide devam etmek zorundadırlar.Bu yüzden packerlara karşı genel yöntemler türemiştir.Öncelikle packlenmiş bir dosya ile karşılaştığımızda ilk yapmamız gereken boş yere vakit kaybetmemek için bir unpacker aramaktır.Onuda bulamadıysanız o packerı nasıl unpack edebileceğimizle ilgili döküman ,ollydbg scripti en kısa yoldan aradığımız kilit noktalara nasıl ulaşabiliriz vs.O da olmadıysa kendimizle baş başa kalırız.Bu gibi durumlarda ne yapmamızı bilmemiz gerek.Çünkü her zaman birilerine bağımlı kalmak lamerliktır.Bunu vakitten kazanmak amacıyla yapıyoruz sadece. 

Kendi yazdığım sadece formdan oluşan örnek programı aspack ve pe compact gibi önde gelen packerların şu anki son sürümleri (Aspack 2.12,PE Compact 2.78) ile packledim.Unpacking işlemini gerçekleştirirken aralarda genel olan farklı unpacking tekniklerinden de bahsedeceğim. 

Programları buradan indirebilirsiniz 

Önemli not: "packed.zip" isimli dosyanın şifresi "reverseeng" dir. Şifreyi koyma sebebim antivirüslerin packed exeleri yanılarak virüs sanması ve bu sebeple siteyi zararlı olarak göstermesidir. Dosyanın son taranmış hali şu şekildedir. Tarama sonuçlarındaki tutarsızlıklara alttaki linkten bakabilirsiniz. 

virustotal.com analizi için tıklayınız 

Görüleceği üzere her antivirüs yanılarak farklı bir şeyi işaret etmektedir. Dilerseniz kendiniz de şifrelenmiş olan dosyaları çıkarıp farklı yerlerde taratabilirsiniz. 


Gerekenler 

Ollydbg 

Ollydbg dump plugin (Burdan indirebilirsiniz) 

Import Reconstructor (IAT’ı(Import adress table) düzeltmek için ihtiyacımız önemli araç) 

LordPE 

Opsiyonel 

Peid veya Rdg packer detector (Programın hangi packerla packlendiğini tespit eden kullanışlı iki program rdgyi tavsiye ederim.Fakat ben formlara kolaylık olsun diye hangi packerı kullandığımı yazdım) 

Öncelikle ollydbgda programı açıyoruz ve gözatıyoruz. 

 

Resimde gördüğünüz üzere olly bizi dosyanın self-modifying,sıkıştırılmış olabileceği konusunda uyarıyor.Compressed code... yazan mesaj penceresinde noya basarak geçiyoruz. 

Öncelikle yapmamız gereken orjinal giriş noktası OEP(Original Entry Point)’i bulmak.Burası asıl programın başladığı nokta.Packer çeşitli işlemlerden geçirerek programın tamamını memory’e açar.Açmak zorundadır.Hepsi aynısını yapar.Çeşitli döngüler,karşılaştırmalar,matematiksel işlemler yerine getirilir ve programın tamamı memorye açıldığında OEP’e zıplanır ve program normal akışına devam eder.Bizde OEP’in yerini bulursak oraya ulaştığımızda programın tamamı hafızaya açılmış olacak ve onu dump ettiğimizde memorydeki tüm o bölgedeki verileri bir dosyaya kopyalamış olacağız ve dosya unpack olmuş olacak.Daha sonra packerın eklediği ekstra segmentleri vs temizleyebiliriz boyutu düşürmek için.Oraları artık işe yaramaz olacak çünkü.Programı dump edince tekrar eski giriş noktasına ayarlarlanacak ve artık packerın kodlarının bulunduğu bölümler kullanılmayacak. 

Unpacking başlı başına bir uğraştır.O yüzden bazı packerlarda OEP’i bulmak zaman alabilir.ESP registerına hardware breakpoint koymak en yeni packerlarda bile OEP’i bulmakta işimize yaramaktadır.Aspackta buna karşı önlem alınmıştır.Bunun yanında ollydbg’ın debugging options bölümünde sfx tabında yapılan değişikliklerde OEP bulunabilir.Fakat fazla işe yaradığı söylenemez.Diğer bir yöntem program açıldığında pause edip stack penceresindeki herhangi bir konuma gidip sürekli program akışını takip ederek üst konumlara ulaşmak ve program akışının başladığı OEP’e kadar takip etmek.Yada programı başından itibaren izlemek ve ulaşmak.Bu da çok uzun zaman alacaktır. 

Bütün packerların kendine göre bir açığı vardır.Aspackte bunu kullanacağız.ESP’ye Hardware breakpoint koymak işimizi görmediği için.Aspackte OEP’e zıplamadan önceki kod bloğunu arayacatacağız.Bu bütün aspack kullanılmış programlarda aynıdır.Asppack’ın zaafıdır. 

Sağ tıklıyoruz ve search for->all sequences’a basıp 

 

push 0 
ret 

 

yazıyoruz ve aratıyoruz.Karşımıza çıkan pencerede push 0’ı göreceksiniz ona tıklayın ve o bölgeye konumlanın. 
ret dönüş komutundan sonra OEP’e ulaşmış olacağız.Ret’e çift tıklayarak breakpoint koyuyoruz ve programı çalıştırıyoruz.Breakpoint program akışı durdurmuş olacak ve ret’in olduğu yerde kalacağız.F8 tuşuna basarak 1 satır devam ediyoruz ve OEP’e ulaşıyoruz. 

Bundan sonraki işlemleri yaparken OEP üzerinde olmamız önemli! 

Sağ tıklıyoruz ve çıkan menüde (*Ollydbg dump eklentisi) dump debugged process’e basıyoruz yada lordPE programından aktif çalışan programlar arasında bizim programımızı bulup sağ tıklayıp dump full diyoruz ve kaydediyoruz. 

 

 

Ollydbg eklentisi kullananlar için bir pencere gelecek. 

 

Rebuild importtaki tick’i kaldırıp diğerlerine dokunmadan dump ediyoruz.Api redirectiondan dolayı import adress tableda sorun yaşayacağız çünkü. 

Şimdi yapmamız gereken import reconstructer ile bu sorunları ortadan kaldırmak.Programı açıyoruz ve OEP bölümüne bulduğumuz OEP’den base image değerini çıkartıyoruz.Imprec programında yazıyor.Örneğin programımızda image base değeri 400000 ve OEP 44DCDC bundan image basse değerini çıkartıyoruz 44DCDC-400000=4DCDC oluyor.Bu değeri yazıyoruz ve IAT Autosearch’e basıyoruz.Doğru bulmuşsak değerler gelecek. 

 

Bulduktan sonra get imports tuşuna basıyoruz ve apiler geliyor.Ondan sonra show invalid tuşuna basarak sorunlu olan varmı diye kontrol ediyoruz ve karşımıza birkaç tane çıkacak aspack sayesinde.. 

 

Karşımıza ilk çıkana gözatalım.Sağ tıklayalım ve disassemble tuşuna basalım.Karşımıza assembly kodları gelecek burada yani geçerli.Eğer anlamsız veriler vs gelseydi sağ tıklatıp cut thunk deyip silecektik.Bu crackerı şaşırtmak amacıyla konulmuş birşeydir. 

Gördüğünüz üzere geçerli ve düzeltmemiz gerektiğinden bahsetmiştim rva adresi ile image base’i toplayıp (100 ise imagebase 400000 olduğu için 400100) ollydbg’da hex dump içerisinde sağ tıklayıp go to->expression bölümüne bu adresi yazıp o bölgeye gideceğiz. 

Imprecte gözüken ptr değerini burada little endian şekliyle tersten yazıldığını göreceksiniz.Oraya gerçek api adresi daha sonradan yazıldığı için tespiti için resimde görüldüğü şekliyle hardware breakpoint kullanacağız ve üstteki menüden reset(<<) tuşuna basacağız. 

 

Programı çalıştırıyorz ve her oraya veri yazdığında program duraklayacak.İlk durakladığımız yerde işe yarar birşey yok.Fakat ikinci durakladığımız yerde aradığımız şeyi bulacağız. 

 

Evet aradığımız şey “GetVersion” apisi.Buraya çift tıklayarak breakpoint koyuyoruz. 

Şimdi imprec’i açıp bulunamayan apiye tıklayıp karşımıza gelen pencereden getversionu bulup seçiyoruz. 

 

Üstte breakpoint koymamızın sebebi IAT’ın orada bir döngü içerisinde oluşturulması ve o beklediğimiz yerde sağ üst köşeden hangi api olduğunu gözlemleyebilmemiz. 

Ollydbg’da çalıştır tuşuna basın ve programın her bastığınızda orada durakladığını ve sağ üst köşede api isimlerinin yazdığını göreceksiniz.Imprecteki tabloya baktığınızda sırayla ilerlediğini göreceksiniz.Burayı ve imprecteki listeyi takip etmeniz önemli örneğin GetStartupInfoA apisinden sonraki yer geçersizse sırada o gözükecek ve onu seçeceksiniz. Teker teker adresleri alınarak hardware breakpoint konularakta yapılabilir fakat 12 apide sorun olduğu için işimiz daha uzun sürer. 

Ben ilk apiyi örnek olarak gösterdim.Diğerlerini siz bulabilirsiniz.Ben kayıp apilerin isimlerini vereceğim kontrol etmeniz amacıyla. 

-Kernel32.dll GetVersion 
- Kernel32.dll GetProcAdress 
-Advapi32.dll RegQueryValueExA 
- Advapi32.dll RegOpenKeyExA 
- Advapi32.dll RegCloseKey (Sonra gelenlerde aynı) 
- Advapi32.dll RegQueryValueExA 
- Advapi32.dll RegOpenKeyExA 
- Advapi32.dll RegCloseKey 
- Kernel32.dll GetVersionExA 
- Kernel32.dll GetVersion 
- Kernel32.dll GetProcAddress 
- Kernel32.dll CompareStringA 

Gördüğünüz üzere api redirectionda kullanılan apiler belirli.Genelde hep aynı şeyler karşımıza çıkar.Diğer packerlar içinde geçerlidir bu. 

Eğer tüm apiler geçerli hale geldiyse show invalide basınca karşımıza geçersiz adres çıkmıyorsa fix dump tuşuna basıyoruz ve daha önceden dump ettiğimiz dosyayı seçiyoruz.Eğer dump edince dump.exe ismini verdiysek impres dump_.exe isimli dosya oluşturacak. 

ve son olarak dosyamızı test ediyoruz.Eğer bir yerde hata yapmadıysak sorunsuz olacak çalışacaktır. 

Şimdi PECompact ile packlediğim programa gelelim. 

Bunda tek fark OEP’i ESP’ye hardware breakpoint koyarak bulabilmeniz.OEP’i bulma dışında yapacaklarınız tamamen aynı. 

Ollydbgda programı açıyoruz ve F8 ile ile ilerliyoruz.ESP değeri değiştiğinde espye sağ tıklayıp follow in dump diyoruz.Hex dumptaki değerleri seçip sağ tıklayıp breakpoint->hardware on access’i seçiyoruz ve breakpoint koyuyoruz. 

 

Bundan sonra reset(<<) tuşuna basıp programı çalıştırıyoruz.Her o bölgeye erişimde program duraksayacak 3 defa tıkladıktan sonra karşımza jmp eax gibi şüpheli birşey gelecek. OEP’emi zıplıyor diye düşündükten .F8’e basıp sonra karşımıza OEP gelmiş olacak.Bundan sonrada dump edeceksiniz.Import adress table’ı imprec yardımıyla düzelteceksiniz.Aynı şeyleri tekrar ediyoruz. 

 

Packerlarda jmp ve ret olan bölgelere dikkatle bakmamız gerekir.Oradan OEP’e zıplıyor olabilir.Diğer bir konu gösterdiğim packerlar api redirection kullanıyorlardı.Bazı kalitesiz packerlarda bunları yapmamıza gerek kalmaz.Sadece OEP’i bulup dump etmemiz yeterlidir.Eğer dump ettiysek fakat çalışmıyorsa fakat imprectede apilerle ilgili sorun gözükmüyorsa packerın PE headera zarar vermesinden dolayıdır.Buna çözüm olarak LordPE programında ki Rebuild PE butonuna basar ve PE Headerı yeniden oluşturursanız sorununuz ortadan kalkar.Bunlara rağmen sorun devam ediyorsa dosyanın orjinal ismi a.exe olması gerekiyorken sizi dump.exe yapmanızdanda kaynaklanabilir.Birçok ihtimal var.