| |||||||||||||||
| ÖN SÖZ |
Keygen Nasıl yazılır serimizin üçüncü yazısıyla karşınızdayız. Yazar 3ncü crackme olsa bile işimizi çok zorlaştırmamış. Sadece serial algoritmasında biraz oynamış, ayrıca ismin en çok 8 karakter olması ile ilgili bir kod koymuş o kadar. Şimdi kodları inceleyelim:.
| YAZI |
Programımızı PEiD ile kontrol ediyoruz, herhangi bir sıkıştırma yok. Kripto analizi de yapıyoruz(PEiD'in pluginlerinden), sorun yok. Devam edelim. Programımızı çalıştıralım. İsim ve Serial bölümü, güzel. Şimdi birşeyler yazıp tamam diyelim. herhangi bir mesaj kutusu ya da hata vermedi. Aklımıza yazalım bunu. Şimdi programımızı Olly ile açalım. Kod(CODE) ekranına sağ tıklayıp "Search For > All referenced text strings" tıklayalım. Açılan pencerede "ASCII "You did it! Now make a keygen =)" " yazan yere çift tıklayın. Biraz daha yukarı çıkın ve aşağıdaki kodlarda olduğumuzu göreceksiniz. Kod satırlarının yanındaki yorum satırlarını okuyunuz:
4011D3|.PUSH 19 ; /Count = 19 (25.)
4011D5|.PUSH crackme_.00403096 ; |Buffer = crackme_.00403096
4011DA|.PUSH 66 ; |ControlID = 66 (102.)
4011DC|.PUSH [ARG.1] ; |hWnd = 002204F4 ('Crackme - not cracked yet',class='FHCF_Crackme')
4011DF|.CALL <JMP.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
4011E4|.PUSH 1E ; /Count = 1E (30.)
4011E6|.PUSH crackme_.00403078 ; |Buffer = crackme_.00403078
4011EB|.PUSH 65 ; |ControlID = 65 (101.)
4011ED|.PUSH [ARG.1] ; |hWnd = 002204F4 ('Crackme - not cracked yet',class='FHCF_Crackme')
4011F0|.CALL <JMP.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
4011F5|.TEST EAX,EAX ;isim girildimi?
4011F7|.JE SHORT crackme_.00401249 ;girlmediyse 401249 adresine dallan
4011F9|.CMP EAX,8 ;ismin uzunluğunu 8 ile karşılaştır
4011FC|.JG SHORT crackme_.00401249 ;8'den büyükse hata değilse devam et
4011FE|.MOV ECX,EAX ;ecx=eax
401200|.MOV DWORD PTR DS:[4030C0],ECX ;4030C0 adresine ecx değeri atılıyor
401206|.PUSH EDI
401207|.PUSH crackme_.00403051 ; /Arg2 = 00403051
40120C|.PUSH crackme_.00403061 ; |Arg1 = 00403061
401211|.CALL crackme_.00401266 ; \crackme_.00401266;bu call içinde algoritmamız hesaplanıyor F7 ile dallanalım
DALLANDIĞIMIZ ADRES (401266) burası:
401266/$ PUSH EBP
401267|. MOV EBP,ESP
401269|. ADD ESP,-4
40126C|. XOR ECX,ECX ;ecx=0
40126E|. MOV EBX,11111 ;ebx=11111h(ollyde gördüğünüz 16lık bir değerdir 10luk değil)
401273|> MOVSX EAX,BYTE PTR DS:[ECX+403078] ;eax'e ismin her bir hanesinin hex değeri sırayla atılıyor
40127A|. ADD EBX,EAX ;bu değerler ebx'te toplanıyor
40127C|. SUB BH,17 ;ebx'in bh kısmından 17h çıkartılıyor
40127F|. INC ECX ;ecx bir artıyor
401280|. CMP DWORD PTR DS:[4030C0],ECX ;ecx ve ismin uzunluğu karşılaştırılıyor
401286|.^JNZ SHORT crackme_.00401273 ;eşit değilse dallan eşitse bitir devam et
401288|. IMUL EBX,EBX,71 ;ebx=ebx*ebx*71h
;bu son işlemden sonra oluşan değer bizim serial!
40128B|. LEAVE
40128C\. RETN 8
Burada bir konuya değinmek istiyorum. 4 genel maksat yazmacı olan AX,BX,CX,DX yazmaçları (ki bunlar 16bitliktir) 8'er bitlik 2 parçaya ayrılmıştır. AX için bu AH ve AL' dir. Bunu biraz daha açalım isterseniz. Eğer AX= 0011000000111001b, ise ozaman AH=00110000b ve AL=00111001b 'dir. Ayrıca H(high) L ise (low) anlamındadır. Bu döngüde biter bitmez kaldığımız yerden devam ediyoruz. Ebx yazmacınca gerçek serialimiz var.
401216|.PUSH EBX
401217|.PUSH crackme_.00403096 ; ASCII "112233"
40121C|.CALL crackme_.0040131C
401221|.POP EBX ; 0013FC78
401222|.POP EDI ; 0013FC78
401223|.CMP EAX,EBX ; karşılaştırma burada yapılıyor
401225|.JNZ SHORT crackme_.00401249
401227|.PUSH 40 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
401229|.PUSH crackme_.0040304D ; |Title = "wee"
40122E|.PUSH crackme_.00403019 ; |Text = "You did it! Now make a keygen =)"
401233|.PUSH 0 ; |hOwner = NULL
401235|.CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
40123A|.PUSH crackme_.0040303A ; /Text = "Crackme - cracked!"
40123F|.PUSH [ARG.1] ; |hWnd = 002204F4 ('Crackme - not cracked yet',class='FHCF_Crackme')
401242|.CALL <JMP.&USER32.SetWindowTextA> ; \SetWindowTextA
401211 adresindeki CALL'un dallandığı yer bizim serialimizin hesaplandığı yer. Yukarıda burayı incelemiştik şimdi oradaki kodları keygenimiz için düzenleyelim ve RadASM ile keygeni yazalım:
SerialUret PROC uses ebx edi esi,hWin:DWORD ;GetDlgItemText ile girilen isim ve isim uzunluğunu elde ederiz invoke GetDlgItemText,hWin,edtAD,ADDR isim,30h mov uznIsim,eax ;isim uzunluğu bir değişkende test eax,eax ;ismin girilmiş mi? jz _isimyok ;girilmemişse ise hata ver yoksa devam cmp eax,8 ;isim uzunluğunu 8 ile kontrol et jg _isimhata ;büyükse hata ver xor ebx,ebx ;ebx=ebx XOR ebx =0 XOR ECX,ECX ;ecx = 0 MOV EBX,11111h ;ebx = 11111h _dongu1: MOVSX EAX,BYTE PTR DS:[ECX+isim] ;ismin ilk baytının hex değerini eax'e at ADD EBX,EAX ;ebx = ebx + eax SUB BH,17h ;bh = bh - 17h INC ECX ;ecx'i bir artır CMP DWORD PTR DS:[uznIsim],ECX ;ismin uzunluğu ile ecx'i karşılaştır JNZ _dongu1 IMUL EBX,EBX,71h ;ebx= ebx*ebx*71h =o da bizim serial oluyo zaten mov[serial],ebx invoke wsprintf,addr serial,addr format,serial invoke SetDlgItemText,hWin,edtSerial,ADDR serial _Son: xor eax,eax ret _isimyok: invoke SetDlgItemText,hWin,edtSerial,ADDR isimHata jmp _Son _isimhata: invoke SetDlgItemText,hWin,edtSerial,ADDR isimHata jmp _Son SerialUret endp
| SON NOTLAR |
Keygeni üretme algoritmasının hazır halini yukarıda verdim. Kodların hazır halini BURADAN indirebilirsiniz.
| TEŞEKKÜRLER |
sorularımı cevapsız bırakmayan herkese
sonsuz TEŞEKKÜRLER ........
sonsuz TEŞEKKÜRLER ........
| SON SÖZ |
Öldürmeyen Her Darbe Güce Güç Katar ::: BlueDeviL // SCT
| UNUTMADAN |
Bu programı kullanarak para kazanıyorsanız lütfen satın alın. Bu yazının yazılma amacı program yazanlara programlarını daha iyi korumaları konusunda yol göstermektir. Lisanssız kullanımda Dokümanı hazırlayan sorumlu değildir.
Diyeceğim şudur ki: Emek verilip de yapılmış bir şeyi çalma, onu satın al.
Diyeceğim şudur ki: Emek verilip de yapılmış bir şeyi çalma, onu satın al.
Hiç yorum yok:
Yorum Gönder