"DzSoft Perl Editor v4.5" |
|
|
|
|
|
Araçlar:
|
|
|
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.
|
|
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 :)
|
|
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.