"Ulead Gif Animator v5.0" |
|
|
|
|
|
Araçlar:
|
|
|
Tatile çıkmadan önce bir yazı yazmak istedim.Aslında renaTgaD tarafından mecbur ediledim desem daha doğru olur.Bu yazı Vbox hakkında.Program vbox'ın v4.3 olduğunu söylüyor ama ben bundan şüpheliyim.Çünkü vboxlarda uyguladığım taktik bu programda çalışmadı.Neyse sizi en az 15 gün uğraştıracak bir programı kıralım :)
|
|
Vbox Rsagent gibi Try before buy tipi bir koruma sistemi.Rsagenta göre oldukça kaliteli ve sık sık update ediliyor.Memory patch yeni versiyonlarında yine imkansız çünkü kendini memory de de kontrol ediyor.Bize kalan tek çözüm yine unpack.Paketlenmiş programın OEP'ini bulmak o kadar zor değil.Asıl mesele import tablosunu yeniden oluşturmak.Vbox import tablosunu Asprotect e göre çok daha karmaşık bir şekilde bozuyor.Bu programı kırmanın en zor kısmı import tablosunun yeniden oluşturulması.Import tablosunu oluşturmak için Revirgin i kullanıcaz.Import Reconstructor'a göre oldukça buglı olmasına rağmen Vbox ı bir tek bu halledebiliyor.Importu rebuild ederken sanıırm 20-30 defa program göçtü beraberinde windows u da götürdü tabi :). Ayrıca programın softice kontrollerine karşılık icedump ı yüklemeniz gerekmektedir.Yeniden olayı 3 kısma ayırıyoruz.
Sabah saat 4.00 de başlayan macera saat 8 gibi bitti.Kabiliyetimden şüphe etmeye başladım.
KISIM I Unpack
Vbox exeyi paketledikten sonra kendi kodunu exeye yazıyor.Vbox lisans,zaman bu gibi şeylerle uğraşıyor.Eğer bunlar geçerli ise dialog ekranı çıkıyor.Sonra import tablosunu bir güzel bozuyor.Bazı import bilgileri sağlam kalırken bazılarını kendi call'ına yönlendiriyor.O yüzden Procdump pedump vs gibi şeyler import tablosunu oluşturduklarını sanıyorlar ama sonuç hep hüsran oluyor.
Programı çalıştırın ve Dialog ekranı geldiğinde SoftICE'a geçin ve
bpx getprocaddress
e breakpoint koyun.Neden getprocaddress? .Eğer programcı iseniz veya win32.hlp dosyanız varsa bunun ne olduğunu biliyorsunuzdur.Bu fonksiyon bir fonksiyonun dll deki adresini bulur.Bu ne işe yara direkt dll lere link etmek yerine Getprocaddress ile fonksiyonun adresini alıp çağırabilirsiniz.VBox da her bir importun adresini alıyor.Bozduğu importları çağırmak için bu adreslere ihtiyacı oluyor.
Şimdi Try butonuna tıklayın.Karşınıza şöyle birşeyler gelecektir.
016F:0700BB39 FF15C8210407 CALL [KERNEL32!GetProcAddress] 016F:0700BB3F 8BF8 MOV EDI,EAX 016F:0700BB41 3BFB CMP EDI,EBX 016F:0700BB43 0F849D010000 JZ 0700BCE6 016F:0700BB49 8B7616 MOV ESI,[ESI+16] 016F:0700BB4C 037508 ADD ESI,[EBP+08] 016F:0700BB4F 395DDC CMP [EBP-24],EBX 016F:0700BB52 7435 JZ 0700BB89 ;bu jump *sanırım* bozulan importlara karar veren jump 016F:0700BB54 8D85ECFEFFFF LEA EAX,[EBP-0114] 016F:0700BB5A 50 PUSH EAX 016F:0700BB5B FF75E0 PUSH DWORD PTR [EBP-20] 016F:0700BB5E 57 PUSH EDI 016F:0700BB5F E8FD030000 CALL 0700BF61 016F:0700BB64 83C40C ADD ESP,0C 016F:0700BB67 85C0 TEST EAX,EAX 016F:0700BB69 741E JZ 0700BB89 016F:0700BB6B FF7528 PUSH DWORD PTR [EBP+28] 016F:0700BB6E 57 PUSH EDI 016F:0700BB6F FF7524 PUSH DWORD PTR [EBP+24] 016F:0700BB72 FF7520 PUSH DWORD PTR [EBP+20] 016F:0700BB75 E884020000 CALL 0700BDFE 016F:0700BB7A 83C410 ADD ESP,10 016F:0700BB7D 3BC3 CMP EAX,EBX 016F:0700BB7F 0F8451020000 JZ 0700BDD6 016F:0700BB85 8906 MOV [ESI],EAX 016F:0700BB87 EB02 JMP 0700BB8B 016F:0700BB89 893E MOV [ESI],EDI 016F:0700BB8B FF45D8 INC DWORD PTR [EBP-28] 016F:0700BB8E 8B45D8 MOV EAX,[EBP-28] 016F:0700BB91 3B45B4 CMP EAX,[EBP-4C] 016F:0700BB94 0F8C49FEFFFF JL 0700B9E3 016F:0700BB9A 6A01 PUSH 01
Programda bir sürü import olduğuna göre eğer biz sürekli F5 e basarsak yıllarca debug ederiz.Softice da iken Pagedownu tuşu ile alta doğru inin.Bu call'ın sonunda leave satırı görüceksiniz.O satıra çift tıklayın ve bpx koyun.Şimdi
bd 0
ile ilk breakpointimiz olan getprocaddressi kapatıyoruz.F5 ile softice dan çıkın.2-3 sn sonra yine softice da olucaksınız.Şu an leave satırında olmanız lazım.Bu sefer de
bd 1 be 0
ile getprocaddress breakpointini aktif hale getirip bu callın sonuna koyduğumuz bpxi kapatıyoruz.Şimdi F5 tuşuna 11 kez basın.F12 ye bastığınızda Karşınızda şöyle bir kod olucak.
016F:01CB025A FFD0 CALL EAX 016F:01CB025C 85C0 TEST EAX,EAX 016F:01CB025E 89838C000000 MOV [EBX+0000008C],EAX 016F:01CB0264 750F JNZ 01CB0275 016F:01CB0266 5F POP EDI 016F:01CB0267 5E POP ESI 016F:01CB0268 5D POP EBP 016F:01CB0269 B803372400 MOV EAX,00243703
Bundan sonra F8 tuşu ile trace etmeye başlıyoruz.Sonunda şöyle bir satıra denk geliceksiniz.
016F:01CB0513 FF506C CALL [EAX+6C] 016F:01CB0516 8B4DFC MOV ECX,[EBP-04] 016F:01CB0519 C7416400000000 MOV DWORD PTR [ECX+64],00000000 016F:01CB0520 EB1C JMP 01CB053E 016F:01CB0522 8B55F8 MOV EDX,[EBP-08] 016F:01CB0525 8B4214 MOV EAX,[EDX+14] 016F:01CB0528 8945F0 MOV [EBP-10],EAX 016F:01CB052B 8B5DF0 MOV EBX,[EBP-10] 016F:01CB052E FFE3 JMP EBX ;işte sevgili OEPimiz
İşte OEP i bulduk.01CB052E satırında iken Ebx i değerine bakarsanız 004E071E olduğunu görürsünüz.Yine aynı satırın üstünde iken
a eip jmp eip
yazın.Bu şekilde programı memory de loopa sokmuş olduk.Peditor ile task listten ga_main.exe yi seçin ve Dump full ile dump edin.Daha sonra peditor ile task listten terminate process ile kaldırın.Sonra dump ettiğiniz exeyi peditor ile açıp OEP e (4E071E-400000) E071E yazın..Programı çalıştırın.Program hata verecektir.Bundan sonra en zor kısım geliyor.Import tablosunu yeniden oluşturmak.
KISIM II Import tablosunu oluşturmak.
İşte benim 3-4 saatimi alan en zor kısma geldik.Sabırsız biriyseniz ve 15-20
defa bilgisayara reset atamam diyorsanız boşuna uğraşmayın.Bu program harbi
mahfediyor adamı.
İlk başta dump ettiğimiz exenin bir kopyasını alın.Bazen revirgin sapıtabiliyo.Orjinal programı açın ve try butonuna basarak çalıştırın.Şimdi Revirgin'i açın.Process listesinde ga_main.exe yi seçin.OEP yerine yerine 4E071E yazın ve Fetch Iat tuşuna tıklayın.Sağdaki listeye bakarsanız importların bazıları doğru bazıları da bomboş.Şimdi şu adımları dikkatle takip ediyoruz.
Uzun uğraşlar sonunda bütün importlarımız tamir edilecektir.Iat Generator e tıkladığınızda size importu nasıl savelemek istediğiniz soracaktır.Herhangi bir dosya ismi ile saveleyin mesela imp.bin.Daha sonra import tablonuz rebuild edilecektir.Sanırım olay bitti.Parmaklarımızı kıstırıyoruz ve dump edilen exeyi çalıştırıyoruz.Has***** yine hata verdi.Kafamda saç kalmıycak be herşeyi yapmadık mı?.Tekrardan şu import tablosunu inceliyelim.İnceliyoruz,inceliyoruz....... evet birşeyler bulduk sanırım.
index IAT_address value hint module function --- -------- -------- ---- -------- -------- 00000000 001A RPCRT4.dll I_RpcBindingInqDynamicEndpointA
Bu rpcrt4.dll yanlış bir import.Şimdi bütün bunları silmemiz gerekiyor.Bu importların olduğu satılara gelin.Sağ tuş tıklatıp Edit deyin Sonra 5 hanedeki herşeyi silin.Bu haldeyken Iat generator ile dump exenizi rebuild edin.Evet artık olması lazım çünkü bende daha reboot edicek derman kalmadı.
YUPİİİİİİİİİİİİİİİİİİİİİİİİİİİİİİİİ :)
Program çalıştı.Acaip sevindirik oluyosun Stop kendine gel :=)
Ben import tablomu buraya koydum karşılaştırma yapabilirsiniz.Eğe import tablonuz benimki gibiyse ve yine de çalışmıyorsa Revirginde Mangled Scheme check boxına tıklayıp o haldeyken Iat Builder a tıklayın.
Not: 01/9/2001
Bozuk olupta bizim sildiğimiz importlar yüzünden windows2k da problem çıkıyor.Bu yüzden tamamen çalışan bir dump için o bozuk importların değerlerini (ordinal değerleri ve isimleri önemli) yazıp öyle rebuild etmeniz gerekiyor.
KISIM III Patch
Programda benim gördüğüm iki dandiklik var.Birisi her açılışta çıkan Nag ekranı birde Banner.Adamlar bu kadar olmaz yani trial versiyon programına banner koymuş.Sanıırm bazı bilgileri de yolluyordur muhtemelen kendi sayfasına.Bu yüzden bunları düzeltmemiz gerekecek.İlk başta Nag ekranını halledelim.W32Dasm ile dissamble ederseniz daha iyi olur.Softice'dan sıkıldım biraz.Dump ettiğimiz exenin resoursunna bakıyoruz.Bizim nag ekran dialoğunun numarasını buluyoruz.Exescope ile dialoglardan 300 numaraya bakarsanız bizim dialog olduğunu görürsünüz.W32Dasm ile bu dialoğun nerden çağrıldığı bulmak için 300 ü hex değerine çeviriyoruz.Bu da 12C ediyor.W32Dasm de Dialog references e tıkluıyoruz ve Dialog: DialogID_012C satırına tıklıyoruz ve onun üstündeki jmplar call lar vs lerile oynayarak programın nagını kaldırıyoruz.
Birde banner var demiştik.Banner küçük bir internet explorer penceresinden bannerları gösteriyor.Dikkat ederseniz klasörde opas diye gizli bir klasör var ve bunun içinde de bannerlar vs bulunuyor.Herhalde bu işleri OPASMgr.dll yapıyordur diye düşünebiliriz.Çünkü Ulead daki programcılar herşeye anlamlı isimler veriyorlar.OPASMgr.dll nin exportlarına bakarsanız şunları görürsünüz.
CreateOpasAD DestroyOpasAD
Heh sizce bunlar olabilir mi?.Dissamble ettiğimiz dosyanın import tablosuna tıklayıp bu dll import edilmiş mi diye bakıyoruz.Aaaaa! import edilmemiş!.Peki nasıl oluyor da adamlar bu fonksiyonu kullanabiliyorlar.Yazının başında ne demiştik? GetProcaddress diye birşey var :).Adam dll yi yükleyip o fonksiyonun adresini alıyor.Daha sonra istediği zaman çağırabiliyor.W32Dasm da CreateOpasAD ı arıyalım
* Possible StringData Ref from Code Obj ->"opasmgr.dll" ;yüklencek dll
|
:0047ACD0 68F0215200 push 005221F0
* Reference To: KERNEL32.LoadLibraryA, Ord:0239h ;yükle bakalım
|
:0047ACD5 FF1588214F00 Call dword ptr [004F2188]
:0047ACDB 85C0 test eax, eax ;dll yüklendimi ?
:0047ACDD A3645F5200 mov dword ptr [00525F64], eax ;yüklenen dllni handleini sakla
:0047ACE2 7427 je 0047AD0B ;yüklenmediyse zıpla
:0047ACE4 56 push esi
* Reference To: KERNEL32.GetProcAddress, Ord:01ADh
|
:0047ACE5 8B358C214F00 mov esi, dword ptr [004F218C] ;Getprocaddresini esiye salla
* Possible StringData Ref from Code Obj ->"CreateOpasAD"
|
:0047ACEB 68E0215200 push 005221E0 ;CreateOpasAD fonksiyonun
:0047ACF0 50 push eax ;dll deki
:0047ACF1 FFD6 call esi ;adresini bul
:0047ACF3 A35C5F5200 mov dword ptr [00525F5C], eax ;adresi sakla
Program CreateOpasAD ı çağıracağı zaman, 00525F5C adresini çağıracaktır.W32Dasm ile bunu ararsak şunu görürüz.
:0047AD30 A15C5F5200 mov eax, dword ptr [00525F5C] ;Createopasd :0047AD35 85C0 test eax, eax ;0 mı yoksa :0047AD37 741F je 0047AD58 ;o zaman çık :0047AD39 8B4C2414 mov ecx, dword ptr [esp+14] :0047AD3D 8B542410 mov edx, dword ptr [esp+10] :0047AD41 51 push ecx :0047AD42 8B4C2410 mov ecx, dword ptr [esp+10] :0047AD46 52 push edx :0047AD47 8B542410 mov edx, dword ptr [esp+10] :0047AD4B 51 push ecx :0047AD4C 8B4C2410 mov ecx, dword ptr [esp+10] :0047AD50 52 push edx :0047AD51 51 push ecx :0047AD52 FFD0 call eax ;bannerı göster :0047AD54 83C414 add esp, 00000014 :0047AD57 C3 ret * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0047AD37(C) | :0047AD58 33C0 xor eax, eax :0047AD5A C3 ret
Burayı istediğiniz gibi patch edebilirsiniz.Ben olsam şey yaparım.0047AD30 satırına gelirim ve A1 i C3 ile değiştiririm.Bu şekilde direkt ret yapmış olur.
İşte bu kadar program unpack edildi importu düzeltildi patch edildi.Hadi size
kolay gelsin bana da iyi tatiller :)
|
|
Bu yazıda yazım yanlışları hatta bilgi hatası olabilir.Eğer bir yanlış bulursanız bana email atın düzeltmeye çalışırım.Bir programı eğer gerçekten kullanıyorsanız, programı satın almayı düşünün.Micro$oft programlarını - bırakın satın almayı - kullanmayı bile düşünmeyin.