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. Hedef alınan program şahsıma aittir ve test amaçlıdır. Yazı lise yıllarıma ait olduğundan sürç-i lisan ettiysem af dilerim.

Merhaba arkadaşlar.Bu yazımda P-Code ile derlenmiş Visual Basic uygulamaları üstünde çalışmaktan bahsedeceğim.Visual Basic’de bilindiği üzere iki çeşit derleme tipi var.Native ve P-Code.Native bildik düz derleme biçimi.Native olarak derlenmiş programları debuggerımız(Ollydbg vs) disassembler eder ve üzerinde sorunsuzca çalışabiliriz.Fakat P-Code ile derlenmiş bir uygulamayı Ollydbg ile açtığımızda bir miktar asm kodu ve geniş veri alanları görürüz.P-Code programlama dilleriyle alakasız,kısaltma amacıyla konulan ve çalışma zamanında yorumlayıcı tarafından yorumlanan ara koddur.Avantajı programın boyutunun küçülmesini sağlaması.Fakat native’e göre performans düşüyor.Sebebi ara dilden çevrilirken vakit kaybedilmesi.

Asıl konumuza gelirsek.P-Code derlenmiş bir uygulamada Ollydbg işimizi görmüyor.Bu sebeple VB P-Code uygulamalarına özel bir debugger olan Wktvbdebugger kullanmamız gerek. 

Gerekenler 
Wktvbdebugger 
VB Decompiler Lite/Pro (Lite yeterli) 
Flexhex veya herhangi bir hex editör 

Örnek programı buradan indirebilirsiniz. 

Öncelikle örnek programımıza önbakış atarsak; Şifreye göre diğer forma geçmemizi sağlayan basit bir uygulama.Şifreyi yanlış girincede “Yanlış şifre!” mesaj 
penceresi çıkıyor. 

 

Not: Programın olduğu klasörde debugger için MSVBVM60.DLL bulunması gerekiyor. 

Programımızı debugger ile açmadan önce VB decompiler lite ile bir gözatalım ve bize gereken yerin/yerlerin adreslerini alalım. 

Butona tıklanınca gerçekleşen olayı seçtiğimizde resimde gördüğünüz üzere bir sürü garip kod bizi karşılayacak.Bunlar kısaltma amacıyla konulmuş ve hepsinin 
birer karşılığı var.Örneğin BranchF ile koşula göre belirli adrese zıplanıyor.Şifre yanlışsa zıplanarak program akışına devam ediliyor. 

 

Şimdi command1_click’in en başındaki P-Code’un adresini not edelim.Bu adrese debuggerda breakpoint koyacağız ve orayı analiz edeceğiz.Adresi not ettiysek 
VB Decompiler’ı kapatalım ve debuggerı açalım.Programı seçelim ve üstteki menüden run’a basarak çalıştıralım. 

 

Debuggerda kodların gözükeceği siyah ekranda sağ tıklayıp show bpx list’i seçin ve çıkan pencerede not aldığınız adresi yazıp add butonuna basarak ekleyin.Artık 
butona tıkladığımızda program akışı orada duraklayacak ve orayı adım adım ilerleyerek analiz etmiş olacağız.KısayoluOllydbg’dakiyle aynı (F8) Breakpoint’i 
koyduysak kafamızdan şifre sallayıp butona basalım ve olaya girelim. 

 

Butona tıkladıktan sonra program akışı breakpoint koyduğumuz noktada duraklayacak ve karşımıza gördüğünüz küçük ekranda kodlar gelmiş olacak.Dilerseniz memory dump butonuna basıp bulunduğunuz adresi girip oradaki kodların assembly karşılıklarınıda görebilirsiniz.Hatta dump edebilir yada text olarakta kaydedebilirsiniz. 

 

 

Şimdi F8 ile ilerleyip programı analiz edelim.İlerlerken stack ekranındaki değişiklikler göze çarpacak,burası bizim için önemli.String işlemleri gördüğünüz üzere göz önünde ve şifreyide burada görmüş oluyoruz.Fakat bu her zaman bu kadar kolay olmayabilir.Orada gördüğünüz p-codelar hakkında daha fazla bilgi sahibi olmanız gerekebilir veya assembly’e çevrilmiş şekillerinide memory viewer’dan inceleyebilirsiniz.Şifreyi girin ve diğer forma geçin. 

 

Şimdi diğer olaya geçelim.Diyelimki şifreyi bulmak yerine programı patchleme yoluna gittik.Yapacağımız şifrenin doğru olup olmadığına göre zıplayan zıplama komutunda değişiklik yapmak.Öncelikle debuggerda zıplama noktasının adresini alıyoruz.Debuggerda 41028F olarak geçecek.Bu RVA cinsinden değeridir.400000 imagebase değeri ekleniyor.Hex editörümüzde ise 0’dan başlıyor.41028F’den 400000 çıkartarak 1028F olan adresimizi bulup oraya konumlanacağız yada dilerseniz.O bölgenin hexadecimal değerlerini not edip hex editörünüzde aratıp orayada ulaşabilirsiniz. 

Hex editörümüzde adresimize konumlanıyoruz ve 1C E7 00’ın olduğu bölüme geliyoruz.E7 BranchF'in opcodu, 1C ise ne kadar ilerleyeceğini belirleyen hexadecimal değer.Hatırlarsanız şifre yanlışsa zıplıyordu.Bizim yapacağımız 1Cyi 04 ile değiştirip bir sonraki komuta zıplaması(!?) ve program akışına devam etmesi.04 yapmamızın sebebi kendisinin 3 byte yer kaplaması ve 4.de zaten diğer komutun başlangıcı oluyor.Bu şekilde kaydedersek şifre ne olursa olsun butona basınca diğer forma geçecek.