Quickdirty v1.5.1 |
|
|
|
Program Tipi: 3DMax Plugin |
|
SoftICE, W32Dsm |
|
|
|
|
3DMax objelerinizi "kirleten" bir plugin.
|
|
Programi yazan bir Turk oldugu ve cracking ile ilgili bir yazi hazirladigi
icin dikkatimi cekti. Yazisinda, bu versiyonun nasil crack edilebilecegini anlatmis.
Boylesini de ilk kez goruyorum. Kendi yazdigi programin nasil crack edilecegini
(hem de PhotoShop ile !) anlatiyor. Sebep olarak da, "Trinity" adli
cracking grubunun zaten crack yayinlamis olmasini gosteriyor. Asil amaci ise,
crack program kullanmanin zararlarini dile getirmek. Neyse, biz isin edebi yonune
dalmadan program nasil crack edilebilir ona bakalim. Zira, yazisinda anlattigi
teknigin "reverse engineering" ile ilgisi yok. Amaci, aslinda program
kirmanin ne kadar da kolay oldugunu gostermek. Yalniz, bunu gosterirken kullandigi
teknige soyleyecek soz yok dogrusu. Hic Photoshop ile program kirilir mi yaaa
? Tamam, kirilmasina kirilir da, bir editor gibi kullanilirsa.
Plugin yuklenikten sonra, "Authorization" ekrani geliyor. "User
Name" girdikten sonra, "Checksum" da cikan degerle birlikte firmayi
ariyorsunuz. Onlar da size serial gonderiyorlar. Sallama bir serial girdikten
sonra --> [bpx hmemcpy]
:1000C2FE call esi :1000C300 add ebp, 00000040 <-- buradayiz
[F10] ile devam edin. Arada "Kernel32.dll" ye gecse de [F12] kullanin.
* Reference To: USER32.DialogBoxParamA, Ord:0095h | :1000C349 Call dword ptr [10012114] :1000C34F ret <-- buradayiz Evet, RET ile geri donuyoruz. :10006FCE call 1000C330 :10006FD3 add esp, 00000008 <-- buradayiz :10006FD6 call 1000BFF0 :10006FDB call 1000BD80 <-- son cagri :10006FE0 test eax, eax :10006FE2 jne 10007014 <-- kotu cocuk
10006FDB deki cagrinin sonucunda eax degerimizin 0 olmasi gerekiyor. Sazan gibi atlayarak JNE yi patch yapmayacagiz tabii ki. Bulmamiz gereken, cagri sonucunda eax e nasil deger atandigi olacaktir. [bpx 10006FD8] --> [F8]
:1000BFA3 cmp dword ptr [ebp+FFFFFF44], eax :1000BFA9 jne 1000BFB4 <-- kotu cocuk :1000BFAB mov [ebp-18], 00000000 <-- iyi cocuk :1000BFB2 jmp 1000BFBB * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:1000BF97(C), :1000BFA9(C) | :1000BFB4 mov [ebp-18], 00000002 <-- kotu cocuk * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:1000BE97(C), :1000BEE6(C), :1000BFB2(U) | :1000BFBB jmp 1000BFC4 <-- iyi cocuk * Referenced by a (U)nconditional or (C)onditional Jump at Address: 1000BFBB(U) | :1000BFC4 call 1000BFC9 * Referenced by a CALL at Address: 1000BFC4 :1000BFC9 pop [ebp-0C] ... :1000BFE3 mov eax, dword ptr [ebp-18] <-- eax = [ebp-18] :1000BFE6 mov esp, ebp :1000BFE8 pop ebp :1000BFE9 ret
Biraz [F10] takibinden sonra gelecegimiz yer burasi iste. RET ile donmeden once, eax=0 olmasi gerekiyor. Biraz yukari bakacak olursak, olayin 1000BFAB de cozuldugunu gorecegiz. Zaten programci, yazisinda PhotoShop kullanarak (345,87) ve (346,87) nolu pixel leri RedGreenBlue=(145,145,145) ile doldurmus. Bizdeki karsiligi NOP oluyor. Aslinda bunda bile hata yapmis. RGB degerlerinin (144,144,144) olmasi gerekiyor. Ustelik, "Yanlis yaparsaniz Plugin calismaz, hata verir" diyor. Artik, kasitli olarak mi yanlis deger veriyor (acemiler kafayi yesin diye) bilmiyorum. Biz baska bir sekilde crack etmeye calisalim. 1000BFAB de [ebp-18] e 0 degerini atayip 1000BFBB ye zipliyoruz. Ama buraya farkli 2 adresten de gelebilirdik.
:1000BE93 837DE801 cmp dword ptr [ebp-18], 00000001 :1000BE97 0F841E010000 je 1000BFBB :1000BEE2 837DE801 cmp dword ptr [ebp-18], 00000001 :1000BEE6 0F84CF000000 je 1000BFBB
[bpx 1000BE97] ve [bpx 1000BEE6] --> Plugini tekrar yukleyelim. Evet, 1000BE97 de breakpoint calisti. Burayi su sekilde patch yaparsak, "Authorization" bolumune hic ugramayacagiz.
:1000BE93 C745E800000000 mov [ebp-18], 00000000
:1000BE9A E91C010000 jmp 1000BFBB
Aslinda, cok daha kisa, SHIK bir patch yapilabilir
:1000BE97 0F850E010000 jne 1000BFAB
Plugin simdi direkt olarak yukleniyor. Ben de bir cinslik yapip, PhotoShop kullanarak nasil patch yapilir, onu gosterecegim.
1- QuickDirt1.5_max4.dlm dosyasini (143600 bytes = 560*256) RAW formatinda acin.
2- (BE98=48792, integer (48792/560) = 87, 48792-(560*87)=48792-48720=72)
3- (72,87) --> RGB (133,133,133) --> 0000BE98 85
4- (73,87) --> RGB (14,14,14) --> 0000BE99 0E
5- (74,87) --> RGB (1,1,1) --> 0000BE9A 01
Programcinin w*w.cuneytozdas.com/programming/cracktutorials/index.htm adresinden detayli olarak PhotoShop ile nasil patch yapilacagini ogrenebilirsiniz.
KeyGen algoritmasini da cozebilirsek, isimizi tamamlayacagiz.
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |:1000BF41(C) | :1000BF90 cmp dword ptr [ebp+FFFFFF48], 00000000 :1000BF97 je 1000BFB4 :1000BF99 call 1000BD60 <-- Hardlock numarasi :1000BF9E xor eax, 003D4F00 :1000BFA3 cmp dword ptr [ebp+FFFFFF44], eax :1000BFA9 jne 1000BFB4 <-- kotu cocuk :1000BFAB mov [ebp-18], 00000000 <-- iyi cocuk :1000BFB2 jmp 1000BFBB
Daha once belirttigim gibi, [ebp-18] e 0 degerini atamamiz gerekiyor. Bunun gerceklesmesi icin de, 1000BFA3 de eax degerimizin [ebp+FFFFFF44] ile esit olmasi gerekir. Bu nasil olacak peki ? Dikkat ederseniz, 1000BF99 da makineden makineye degisen bir numara olusturuluyor. Checksum code diye uretilen de bu numara ile ilgili zaten. Daha sonra 3D4F00 ile XOR islemine giriyor. Cikan sonuc, girdigimiz serialin isleme tutulmus hali ile karsilastiriliyor. Sonuc ayni ise problem yok. Yukariya bakarsak bu bolume 1000BF41 den gelmisiz
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |:1000BF8E(U) | :1000BF3D cmp dword ptr [ebp-70], 00000000 :1000BF41 je 1000BF90 ... :1000BF4A push edx :1000BF4B call 100038D0 <-- bosluga kadar hesapla :1000BF50 add esp, 0000000C ... :1000BF59 mov eax, dword ptr [ebp+FFFFFF44] :1000BF5F xor eax, dword ptr [ebp+FFFFFF40] :1000BF65 mov dword ptr [ebp+FFFFFF44], eax ... :1000BF72 push 00000000 :1000BF74 call 100038B0 <-- bosluktan sonraki bolum :1000BF79 add esp, 00000008 ... :1000BF8E jmp 1000BF3D
1000BF3D ile 1000BF8E arasinda bir dongu gerceklesiyor. Cozmemiz gereken 2 adet CALL var
:100038D0 push ebp :100038D1 mov ebp, esp :100038D3 mov eax, dword ptr [ebp+10] :100038D6 push eax <-- eax = 18h :100038D7 mov ecx, dword ptr [ebp+0C] :100038DA push ecx <-- ecx = 0 :100038DB mov edx, dword ptr [ebp+08] :100038DE push edx <-- [d edx] = serial * Reference To: MSVCRT.strtoul, Ord:02C9h :100038DF Call dword ptr [100120A4]
Evet, ilk cagrimiz C programlama dilindeki "strtoul"
fonksiyonu. Bir karakter dizisini isaretsiz bir degere ceviriyormus.
unsigned long strtoul(const char *s, char **endptr, int
radix);
Uc tane degerimiz edx, ecx ve eax olarak fonksiyona giriyor. Sonucunda da eax
e bir deger ataniyor. Burada onemli olan eax in almis oldugu 18h
degeri. Ayrintili bilgi icin C nin Help ine basvurun
:100038B0 push ebp :100038B1 mov ebp, esp :100038B3 mov eax, dword ptr [ebp+0C] :100038B6 push eax <-- [d eax] --> " .123456789" :100038B7 mov ecx, dword ptr [ebp+08] :100038BA push ecx * Reference To: MSVCRT.strtok, Ord:02C7h :100038BB Call dword ptr [100120A8]
Ikinci cagrimiz da "strtok" fonksiyonu imis. Bir karakter dizisindeki, belirtilen ayiraca kadar olan kismi veriyor. Ornegin, ayirac "," ve string "123,amois,456" --> "123"
Girdigimiz sallama serial "123456789" iken, 100038B6 da [d eax] yaptigimiz zaman, ayiracin bosluk oldugunu ogreniyoruz. Yani, girdigimiz serialin arasinda bosluk olmasi gerekiyor. Peki kac bolumden olusacak girdigimiz serial ? Seriali "1 2 3 4 5 6 7 8 9" seklinde girelim ve [bpx 1000BF3D] ile kac kez durdugumuzu sayalim. Evet, 9 kez durduk. Yani, serialin basamak sayisinda bir kisitlama yok.
Simdi biraz toparlamaya calisayim. Calistigim bilgisayara bagli olarak bir
Hardlock numarasi 1000BF99 daki cagri ile hesaplandi.
Bendeki deger "B6F9F5". Daha sonra 003D4F00
ile XOR islemine girerek "8BB6F5"
degerine ulasti. Girmis oldugum sallama serial "strtoul"
ve 1000BF5F deki XOR fonksiyonlarina bagli olarak bir
numara olusturdu. Bu numaranin "8BB6F5" olmasi
gerekiyor. Peki, serialimiz "strtoul" ile nasil bir isleme giriyor
? 0 dan 9 a kadar olan rakamlar aynen geri cikiyor. "A" dan "F"
ye kadar olan harfler de hex degerleri olarak cikiyor. Eax degerimiz 24 (18h)
olarak siniri belirtiyor. Yani "N" harfinden sonrakiler hep "0"
olarak cikiyorlar. Genel formulu abc sayisi icin soyle hesapladim --> F(x)=
(24^2* strtoul "a")+(24^1* strtoul "b")+(24^0*
strtoul "c")
Ornek olarak --> "1a6" --> (24^2*1
+ 24^1*10 + 24^0*6 = 576 +
240 + 6 = 822
Bulmam gerekli sayi 8BB6F5h = 9156341
9156341 24^6 191102976 0
24^5 7962624 1 1
24^4 331776 3 3
24^3 13824 14 E
24^2 576 8 8
24^1 24 10 A
24^0 1 5 5
Bu kucuk Excel tablosu yardimiyla girmemiz gereken kodu bulduk. 13E8A5
Programciya gore, girmemiz gereken serial de bosluk olmasi gerekiyordu. Ama,
gordugunuz uzere boyle bir zorunluluk yok. Eger bosluk icermeden 13E8A5
girersem, 1000BF41 de ziplayacagim. Boylece hesaplanan
8BB6F5 degeri 1000BF5F deki
XOR a takilmayacak.Authorization bolumundeki "User
Name" & "Checksum code" degerlerinden, Hardlock nosu B6F955
in nasil hesaplandigi konusuna girmeyecegim.
Son sozum de programci Cuneyt Ozdas a olacak. "Sizin gibi Turk programcilarini uluslararasi platformda gormek cok guzel. Emege saygi gosterilmesi ve helal bir sekilde para kazanilmasi gerektigini dusunuyorum. Bu nedenle, daha once yazmis oldugum tutoriallarda "Bir programi kullanarak para kazaniyorsaniz, programi satin alin" ibaresini hep koydum. Ama, sadece eglence ve kendini tatmin amaciyla, sizin veya baskasinin yazmis oldugu programlarin kurcalanmasini / crack edilmesini dogal karsilamaniz gerekir. Ayrica, Cracking / Reverse Engineering olayini kucumser bir tarz takinmaniz tarafiniza antipati olusmasina neden olabilir. Cunku, Reverse Engineering kesinlikle mevcut olmasi gereken / olacak bir olgudur. Bunun karsisinda ne siz ne de baskalari durabilir. Ticari amac tasiyarak Cracking ile mesgul olanlari ben de sizin gibi sevmiyorum. Ama bunlarin varligi, Reverse Engineering olayini karalamaya yetmez. Hazirlamis oldugum bu nacizane tutorial in, sitenizde anlatmis oldugu yontemle pek ilgisi olmasa gerek. Ben, cracking isine baslayacak / baslamis olanlara, kendimce bir mesaj verdigimi saniyorum.
Calismalarinizda basarilar dilerim."
|
|