"Ulead Gif Animator v5.0"

Mr_Stop
Program Url: http://www.ulead.com
Program Tipi: Gif Animator
       Araçlar:
 SoftICE, Revirgin, Peditor v1.7, Icedump
Basit ()  Orta ( )  Zor ( )  Pro (x ) 

Başlangıç

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 :)

Yazı

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 :)

Son Notlar

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.