"WinVDR 2.2" |
| |
| |
|
Araçlar:
|
| |
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.
| |
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!!!! :)
| |
Bö!