|
Ö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