Natural

natural

Breaking News

Cracker

[v0!d] CrackMe v0.02

 

Programın Adı [v0!d] CrackMe v0.02Adres : Download
Açıklaması
Crack Me
KorumasıSerial
AraçlarSofice 4.x.x, Biraz Kafa, Sıcak bir kahve :)

Evet bir başka crackme. Zipli paketteki readme dosyasına göre sadece seriali bulucaz. Patch yapmak yok demiş önemli değil zaten. Keygen ise isteğe bağlı. İsterseniz işimize başlayalım.

Crackmeyi çalıştıralım, bir textbox ve iki commanbutton."Check" yazılı buttona basalım.Birşey olmadı. Sallama seriali girip basalım yine tık yok.Hmmm o zaman Ctrl + D yapıp Softice'a dalalım. "GetDlgItemTextA" da breakpointlerimizi koyalım(bpx GetDlgItemTextA). Sonra Softice'dan çıkın(X {enter} ya da Ctrl+D ya da F5).Şimdi Crackme'nin "Check" butonuna basın.SoftIce açılmalı. Şimdi biz "GetDlgItemTextA" kodunun içindeyiz. Hemen F11' e basın ve buradan çıkıp aşağıya gelin :


00401169 call [USER32!GetDlgItemTextA]
0040116F push 00405030          <- İşte buradayız (Serialin Offseti 00405030).
00401174 call 00401000   <- Serial doğrulama döngüsü.
00401179 add esp, 04   
0040117C mov [004056A0], eax  <- Dönen değerin kaydı.
00401181 test eax, eax   <- EAX == 00 ?<
00401183 jz 004011BC   <- Evet: jump KötüÇocuk, değilse devam İyi Çocuk.
00401185 mov edx, [00405698]
0040118B push 40    <-\
0040118D push 00405160     |
00401192 push 00405130     | İyiÇocuk Mesaj Kutusu :)
00401197 push edx     |
00401198 call [USER32!MessageBoxA] <-/
0040119E mov eax, 00000001
004011A3 ret 0010

Burada güzel bir patch kodu gözüküyor ama ne yazıkki biz patch yapmayacağız :(. call 00401000 'i F8 ile girin, böylece aşağıdaki kodlar ile karşılacacaksınız:
00401000 push ebx
00401001 push ebp
00401002 mov ebp, [esp+0C] <- Serial Offset'ini EBP'ye taşı.
00401006 push esi
00401007 push edi
00401008 mov edi, ebp
0040100A or ecx, -01  <- ECX'i tarama için hazırla.
0040100D xor eax, eax  <- EAX == 00, anlamı 00 karakteri için ara.
0040100F repnz scasb  <- Uzunluğu 00 bulunana kadar Serial dizgisini tara.
00401011 not ecx   <- pozitif bir değer yap ;)
00401013 dec ecx   <- 00 karakterini içerme.
00401014 cmp ecx, 10  <- ECX (Serial uzunluğu) ile 10h (16 Dec) karşılaştır.
00401017 jnz 004010B0  <- Eğer eşit değilse en sona atla, 00 dönüş değeri.

Arkadaşlar burası önemli. Çünkü burada serialin 10h(yani 16 desimal [yani 16 haneli]) uzunlığunda olduğunu belirtiyor. Eğer 16 karakterden az veya çok ise bizi serial tarama işinin en sonuna atıyor. 00000000 EAX'in içine taşınıyor ve  biz call'dan dönüyoruz, sonuçta orada başarıp başarmadığımızı kontrol ediyor.
Eğer burada 16 karakterlik bir serial yazmadıysanız yanılmış olacaksınız o yüzden crackme'yi yeniden başlatmamız gerekiyor. Daha sonra ise 16 karakterlik bir serial sallayın.Breakpointleri koyun ve buraya geri gelin.
Kontrol denetiminden sonra şunu göreceksiniz. "Char Checking Code":

0040101D mov bl, [ebp+00] <- İlk sayı/karak BL'ye taşı.
00401020 xor esi, esi  <- ESI == 00.
00401022 mov dl, 30  <- 30 (0)'u DL'ye taşı.
00401024 test bl, bl  <- BL == 00 ?
00401026 jz 0040103E  <- Diğer numara kontrolune atla, değilse devam.
00401028 mov al, bl  <- AL = BL.
0040102A mov ecx, ebp  <- ECX = EBP (ECX şimdi Serial'i gösteriyor).
0040102C cmp dl, al  <- AL ile DL'yi karşılaştır.
0040102E jnz 00401031  <- Eşit değilse sonraki açıklamaya geç,değilse devam
00401030 inc esi   <- Yükselt ESI.
00401031 cmp esi, 06  <- ESI == 06 ?
00401034 jge 004010B0  <- Eğer eşit veya büyükse atla ve biz kaybederiz.
00401036 mov al, [ecx+01] <- Sonraki sayı/karak AL'ye taşı.
00401039 inc ecx   <- Yükselt ECX.
0040103A test al, al  <- AL == 00 ?
0040103C jnz 0040102C  <- Eşit değilse kontrolü tekrar et.
0040103E xor esi, esi  <- ESI == 00.
00401040 inc dl   <- Yükselt DL (DL şimdi 31 (1)).
00401042 cmp dl, 39  <- 39 (9) ile DL karşılaştır.
00401045 jle 00401024  <- 39'dan küçük veya eşit ise bu işlemi devam ettir.
Güzel bir döngü değil mi? Şimdi döngüyü biraz daha basitleştirelim isterseniz.
Öncelikle serialimizin 0-9 rakamlardan oluşup oluşmadığını kontrol ediyor. Eğer sorun varsa göçüyoruz eğer yosa devam, olay bu :)

Evvet şimdi gerçek serial kontrol noktasına geliyoruz.
Önümüzde 3 bölüm daha var. Şimdi ilkine bakalım:

00401047 movsx eax, [ebp+03] <- 4. numarayı EAZ'e taşı.
0040104B movsx ecx, [ebp+02] <- 3. numarayı ECX'e taşı.
0040104F movsx edx, [ebp+01] <- 2. numarayı EDX'e taşı.
00401053 add eax, ecx  <- ECX'i EAX'e ekle.
00401055 movsx ecx, bl  <- BL'i ECX'e taşı (BL == 1. numara).
00401058 add eax, edx  <- EDX' EAX'e taşı.
0040105A lea edx, [ecx+eax-00C0] <- EDX = ECX+EAX-00C0
00401061 cmp edx, 16  <- 16 ile EDX 'i karşılaştır.
00401064 jnz 004010B0  <- eğer eşit değilse göçeriz, yoksa(else)2. bölüme devam.
Evet çok kolaymış değil mi? :=) Gördüğünüz gibi crackme serialin ilk 4 rakamını kullanıyor. Bütütn o numaraları topla va toplam dan 00C0 'ı çıkart , böylece EDX içerisinde 16'lık değerini elde etmiş oluruz. Sadece prosedürü ters çevir :)

Bir sonuç olarak elimizde 16 var.
00C0 'ı 16 'a ekleyenzi: sonuç: 000000D6

Şimdi kendi kendinize düşünüyor olabilirsiniz "Add prosedürünü nasıl ters çevireceğim" diye?
ADD 'in tersi SUB dır :) Fakat bu işimize yaramaz.
D6 'yı elde etmek için 4 rakamı eklediğine göre;
D6'yı 4'e böleriz.

D6 / 4 = 35 (5)

5'i bulduğum zaman onu yerine yazdım fakat göçtük neden mi?
Çünkü 35+35+35+35 D6 değildir, D4'tür.
Doğru yapmak için bunların iki tanesini 1 arttıracağız.
Böylece serialimizin ilk 4 rakamı şöyle olacak:

5665

Şimdi ilk dört rakamı oluşturan 5 ve 6'nın yerlerini değiştirerek yazarsanız da bir şey değişmez:)Çünkü sonuç D6 olacak

Elime bir kağıt kalem alıp şu yapıyı çizdim:

00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F (16 Desimal)
5  6  6  5


Evet isterseniz ikinci bölüme geçebiliriz, istesenizde istemesenizde ben geçeceğim:P

00401066 movsx eax, [ebp+0D] <- 14. numarayı EAX'e taşı.
0040106A movsx ecx, [ebp+0A] <- 11. numarayı ECX'e taşı.
0040106E movsx edx, [ebp+07] <- 8. numarayı EDX'e taşı.
00401072 add eax, ecx  <- ECX'i EAX'e ekle.
00401074 movsx ecx, [ebp+04] <- 5. numarayı ECX'e taşı.
00401078 add eax, edx  <- EDX'i EAX'e ekle.
0040107A lea edx, [ecx+eax-00C0] <- EDX = ECX+EAX-00C0
00401081 cmp edx, 1E  <- 1E ile EDX ' karşılaştır.
00401084 jnz 004010B0  <- eşit değilse göçeriz, değilse(else)devam
Yukarda anlattığım aynı hikaye fakat bu seferki sayılar : 5, 8, 11, 14 :)

Sonuçta yine elimizde 16 var.
00C0 'yi 1E 'ye ekleyin böylece : 000000DE

DE / 4 = 37 (7)
37 + 37 + 37 + 37 = DC yine 2 rakamı +1 artıracağız.=> 7887
Şimdilik serialin bir kısmını ele geçirdik:

00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F (16 Desimal)
5  6  6  5  7        8        8        7


3. bölümümüze gelelim:

00401086 movsx eax, [ebp+0F] <- 16. numarayı EAX'e taşı.
0040108A movsx ecx, [ebp+0C] <- 13. numarayı ECX'e taşı.
0040108E movsx edx, [ebp+09] <- 10. numarayı EDX'e taşı.
00401092 add eax, ecx  <- ECX'i EAX'e ekle.
00401094 movsx ecx, [ebp+06] <- 7. numarayı ECX'e taşı.
00401098 add eax, edx  <- EDX'i EAX'e ekle.
0040109A lea edx, [ecx+eax-00C0] <- EDX = ECX+EAX-00C0
004010A1 cmp edx, 09  <- 09 ile EDX 'i karşılaştır.
004010A4 jnz 004010B0  <- Eğer eşit değilse göçeriz, tam tersi ise kazanırız ;)
Şimdi burada elimize geçen numaralar ise: 7, 10, 13, 16
09 sonuç!
00C0 'ı 09 'a ekle ; sonuç : 000000C9
C9 / 4 = 32 (2)
32 + 32 + 32 + 32 = C8 burada ise sadece 1 numaraya +1 ekleyeceğiz
Artık tüm serial oluştu :)

00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F (16 Desimal)
5  6  6  5  7     2  8     2  8     3  7     2


Bu son bölümde eğer başarılı olursak 01'i EAX'e taşıyacak, eğer başarılı olamazsak 00'ı EAX'e taşıyacak
Gördüğünüz gibi bilinmeyen 4 boşluk var.Fakat crackme bunların ne olduğunu önemsemiyor istediğinizi yazabilirsiniz.
Evet sonuçta elimizdeki crackmenin seriali:
Serial = 5665712812843762
Bu seriali girince crackme size şöyle diyecek:
GOOD JOB! - CRACKED!

Evet bu crackme de burada biter:) Umarım isteklerinize kareşılık gelmiştir. Daha bi çokcrackme kıracağız, görüzmek üzere :)

Hiç yorum yok