"WinVDR 2.2"

Mr_Stop
Program Url: http://www.artech365.com
Program Tipi: Capture Programı
       Araçlar:
 SoftICE, Code Snippet Creator, MASM32 
Basit ()  Orta (x)  Zor (x )  Pro ( ) 

Başlangıç

Canımın sıkıldığı bir gün bu programla uğraşıyım dedim.İlk başta kolay olucağını düşündüğüm bu program beni epey uğraştırdı.Bu yazıda size unpack yapmadan nasıl inline path yaparız yine bunun üstünde durucam.

Yazı

Programın bir önceki versiyonu çok basit bir algoritma ile korunuyordu biliyorum çünkü keygen yazmıştım :) .Ben TV kartı ile capture ederken bunu kullanıyorum.WDM kartlarını destekleyen ve Avi formatında capture eden program bulmak çok zor.Bu program olmasa favori dizim Ekmek Teknesini nasıl capture edebilirdim.

Neyse konumuza dönelim.Ben yeni versiyonunu download ettiğimde eski keygenin çalışmadığını farketttim.Programın keygen algoritmasını incelediğimde ECDSA ile korunduğun gördüm.Program ECDSA için borzoi diye bir C++ kütüphanesi kullanıyor ilgilenenler google ile arayıp bakabilirler.Birkaç ECDSA yazısını okduuktan sonra bana bundan ekmek çıkmıycağını anladım.Bende işimi görüyüm diyerekten bari patch ediyim dedim.

Program Neolite ile sıkıştırılmış.Unpack etmek oldukça basit biraz trace edin.

0167:00632FC5  E871030000          CALL      0063333B
0167:00632FCA  FE05BA2F6300        INC       BYTE PTR [00632FBA]
0167:00632FD0  FFE0                JMP       EAX ;OEP

Oepin olduğu yerde klasik processi durudurup dump edin veya Icedump'ın pedump ı ile dump edin hiç bir problem olmıyacaktır.Şimdi kayıt fonksiyonunu inceliyelim.Programın SoftICE kontrolü olduğunu da hatırlatmak isterim o yüzden icedump vs gibi SoftICE ı gizleyen bir programın yüklü olmasına dikkat edin.Kayıt olayını biraz incelerseniz programın export tablosundan ilginç fonksiyonların olduğunu göreceksiniz. _G_IsRegistered mesela bana baya bilginç geldi.Bu offsete olana refereransları IDA ile inceliyince bu adresin programın kayıtlı olup olmadığını belirlediğini farkettim.Mesela

00590E4C IS_REG          dd offset _G_IsRegistered ;burasının ismini IDA da ben değiştirdim.

...
00414B44:
		call	sub_562A70
pop ecx
test cl, cl
jz short loc_414B5B;serial doğru mu ?
mov eax, IS_REG
mov byte ptr [eax], 0 ;serial yanlış program demo .... 00414C4A: mov ecx, IS_REG
mov al, [ecx] ;program kayıtlı mı
test al, al
jnz loc_414F6C ;kayıtlı ise buraya zıpla

Bizim yapacağımız şey _G_IsRegistered bölgesine 1 yazmak böylelikle program kayıtlı hale geelcektir.İki adreste de bu dediklerimi yaparsanız programın kayıtlı hale geldiğini göreceksiniz.Hatta sadece en alttaki adresteki yeri değiştirseniz de program kayıtlı olabilir kim bilir :).

Ama ben unpack edip sonra da patch etmeyi pek sevmedim o yüzden inline path yapmayı denedim.Program unpack olduktan sonra patch kodumu programa yazacaktım.Programda boş bir adres buldum ve 632FCA adresinden benim patch bölgesine zıpladım.Orada patch yapmaya kalkınca program hata vermeye başladı.Bu gerçekten ilginç bir durumdu.Programın section karakteristiği yazmaya uygundu.Ayrıca eğer o bölgeye yazmak yasak olsa program nasıl unpack oluyordu ?.Unpack fonksiyonunu incelerken bu büyük sırrın cevabını buldum VirtualProtect.

Neydi bu virtualprotect api dokumanlarına bir bakalım.

The VirtualProtect function changes the access protection on a region of committed pages in the 
virtual address space of the calling process. This function differs from VirtualProtectEx, which 
changes the access protection of any process.


BOOL VirtualProtect(

    LPVOID  lpvAddress,	// address of region of committed pages 
    DWORD  cbSize,	// size of the region 
    DWORD  fdwNewProtect,	// desired access protection 
    PDWORD  pfdwOldProtect 	// address of variable to get old protection  
   );	

Bu fonksiyon verilen bir adresin koruma haklarını değiştirebiliyor.Neolite unpack işi bittikten sonra o bölgenin haklarını PAGE_READONLY şeklinde değiştiriyor.Bizim yapacağımız şey önce patch yapacağımız adresinin hakkını PAGE_READWRITE şeklinde değiştirmek daha sonra patchi yapmak.Şimdi önümüzde bir sorun daha var virtualprotect fonksiyonu programın import tablosunda yok ama biz biliyoruz ki Neolite bu fonksiyonu kullandığına göre bu apinin adresi bir yerde mutlaka var.Ben bpx Virtualprotect ile o fonksiyona breakpoint koydum.SoftICE durduğunda F12 ile geri döndüğümde Call [ebp+6e] den geriye döndüğümü gördüm.dd ebp+6e yaptığımda kaşıma çıkan adres BFFA0A42 idi bu adreste Virtualpotect in kerneldeki adresine karşılık geliyordu.Biliyoruz ki mesela bizim virtulaprotect adresi 86FE0C de olsun.Programı SoftICE ile izleyin 632FCA adresinden sonra ebp nin değerine bakın.ebpnin değeri bende 86FF78. Ben bunların farkın aldım.86FF78-86FE0C = 16C. Demekki unpack olduktan sonra virtualprotect fonksiyonu ebp-16ch adresinde bulnuyormuş.Ebp ve esp den başka bir register a bu konuda güvenemeyiz.Çünkü bu iki register pointer registerlarıdır.Neyse patchimize geçelim.Ben Code Snippet Creatoru kullanıcam.Yeni proje açın ve winvdr.exe yi seçin önceden yedek almayı unutmayın herhangi bir ihtimale karşı.Daha sonra Code Snipprt Creatorun editörüne şunları yazın

push eax  ;eax ta biliyorsunuz OEP var onu stack a push ederek saklıyoruz.


push offset 632FCAh ; burası eski korumanın olacağı bölge.Unpacker kodunun olduğu bir bölge önemsiz
push 4 ;yeni koruma(PAGE_READWRITE=4)
push  1F4h ;büyüklük olarak bu kadar yeter
push 414B27h ;addres
call dword ptr[ebp-16Ch] ;virtualprotect
test eax,eax ;fonksiyonun başarılımı
jz @F ;patch yapma
mov ecx,414B55h
mov byte ptr[ecx],1 ;buralar patch adresleri
mov byte ptr[ecx+260],0C6h
mov byte ptr[ecx+262],01h
mov byte ptr[ecx+263],90h
mov byte ptr[ecx+264],0E9h
mov byte ptr[ecx+265],0Ah
mov byte ptr[ecx+266],3h
mov byte ptr[ecx+267],00
mov byte ptr[ecx+269],90h
@@:
ret ;eax yani OEP i push etmiştik ret yapınca direkt OEP deyiz.Bir taşla kuş katliamı

Daha sonra code snippet creator ile patchi assemble edin.Patch Options da

SNIPPET_VA=400100
Patch Into Existing Section (x)
Redirect Control From Code Section (x)
Virtual Address=632FCA
Dont return Control to program (x)

Bu opsiyonlar ile patchi assemble edip patchlediğinizde programın cillop gibi çalıştığını göreceksiniz.Aman sabahlar olmasın!!!! :)

Son Notlar

Bö!