"DzSoft Perl Editor v4.5"

Mr_Stop
Program Url: http://www.dzsoft.com
Program Tipi: Perl Editor
       Araçlar:
 SoftICE, Import Reconstructor v1.2, Peditor v1.7, Icedump ,DeDe v2.5
Basit ()  Orta ( )  Zor ( )  Pro (x ) 

Başlangıç

Bu program Asprotect ile korunmuş.Asprotect aslında gerçekten çok kaliteli ve güzel bir koruma hem exenizin boyutu ufalıyor hemde güzel bir korumaya sahip oluyorsunuz.Antidebugging,antidumping,bir sürü antisi var yani.Ayrıca programcılar RipeMD 160 , MD5, RSA-1024 gibi kripto sistemlerini de programlarına sorunsuzca katmış oluyorlar.Bu yüzden keygen yazmak hayal(DAMN grubu bir kaç tane çıkarttı o da RSA-1024 teki random number generatorun zayıflığından ötürü).Bir sanat eseri yani.Peki bu kadar iyi olmasına rağmen niye bu kadar çabuk kırılıyor.Nedeni basit.Siz eğer bütün bir cracker aleminin dikkatini çekerseniz daha fazla kişi o program hakkında uğraşır.Ne kadar kişi uğraşırsa da bir iş o kadar kolaylaşır.O yüzden size tavsiyem kendinize özgü kuvvetli korumalar kullanmanız.

Yazı

Asprotect import tablosunu bozup keni koduna yönlendiriyor.O yüzden direkt dump edildiğinde çalışmaz.Zaten gerçek entrypointi bulmak da oldukça zor bir iş.Trace etmeye kalkıştığınızda polymorphic kodlar ile karşılaşıyosunuz.Softice kontroller tam anlamıyla bir baş belası yani.Biz bu yüzden olayı 3 kısma ayırıyoruz.

Asprotectin softice koruması var bunu geçmek ve kullandığımız başka şeyler içinde icedump ı yüklemeniz gerekmekte.Icedump nasıl kullanılır vs onu bu yazıda anlatarak zaten uzun olucak bu yazıyı daha da uzatmak istemiyorum.SoftICE,icedump,peditor ve import reconstructorı download edin çünkü eğlence başlıyor hmm veya baş ağırları bakıcaz :)

KISIM I Unpack

Bildiğiniz üzere genelde unpackerler programı packledikten sonra unpack kodunu exenin sonuna yerleştirirler.Daha sonra programın OEP'ini oraya yönlendirirler.Bizim ilk baştaki amacımız en son sectiondan ilk sectiona geldiğinde programı durdurup dump etmek.İlk sectiona geldiğinde biliyoruz ki program unpack edilmiş olucak.Asprotect burada da zekice şeyler yapıyor.Bazen ilk sectiona geri dönüp bazı kontroller yapabiliyor.Bu yüzden siz unpack olduğunu sanabilirsiniz o yüzden dikkatli olmak gerekiyor.Şimdi biz unpack kodunun en son noktasını nasıl bulucaz ? Bu anda icedump'ın çok hoş bir özelliği devreye giriyor, tracex.

Tracex in mantığı şu, siz OEP olucak yeri tahmin ediyorsunuz.Ki bunu tahmin etmek zor değil.Genelde ilk secitonda oluyor.Tracex e aralık veriyorsunuz ve tracex o aralıktaki bir kod çalıştırıldığında duruyor.Tracex in kullanımı da şöyle

 -tracex başlangıçadresi bitişadresi 

Icedump yüklü iken softice a geçin ve GetDiskFreeSpaceA ya bpx koyun.Bu sayede daha az trace etmiş olucaz.Asprotect bu apiyi kullanıyor çünkü.Softice durduğu zaman F11 e basın.(bazen oleaut32.dll ye gelebilirsiniz.O yüzden bir kez daha F11'e basın)Artık Asprotect kodunun içindeyiz.Şimdi tracex komutunu kullanıcaz.Ama bunun için ilk sectionın başlangıç ve bitiş adresini bilmemiz lazım.SoftICE da iken şunu yazın

map32 pleditor
PLEDITOR            0001  016F:00401000  0011E000  IDATA RW
PLEDITOR 0002 016F:0051F000 00004000 IDATA RW

Gördüğünüz gibi ilk section 401000 dan başlıyor ve 51F000 de sona eriyor.Bu noktada iken şu komutu kullanıyoruz.

-tracex 401000 51F000

Softice belli bir süre sonra durucak karşınızda şu kodlar olucak.

0167:0051E7CD  8D4000              LEA       EAX,[EAX+00]
0167:0051E7D0  55                  PUSH      EBP 
0167:0051E7D1  8BEC                MOV       EBP,ESP
0167:0051E7D3  81C4F0FDFFFF        ADD       ESP,FFFFFDF0
0167:0051E7D9  53                  PUSH      EBX 
0167:0051E7DA  56                  PUSH      ESI
0167:0051E7DB  57                  PUSH      EDI
0167:0051E7DC  B870E85100          MOV       EAX,0051E870
0167:0051E7E1  8945FC              MOV       [EBP-04],EAX
0167:0051E7E4  33D2                XOR       EDX,EDX
0167:0051E7E6  55                  PUSH      EBP
0167:0051E7E7  685CE85100          PUSH      0051E85C
0167:0051E7EC  64FF32              PUSH      DWORD PTR FS:[EDX]
0167:0051E7EF  648922              MOV       FS:[EDX],ESP
0167:0051E7F2  8D45F8              LEA       EAX,[EBP-08]
0167:0051E7F5  50                  PUSH      EAX
0167:0051E7F6  6A01                PUSH      01
0167:0051E7F8  6A00                PUSH      00
0167:0051E7FA  6874E85100          PUSH      0051E874
0167:0051E7FF  6801000080          PUSH      80000001
0167:0051E804  E8C787EEFF          CALL      ADVAPI32!RegOpenKeyExA

Peki bu bizim OEP mi? hayır ne yazık ki değil.Bu kodu incelerseniz.Programı registryden bazı bilgilere erişmeye çalıştığını göreceksiniz.Bu yine bizim sevgili asprotect birkez F12 tuşuna basalım bakalım.

0167:00D20C80  FF158035D200        CALL      [00D23580] 
0167:00D20C86  8D95B0D7FFFF        LEA       EDX,[EBP+FFFFD7B0]
0167:00D20C8C  E8B797FFFF          CALL      00D1A448                           
0167:00D20C91  8B95B0D7FFFF        MOV       EDX,[EBP+FFFFD7B0]                 
0167:00D20C97  8BC7                MOV       EAX,EDI                            
0167:00D20C99  E84225FFFF          CALL      00D131E0                           
0167:00D20C9E  E83A000000          CALL      00D20CDD                           
0167:00D20CA3  68AC0CD200          PUSH      00D20CAC                           
0167:00D20CA8  FF0424              INC       DWORD PTR [ESP] 

Gördüğünüz gibi bu yine Asprotect kodu.O yüzden biz trace etmeye devam ediyoruz.Softice da iken yine -tracex 401000 51F000 yapın.Softice yine duracak.Karşınızda yine yukarıdaki gibi bir registry kontrolü göreceksiniz.Sanırım ilkinde zaman kontrolü ikncisinde de registry de serial varmı diye bakıyor.F12 ile yine Asprotect e dönüyoruz ve yine -tracex 401000 51F000 yazıp entere basıyoruz.3-5 sn sonra karşınızda şunu göreceksiniz.

0167:0051ED78  55                  PUSH      EBP
0167:0051ED79  8BEC                MOV       EBP,ESP
0167:0051ED7B  83C4E8              ADD       ESP,-18                            
0167:0051ED7E  33C0                XOR       EAX,EAX                            
0167:0051ED80  8945F0              MOV       [EBP-10],EAX                       
0167:0051ED83  8945EC              MOV       [EBP-14],EAX                       
0167:0051ED86  8945E8              MOV       [EBP-18],EAX                       
0167:0051ED89  B8C0E85100          MOV       EAX,0051E8C0                       
0167:0051ED8E  E89181EEFF          CALL      00406F24                           
0167:0051ED93  33C0                XOR       EAX,EAX                            
0167:0051ED95  55                  PUSH      EBP                                
0167:0051ED96  6880EE5100          PUSH      0051EE80                           
0167:0051ED9B  64FF30              PUSH      DWORD PTR FS:[EAX]                 

İşte OEP i bulduk.51ED78 satırında iken

a eip
jmp eip

yazın.Bu şekilde programı memory de loopa sokmuş olduk.Peditor ile task listten pleditoru 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 (51ED78-400000) 11ED78 yazın.Son olarak yapıcak bir şey daha kaldı.Hatırlarsanız programı dump etmek için OEP de iken sonsuz bir döngüye sokmuştuk.Yani eğer programı çalıştırırsanız yine o aynı döngüde dolaşıp duracak.Bu yüzden ultra editor ile 11ED78 satırına gidip EBFE yi (jmp eip) 558B şeklinde değiştirin.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.
Programın orjinal versiyonunu çalıştırın.Program açıkken Import Reconstructor'u açın.Şimdi Attach to Active process listesinden pleditor.exe yi seçin.Şimdi OEP yerine 11ED78 yazıyoruz.Sonra IAT AutoSearch tuşuna tıklıyoruz.Imprec import tablosunu bulacak.Bulunan import tablosunun çoğu yine geçersiz.Dikkat ederseniz ilk geçerli importumuz 00124190 adresindeki GetCurrentThreadId.Bu yüzden en iyisi Imprec teki RVA kısmına 00124190 yazmamız.Artık ilk iat RVA sını bildiğimiz için.Imprec'i kapatın tekrar açın.Yine Attach to Active process listesinden pleditor.exe yi seçin.Bu sefer OEP yerine 11ED78 RVA yerine de 124190 yazın.Size yerine de 1000 yazın.Şimdi yine Show invalid tuşuna tıklayın ve Trace Level 1 ile trace edin.İsterseniz bu aşamadayken Save Tree ile şu andaki import tablosunu saveliyebilirsiniz.Böylelikle eğer yanlış bir şey yaparsanız yeniden başa dönmek zorunda kalmazsınız.

Şu an sadece 6 tane importumuz bozuk.Bozuk olan importların adresi şöyle

  RVA   ModuleName Ordinal   Name
0 001241F4 ? 0000 00D1C960
0 00124354 ? 0000 00D1C968
0 0012439C ? 0000 00D1C928
0 00124404 ? 0000 00D1C958
0 00124408 ? 0000 00D1C950
0 00124414 ? 0000 00D1C974

Bizim 1241F4 deki importun ne olduğunu bulmamız için D1C960 adresinde ne olduğunu bilmemiz lazım.Asprotect zekice bir şey yapıyor.Program başlamadan önce Asprotect bazı apileri çalıştırıp onların dönen değerlerini bir yerde saklıyor.Daha sonra program bu apilerden birini istediğinde apiyi çağırmak yerine ilk başta bulduğu dönen değerleri yolluyor.Bu değerleri saklanan apiler şunlar.

GetModuleHandleA
GetVersion
GetCurrentProcess
GetcurrentProcessId
GetCommandlineA

SoftICE a geçiyoruz ve bpx GetVersion ile breakpoint koyuyoruz.SoftICE durduğunda şunları göreceksiniz.Aşağıdaki adresler programın her çalıştığında değişebilir.Farklı bir şey görürseniz şaşırmayın.Önemli olan aşağıdaki kodu görmeniz.

0167:00D1C7C8  E8977CFFFF          CALL      KERNEL32!GetVersion 
0167:00D1C7CD  A34436D200          MOV       [00D23644],EAX ;GetVersionun sonucu->D23644
0167:00D1C7D2  68AC35D200          PUSH      00D235AC                           
0167:00D1C7D7  E8907CFFFF          CALL      KERNEL32!GetVersionExA             
0167:00D1C7DC  E83B7CFFFF          CALL      KERNEL32!GetCurrentProcess         
0167:00D1C7E1  A34836D200          MOV       [00D23648],EAX  ;GetCurrentProcess'in sonucu->D23648                   
0167:00D1C7E6  E8397CFFFF          CALL      KERNEL32!GetCurrentProcessId       
0167:00D1C7EB  A35036D200          MOV       [00D23650],EAX  ;GetCurrentProcessId'in sonucu->D23650                   
0167:00D1C7F0  E81F7CFFFF          CALL      KERNEL32!GetCommandLineA           
0167:00D1C7F5  A34036D200          MOV       [00D23640],EAX  ;GetCommandLineA'nın sonucu->D23640                   
0167:00D1C7FA  C3                  RET                            

Evet hadi ilk bozuk importumuzu bulalım.İlk importumuzun adresi D1C960.Evet yine Getversiona breakpoint koyun.İlk başta oleat32.dll de durabilir.O yüzden dikkat edin.u D1C960 ile o adresi dissamble edin.Şunu göreceksiniz.

0167:00D1C960  A14036D200          MOV       EAX,[00D23640] ;D23640 dakini eax a at                    
0167:00D1C965  C3                  RET                     

D23640 da ne var peki.Yukarıdaki dissasemblye bakarsanız.Orada GetCommandLineA'nın sonucu var.Demekki birinci importumuzu GetCommandLineA.Imprec ile birinciye çift tıklatıp onu getcommandlinea yapıyoruz.Şimdi sırada D1C968 var.U D1C968 yaptığımızda şunu görüyoruz.

0167:00D1C968  55                  PUSH      EBP                                
0167:00D1C969  8BEC                MOV       EBP,ESP                            
0167:00D1C96B  8B4508              MOV       EAX,[EBP+08] ;stacka push edilen şeyi eax a ata.                      
0167:00D1C96E  5D                  POP       EBP                                
0167:00D1C96F  C20400              RET       0004

Yukarıdaki fonksiyon aslında çok basit birşey.Yani eğer şöyle bir şey varsa

push  123456
call D1C968

bu call dan geriye döndüğünde eax da 123456 oluyor.Bunun için bir import yokmuş gibi gözüküyor.Ama var.Yukarıdaki kodu yine iyi ezberleyin.Bu LockResource apisini gösteriyor.Zaten dikkat ederseniz Apiler alfabetik sıraya göre duruyorlar.

Evet 3. importa geldik.Yine yukarıdaki yolu izliyoruz.u D1C928 yaptığımızda aşağıdakini göreceksiniz.

0167:00D1C928  A14436D200          MOV       EAX,[00D23644] ;D23644 tekini eax a at.
0167:00D1C92D  C3                  RET                     

D23644 de ne vardı peki ?Yukarıya bakarsak D23644 de GetVersion'un sonucu var.Demekki bu GetVersion apisi.

Evet az kaldı.Daha sonraki apimiz D1C958.O adrese gittiğimizde şunu görüyoruz.

0167:00D1C958  A15036D200          MOV       EAX,[00D23650] ;D23650 dakini eax a at.                     
0167:00D1C95D  C3                  RET                      

D23650 de ne vardı ?.Yukarıdaki disssamblye yine bakıyoruz GetCurrentProcessId olduğunu görüyoruz.Bu importu da düzelltik.

Şimdi sırada D1C950 var.O adrese gidip yine u ile dissamble ediyoruz.

0167:00D1C950  A14836D200          MOV       EAX,[00D23648] ;D23648 dekini eax a at
0167:00D1C955  C3                  RET                      

D23648 ye yukarıdaki dissamblyden baktığımızda GetCurrentProcess in olduğunu görüyoruz.Bu imporu da bu şekilde fix etmiş oluyoruz.

Sırada son importumuz var.D1C974 adresini dissamble ettiğimizde

0167:00D1C974  55                  PUSH      EBP                                
0167:00D1C975 8BEC MOV EBP,ESP
0167:00D1C977 5D POP EBP
0167:00D1C978 C20400 RET 0004

Bu yine bir apiyi göstermiyor.Bu import aslında hiç birşey yapmıyo.Bu import FreeResource. Yine dikkat ederseniz alfabetik olarak sıraya uyuyor.Evet bu şekilde artık bütün importlar düzenlemiş oldu.Ben import tablomu buraya koydum karşılaştırma yapabilirsiniz.

Importrec de iken Fix dump tuşuna tıklıyoruz.Dump ettiğimiz exeyi seçiyoruz.dump_.exe dosyamız rebuild edilecek.Programı çalıştırıyoruz.Evet çalıştı.Artık tamamen Asprotect den arınmış bir vaziyette ve daha hızlı çalışıyor.Şimdi artık en basit kısma geçebiliriz.Patch yapmak

KISIM III Patch

Programın aboutunda dikkat ederseniz Unregistered felan yazıyor.Eğer program kayıtlanırsa muhtemelen o yazı kalkacak.O yüzden dump ettiğimiz exeyi Dede ile dissamble edin ve TAboutForm'un FormCreate eventine tıklayın.

0050D39C   E89BF9FFFF             call    0050CD3C  ;program kayıtlımı
0050D3A1   84C0                   test    al, al
0050D3A3   0F84ED000000           jz      0050D496  ;değil 
0050D3A9   B201                   mov     dl, $01  ;program kayıtlı

* Reference to control RegLabel : TLabel
|
0050D3AB   8B83F4020000           mov     eax, [ebx+$02F4]

Şimdi bizim yukarıdaki jumpı değiştirmemiz o kadar önemli değil.Önemli olan call dan her zaman registerlı olduğumuz sonucunu almak.Çünkü bu call bir sürü yerden çağrılıyor.Dikkat ederseniz call dan çıktığımızda eğer eax 0 ise program trial, 1 ise registered oluyor.O zaman şöyle yapıcaz.Biz o callın olduğu yere gidicez ve şunları yazıcaz.

xor eax,eax   ;eax=0
inc eax       ;eax=1
ret           ;geriye dön

Bunu yapmak için 10CD3C adresine gidin ve 33C040C3 yazın.Programı tekrar çalıştırdığızda nagların yokolduğunu göreceksiniz.Register menüsüde kalmış durumda.Ayrıca artık About ta Unregistered yazmıyor.Licensed to 4N felan yazıyor ama o önemli değil.İsterseniz o yazıyı nerden okuduğunu bulup kozmetik değişikleri yapabilirsiniz ama bence gerek yok.Sanırım başardık.Şşşşt renaTgaD MD5'e devam güzelim :)

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.