4 Nisan 2020 Cumartesi

Keygenme 7



Yazı dizimizin 7nci serisinde yine bir isme göre hesaplanan crackme ile karşınızdayız. Farkındayım bazılarına öff geliyor. Ancak bundan sonraki 2 yazıda altın vuruş yapacağız! O sebeple sabırlı olalım. Okuduğumuz her yazı yazdığımız her asm kodu bizim için tecrübe olacak. Uzatmadan lafı devam edelim.
Programı Ollydebugger ile açalım CTRL+N yapıp Names penceresini görelim. GetDlgItemText apisine sağ tıklayarak "Set breakpoint on every reference" seçelim. Programı çalıştırıp isim serial girin. "Check Serial" tuşuna basınca crackme break pointte duracak. Bizde incelemeye başlıyacağız.
4011D7|.PUSH 19                                 ; /Count = 19 (25.)
4011D9|.PUSH crackme_.0040309A                  ; |Buffer = crackme_.0040309A
4011DE|.PUSH 66                                 ; |ControlID = 66 (102.)
4011E0|.PUSH [ARG.1]                            ; |hWnd = 000E06F8 ('Crackme - not cracked yet',class='FHCF_Crackme')
4011E3|.CALL <JMP.&USER32.GetDlgItemTextA>      ; \GetDlgItemTextA--->girdiğimiz serialin alındığı yer
4011E8|.PUSH 1E                                 ; /Count = 1E (30.)
4011EA|.PUSH crackme_.0040307C                  ; |Buffer = crackme_.0040307C
4011EF|.PUSH 65                                 ; |ControlID = 65 (101.)
4011F1|.PUSH [ARG.1]                            ; |hWnd = 000E06F8 ('Crackme - not cracked yet',class='FHCF_Crackme')
4011F4|.CALL <JMP.&USER32.GetDlgItemTextA>      ; \GetDlgItemTextA-->girdiğimiz ismin alındığı ger
4011F9|.CMP EAX,6    ;ismin uzunluğu burada kontrol ediliyor
4011FC|.JB SHORT crackme_.00401251  ;eğer 6dan küçükse dallan yoksa devam
4011FE|.MOV ECX,EAX    ;ismin uzunluğu ecx'e yazılıyor
401200|.MOV EBX,0F    ;ebx=0Fh
401205|.SUB ECX,4    ;ecx=ecx-4
401208|.MOV DWORD PTR DS:[4030C4],ECX           ;ecx değeri 4030C4 adresine taşınıyor
40120E|.PUSH EDI
40120F|.PUSH crackme_.00403051                  ; /Arg2 = 00403051
401214|.PUSH crackme_.00403061                  ; |Arg1 = 00403061
401219|.CALL crackme_.0040126E                  ; \crackme_.0040126E--> hesaplama yapılan call F7 ile dalalım
Yukarıdaki call 40126E adresine dallanıyor:
40126E/$ PUSH EBP
40126F|. MOV EBP,ESP
401271|. ADD ESP,-4
401274|. XOR EDX,EDX    ;yazmaçlar sıfırlanıyor
401276|. XOR EAX,EAX
401278|. XOR ECX,ECX
40127A|. XOR ESI,ESI                            ;  crackme_.00401180
40127C|. XOR EDI,EDI
40127E|> MOVSX EAX,BYTE PTR DS:[ECX+403080] ;girdiğimiz ismin 5nci hanesinden itibaren her karakterin
      ;hex değeri eax'e atılıyor.
401285|. IMUL EBX,EAX    ;ebx=ebx*eax
401288|. INC ECX    ;ecx değerini bir artır
401289|. CMP DWORD PTR DS:[4030C4],ECX  ;4030C4 adresindeki değer ile ecx'i karşılaştır
40128F|.^JNZ SHORT crackme_.0040127E  ;eşit değillerse dallan
401291|. LEA ECX,DWORD PTR DS:[EBX*2+1337] ;ecx=(ebx*2)+1337h
401298|. XOR CX,CX    ;cx=0
40129B|. LEA ECX,DWORD PTR DS:[ECX+EBX*4] ;ecx=ecx+(ebx*4)
40129E|. XOR EBX,ECX    ;ebx=ebx XOR ecx = gerçek serial
4012A0|. LEAVE
4012A1\. RETN 8
Yukarıda görüldüğü gibi ismimizi baz alarak elde ettiği bir sayı ile yapılan aritmetik ve mantıksal işlemlerden sonra bir serial üretiliyor. Aşağıda da göreceksiniz bu serial ile bizim girdiğimiz serial karşılaştırılıyor.
40121E|.PUSH EBX
40121F|.PUSH crackme_.0040309A                  ;  ASCII "11223344"->girdiğimiz serial
401224|.CALL crackme_.00401330
401229|.POP EBX                                 ;  0013FC78
40122A|.POP EDI                                 ;  0013FC78
40122B|.CMP EAX,EBX    ;iyi ve kötü serialler burada karşılaştırılıyor
40122D|.JNZ SHORT crackme_.00401251  ;dallanan jump komutu
40122F|.PUSH 40                                 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
401231|.PUSH crackme_.0040304D                  ; |Title = "wee"
401236|.PUSH crackme_.00403019                  ; |Text = "You did it! Now make a keygen =)"
40123B|.PUSH 0                                  ; |hOwner = NULL
40123D|.CALL <JMP.&USER32.MessageBoxA>          ; \MessageBoxA
401242|.PUSH crackme_.0040303A                  ; /Text = "Crackme - cracked!"
401247|.PUSH [ARG.1]                            ; |hWnd = 000E06F8 ('Crackme - not cracked yet',class='FHCF_Crackme')
40124A|.CALL <JMP.&USER32.SetWindowTextA>       ; \SetWindowTextA
Keygeni yazarken ollyden aldığınız kodlardaki değerlerin hexadesimal yani 16lık olduğunu unutmayın. Şimdi aşağıda yukarda serial algoritmasının keygene dönüştürdüğümüz halini inceleyin:
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
cmp eax,6     ;ismin uzunluğunu 6 ile karşılaştır
jb _isimhata     ;eğer 6dan küçükse hata ver yoksa devam
mov ecx,eax     ;isin uzunluğu ecx'e atılıyor
mov ebx,0Fh     ;ebx=0Fh
sub ecx,4     ;ismin uzunluğundan 4 çıkart
mov uznIsim,ecx     ;uznIsim değişkenine ecx değeri yazdır


xor edx,edx     ;edx=0
xor eax,eax     ;eax=0
xor ecx,ecx     ;ecx=0
xor esi,esi     ;esi=0
xor edi,edi     ;edi=0
mov edx,offset isim    ;edx=ismimizin adresi
_dongu1:
MOVSX EAX,BYTE PTR DS:[4+edx+ecx]  ;ismin 5nci hanesinden itibaren 
      ;bir karakter alınıp hex değeri eax'e yazılır
IMUL EBX,EAX     ;ebx=ebx*eax
INC ECX      ;ecx değerini 1 artır
CMP DWORD PTR DS:[uznIsim],ECX   ;ecx ve uznIsim değişkenini karşılaştır
JNZ _dongu1     ;eşit değilse dallan yoksa devam
LEA ECX,DWORD PTR DS:[EBX*2+1337h]  ;ecx=(ebx*2)+1337h
XOR CX,CX     ;cx=0
LEA ECX,DWORD PTR DS:[ECX+EBX*4]  ;ecx=ecx+(ebx*4)
XOR EBX,ECX     ;ebx=ebx XOR ecx = gerçek serial
mov [serial],ebx
invoke wsprintf,addr serial,addr format,serial
invoke SetDlgItemText,hWin,edtSerial,ADDR serial
 
_Son:
xor eax,eax
ret

_isimhata:
invoke SetDlgItemText,hWin,edtSerial,ADDR isimHata
jmp _Son

SerialUret endp
Türk Ters Mühendisliğine gönül vermiş
zaman harcamış herkese

sonsuz TEŞEKKÜRLER ........
Öldürmeyen Her Darbe Güce Güç Katar ::: BlueDeviL // SCT
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 şudurki: Emek verilipde yapılmış bir şeyi çalma, onu satın al.

Blue DeviL
E-Mail: bluedevil@sctzine.com
ICQ: 82503282

Keygenme 6



Bu da orijinal bir crackme. Bu yazıda ve sonundaki keygen örneğinde nasıl random(rassal) sayı üreteceğimizi öğreneceğiz. Zaten 2 yolu var(benim bildiğim) assembly de burada bir tanesini göreceğiz. Yazıya başlamadan önce konu hakkında araştırma yapmak isteyen arkadaşlar "GetTickCount" APIsini internetten araştırsınlar bakalım ne işe yarıyormuş.
Programı Ollydebugger ile açalım CTRL+N yapıp Names penceresini görelim. GetDlgItemText apisine sağ tıklayarak "Set breakpoint on every reference" seçelim. Programı çalıştırıp isim serial girin. "Check Serial" tuşuna basınca crackme break pointte duracak. Bizde incelemeye başlıyacağız.
4011D7|.PUSH 19                                 ; /Count = 19 (25.)
4011D9|.PUSH crackme_.00403096                  ; |Buffer = crackme_.00403096
4011DE|.PUSH 66                                 ; |ControlID = 66 (102.)
4011E0|.PUSH [ARG.1]                            ; |hWnd = 000406A6 ('Crackme - not cracked yet',class='FHCF_Crackme')
4011E3|.CALL <JMP.&USER32.GetDlgItemTextA>      ; \GetDlgItemTextA-->bu api serialimizi almaya yarıyor
4011E8|.PUSH 1E                                 ; /Count = 1E (30.)
4011EA|.PUSH crackme_.00403078                  ; |Buffer = crackme_.00403078
4011EF|.PUSH 65                                 ; |ControlID = 65 (101.)
4011F1|.PUSH [ARG.1]                            ; |hWnd = 000406A6 ('Crackme - not cracked yet',class='FHCF_Crackme')
4011F4|.CALL <JMP.&USER32.GetDlgItemTextA>      ; \GetDlgItemTextA-->burada ise ismimiz alınıyor
4011F9|.CMP EAX,5    ;ismin uzunluğu 5 ile karşılaştırılıyor
4011FC|.JB SHORT crackme_.00401255  ;5ten haneden küçük bie isim girilmişse hata veriyor
4011FE|.MOV ECX,EAX    ;ismin uzunluğu ecx'te
401200|.MOV DWORD PTR DS:[4030C0],ECX           ;ecx'teki değer 4030C0 adresine yazılıyor
401206|.PUSH EDI
401207|.PUSH crackme_.00403051                  ; /Arg2 = 00403051
40120C|.PUSH crackme_.00403061                  ; |Arg1 = 00403061
401211|.CALL crackme_.00401272                  ; \crackme_.00401272
401216|.PUSH EBX
401217|.PUSH crackme_.00403096                  ;  ASCII "11223344"
40121C|.CALL crackme_.00401310
401221|.CMP EAX,3838    ;eaxte serialimiz var ve 3838h ile karşılaştırılıyor
401226|.JBE SHORT crackme_.00401255  ;3838h'dan daha küçük ve eşitse dallanıyor yoksa devam
401228|.CALL crackme_.0040127C   ;seriali kontrol algoritması burada F7 ile dalalım içine
Aşağıda seriali konrtol eden döngüde serialimizi 3838h 'a bölüyor. Önemli olan kalanın 0 olması. DIV, IDIV işleminde kalan her zaman edx değişkenine yazılır. Zaten serialin doğruluğunu kontrol eden test komutuyla edx = 0 olmadığı sürece hata verecektir.
40127C/$MOV EBX,3838    ;ebx=3838h
401281|.CDQ     ;convert double to quad
401282|.IDIV EBX    ;eax=eax / ebx, kalan=edx
401284\.RETN
Döngü bitti son kontrol için devam ediliyor:
40122D|.POP EBX                                 ;  0013FC78
40122E|.POP EDI                                 ;  0013FC78
40122F|.TEST EDX,EDX    ;edx = 0 'mı
401231|.JNZ SHORT crackme_.00401255  ;0 değilse hata mesajına dallan yoksa iyi çocuk ;)
401233|.PUSH 40                                 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
401235|.PUSH crackme_.0040304D                  ; |Title = "wee"
40123A|.PUSH crackme_.00403019                  ; |Text = "You did it! Now make a keygen =)"
40123F|.PUSH 0                                  ; |hOwner = NULL
401241|.CALL <JMP.&USER32.MessageBoxA>          ; \MessageBoxA
401246|.PUSH crackme_.0040303A                  ; /Text = "Crackme - cracked!"
40124B|.PUSH [ARG.1]                            ; |hWnd = 000406A6 ('Crackme - not cracked yet',class='FHCF_Crackme')
40124E|.CALL <JMP.&USER32.SetWindowTextA>       ; \SetWindowTextA
Yukardan ne anladık? öyle bir sayı olmalı ki, eax bölü ebx sonucundan kalan 0 olmalı. İsmimizle ilgili gördüğünüz gibi her hangi bir işlem yapılmıyor. Olay tamamen serialle ilgili. O zaman bu sayı bir çok sayı olabilir. EBX'teki değer 3838h olduğuna göre bu sayının katları bizim serialimiz olabilir, manuel bile hesaplayabilirsiniz. Şimdi biz bunu rassal bir sayı hesaplayıp 3838h ile çarpıcaz ve sonuç bizim serialimiz olacak. Peki rassal sayı assembly'de nasl hesaplanıyor? aslında basit. win32 de "GetTickCount" apisi adı altında bir api var. Bu api windowsun başlamasından beri geçen zamanı milisaniye olarak eax'e yazar. Yani biz bu apiyi her çalıştırdığımızda bize farklı bir rakam verecek :D Ama bana öyle kocaman bir sayı gerekmiyor. O yüzden ben keygeni yazarken eax'in sadece AH ve AL kısmındaki rakamları alıp işlem yapacağım. Keygen kaynak kodları BURADAN indirebilirsiniz. Buraya yapıştırma gereği duymuyorum.
Neymiş peki Win32 Programmer's reference dosyasını yanımızdan ayırmıyor muşuz değil mi. Şu an bazıları "onu nereden bulucam ben" diyo sanki. Birçok yerden bulabilirsiniz. Eğer MASM32 paketini indirip kurduysanız zaten içerisinde birçok help dosyasıyla beraber geliyor. Yok kurmadıysanız size internetten araştırın demiyorum. Manyak mısın kardeşim 6 derstir ne anlatıyorum ben keygen yazıyoruz :D Bunun için RadASM programı lazım demedikmi? Assembly derlemek için MASM32 kullancaz demedik mi? Hemen http://www.sctzine.com/ adresine gidiyorsun araçlar sayfasından Masm32 ve RadASM dosyalarını indirip kuruyorsun.
Türk Ters Mühendisliğine adanmış her saniyenin sahiplerine

sonsuz TEŞEKKÜRLER ........
Öldürmeyen Her Darbe Güce Güç Katar ::: BlueDeviL // SCT
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.

Blue DeviL
E-Mail: bluedevil@sctzine.com
ICQ: 82503282

Keygenme 5



Keygen nasıl yazılır serimizin 5nci yazısında yine bir isme göre serial hesaplama algosuyla karşı karşıyayız. Pes etmek yeter demek yok bu işi öğreneceğiz. Buyrun kodları inceleyelim.
Programı Ollydebugger ile açalım CTRL+N yapıp Names penceresini görelim. GetDlgItemText apisine sağ tıklayarak "Set breakpoint on every reference" seçelim. Programı çalıştırıp isim serial girin. "Check Serial" tuşuna basınca crackme break pointte duracak. Bizde incelemeye başlıyacağız.
4011D3|.PUSH 19                                 ; /Count = 19 (25.)
4011D5|.PUSH crackme_.00403096                  ; |Buffer = crackme_.00403096
4011DA|.PUSH 66                                 ; |ControlID = 66 (102.)
4011DC|.PUSH [ARG.1]                            ; |hWnd = 000B0652 ('Crackme - not cracked yet',class='FHCF_Crackme')
4011DF|.CALL <JMP.&USER32.GetDlgItemTextA>      ; \GetDlgItemTextA---->serialimiz alınıyor
4011E4|.PUSH 1E                                 ; /Count = 1E (30.)
4011E6|.PUSH crackme_.00403078                  ; |Buffer = crackme_.00403078
4011EB|.PUSH 65                                 ; |ControlID = 65 (101.)
4011ED|.PUSH [ARG.1]                            ; |hWnd = 000B0652 ('Crackme - not cracked yet',class='FHCF_Crackme')
4011F0|.CALL <JMP.&USER32.GetDlgItemTextA>      ; \GetDlgItemTextA-->ismimiz bu api ile alınıyor
4011F5|.CMP EAX,5    ;ismimizin uzunluğu 5 ile karşılaştırılıyor
4011F8|.JB SHORT crackme_.00401245  ;5'ten küçükse dallanıyor yoksa devam
4011FA|.MOV ECX,EAX    ;ismin uzunlupu ecx'e yazılıyor
4011FC|.MOV DWORD PTR DS:[4030C0],ECX  ;ecx değeri 4030C0 adresine yazılıyor
401202|.PUSH EDI
401203|.PUSH crackme_.00403051
401208|.PUSH crackme_.00403061
40120D|.CALL crackme_.00401262   ;serial hesaplama döngüsüne dallanıyor F7 ile içine dalalım

401262 $  PUSH EBP    ;F7 basıp daldığımız yer burası
401263 .  MOV EBP,ESP
401265 .  ADD ESP,-4
401268 .  XOR EBX,EBX    ;yazmaçlar sıfırlanıyor    
40126A .  XOR EDX,EDX
40126C .  XOR EAX,EAX
40126E .  XOR ECX,ECX
401270 .  XOR ESI,ESI                           ;  crackme_.00401180
401272 .  XOR EDI,EDI    ;buraya kadar
401274 >  MOVSX EAX,WORD PTR DS:[ECX+403078] ;ismimizin+ecx yazmacının ilk iki baytı eax'e yazılıyor
40127B .  IMUL ECX    ;eax=eax * ecx
40127D .  ADD EBX,EAX    ;ebx=ebx+eax
40127F .  ADD ECX,2    ;ecx=ecx+2
401282 . >CMP BYTE PTR DS:[ECX+403078],0 ;ecx+isim 0 ile karşılaştırılıyor
      ;ayrıca ecx 2şer 2şer arttığı için
      ;döngü daha çabuk bitiyor
401289 .^ JNZ SHORT crackme_.00401274  ;0 değilse dallan yoksa devam
40128B .  ROL EBX,99                         ;ebx=ebx ROL 99h
40128E .  XCHG EAX,EBX    ;yer değiştir
40128F .  SHR EAX,CL    ;eax=eax SHR CL
401291 .  MOV ESI,EAX    ;esi=eax=serial :)
401293 .  LEAVE
401294 .  RETN 8



401212|.PUSH EBX
401213|.PUSH crackme_.00403096                  ;  ASCII "11223344"->benim girdiğim serial
401218|.CALL crackme_.00401324   ;bu calldaki işlemden sonra girdiğimiz serial eax'e yazılıyor
40121D|.POP EBX                                 ;  crackme_.00403061
40121E|.POP EDI                                 ;  crackme_.00403061
40121F|.CMP ESI,EAX    ;iyi kötü çocuk burada karşılaştırılıyor
401221|.JNZ SHORT crackme_.00401245  ;eğer yanlış serial girildiyse dallan yoksa devam
401223|.PUSH 40                                 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
401225|.PUSH crackme_.0040304D                  ; |Title = "wee"
40122A|.PUSH crackme_.00403019                  ; |Text = "You did it! Now make a keygen =)"
40122F|.PUSH 0                                  ; |hOwner = NULL
401231|.CALL <JMP.&USER32.MessageBoxA>          ; \MessageBoxA
401236|.PUSH crackme_.0040303A                  ; /Text = "Crackme - cracked!"
40123B|.PUSH [ARG.1]                            ; |hWnd = 000B0652 ('Crackme - not cracked yet',class='FHCF_Crackme')
40123E|.CALL <JMP.&USER32.SetWindowTextA>       ; \SetWindowTextA
Seriali crackme zaten kendisi verdiği ve buraya kadar bununla ilgili buna benzer 4 crackmeyi de çözdüğünüz için keygenin assembly kodlarını buraya yazmıyorum. Ancak kaynak kodları buradan indirebilirsiniz.
Türk Ters Mühendisliğine gönül vermiş herkese

sonsuz TEŞEKKÜRLER ........
Öldürmeyen Her Darbe Güce Güç Katar ::: BlueDeviL // SCT
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 şudurki: Emek verilipde yapılmış bir şeyi çalma, onu satın al.

Blue DeviL
E-Mail: bluedevil@sctzine.com
ICQ: 82503282

Keygenme 4



Keygen Nasıl yazılır serisi kaptanın seyir defteri 4 :) Yine isme göre hesaplama yapılıyor kısa ve basit bir döngü. Canınızı sıkmayın 9 yazılık bu seride ilerideki crackmelerde farklı şeyler var. Şimdi kodlarımızı inceleyelim.
Programı Ollydebugger ile açalım CTRL+N yapıp Names penceresini görelim. GetDlgItemText apisine sağ tıklayarak "Set breakpoint on every reference" seçelim. Programı çalıştırıp isim serial girin. "Check Serial" tuşuna basınca crackme break pointte duracak. Bizde incelemeye başlıyacağız.
4011D3|.PUSH 19                                 ; /Count = 19 (25.)
4011D5|.PUSH crackme_.00403096                  ; |Buffer = crackme_.00403096
4011DA|.PUSH 66                                 ; |ControlID = 66 (102.)
4011DC|.PUSH [ARG.1]                            ; |hWnd = 00401000
4011DF|.CALL <JMP.&USER32.GetDlgItemTextA>      ; \GetDlgItemTextA-->serialin alındığı api
4011E4|.PUSH 1E                                 ; /Count = 1E (30.)
4011E6|.PUSH crackme_.00403078                  ; |Buffer = crackme_.00403078
4011EB|.PUSH 65                                 ; |ControlID = 65 (101.)
4011ED|.PUSH [ARG.1]                            ; |hWnd = 00401000
4011F0|.CALL <JMP.&USER32.GetDlgItemTextA>      ; \GetDlgItemTextA-->ismimizin alındığı api
4011F5|.CMP EAX,5    ;apiden dönen değerin biride ismin uzunluğudur o da eax'e yazılır
      ;burada eax yani ismin uzunluğu 5 ile karşılaştırılıyor
4011F8|.JB SHORT crackme_.00401249  ;ismimiz 5 handen kısa ise dallan yoksa devam et
4011FA|.MOV ECX,EAX    ;ismin uzunluğu ecx'e yazılıyor
4011FC|.MOV DWORD PTR DS:[4030C0],ECX  ;ecxdeki veri 4030C0 adresine yazılıyor
401202|.PUSH EDI                                ;  ntdll.7C900228
401203|.PUSH crackme_.00403051                  ; /Arg2 = 00403051
401208|.PUSH crackme_.00403061                  ; |Arg1 = 00403061
40120D|.CALL crackme_.00401266                  ; \crackme_.00401266--> bu call serial hesaplanan yeri çağırıyor F7 ile dalalım
CALL 401266 adresini çağırıyor bu adrese F7 (trace into) ile giriyoruz ve orada nelerin döndüğünü öğreneceğiz. Şimdi serilain hesaplandığı yerleri inceleyelim ve ne yapıldığını anlamaya çalışalım:
401266/$PUSH EBP
401267|.MOV EBP,ESP
401269|.ADD ESP,-4
40126C|.XOR EBX,EBX    ;yazmaçlar sıfırlanıyor
40126E|.XOR EDX,EDX
401270|.XOR EAX,EAX
401272|.XOR ECX,ECX
401274|.XOR ESI,ESI                     ;  crackme_.00401180
401276|.XOR EDI,EDI
401278|.MOV ECX,DWORD PTR DS:[4030C0]  ;ecx'e ismin uzunluğu yazılıyor
40127E|.SUB ECX,2    ;ecx=ecx-2
401281|.MOVSX EAX,WORD PTR DS:[ECX+403078] ;ecx+isim ->hangi karaktere denk geliyorsa oradan itibaren
      ;o karakterin hex değeri eax'e yazılıyor
401288|.XOR EAX,ECX    ;eax=eax XOR ecx
40128A|.IMUL ECX    ;eax=eax * ecx
40128C|.CDQ     ;convert double quad
40128D|.IDIV DWORD PTR DS:[4030C0]  ;eax=eax / ismin uzunluğu, edx=kalan
401293|.NOT EAX     ;eax'i ters çevir
401295|.MOV DWORD PTR DS:[4030C4],EAX  ;eax'deki değeri 4030C4 adresine yaz
40129A|.LEAVE
40129B\.RETN 8
Hesaplama bitince RETN ile içine girdiğimiz CALL değerinden bir sonraki satıra uçuyoruz:
401212|.PUSH EBX
401213|.PUSH crackme_.00403096
401218|.CALL crackme_.00401328   ;eax=girdiğimiz serial
40121D|.POP EBX                                 ;  kernel32.7C817077
40121E|.POP EDI                                 ;  kernel32.7C817077
40121F|.CMP EAX,DWORD PTR DS:[4030C4]  ;eax ile gerçek serial karşılaştırılıyor
401225|.JNZ SHORT crackme_.00401249  ;eşit değilse dallan
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 = 00401000
401242|.CALL <JMP.&USER32.SetWindowTextA>       ; \SetWindowTextA
Yukarıda olly ile de incelerseniz daha iyi anlarsınız, döngü dahi yok sadece ismimizin son iki hanesini alıp eax'e yazıp onunla bir kaç mantıksal işlem yapıyor o kadar. Keygenin kaynak kodlarını buradan alabilirsiniz.
Türk Ters Mühendisliğine katkıda bulunan herkese

sonsuz TEŞEKKÜRLER ........
Öldürmeyen Her Darbe Güce Güç Katar ::: BlueDeviL // SCT
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 şudurki: Emek verilipde yapılmış bir şeyi çalma, onu satın al.

Blue DeviL
E-Mail: bluedevil@sctzine.com
ICQ: 82503282

Keygenme 3



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:.
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 16bitliktir8'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
Keygeni üretme algoritmasının hazır halini yukarıda verdim. Kodların hazır halini BURADAN indirebilirsiniz.
sorularımı cevapsız bırakmayan herkese
sonsuz TEŞEKKÜRLER ........
Öldürmeyen Her Darbe Güce Güç Katar ::: BlueDeviL // SCT
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.

Blue DeviL
E-Mail: bluedevil@sctzine.com
ICQ: 82503282

Keygenme 2



Merhabalar, Keygen hazırlama serimiz devam ediyor. Yine aynı kişinin ikicinci crackmesine dallanıyoruz. Çok fark yok sadece algoritma da ufak değişiklikler yapılmış. İnceleyelim ve görelim:
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 = 004A0452 ('Crackme - not cracked yet',class='FHCF_Crackme')
4011DF|.CALL <JMP.&USER32.GetDlgItemTextA>      ; \GetDlgItemTextA ;serial burada alınıyor
4011E4|.PUSH 1E                                 ; /Count = 1E (30.)
4011E6|.PUSH crackme_.00403078                  ; |Buffer = crackme_.00403078
4011EB|.PUSH 65                                 ; |ControlID = 65 (101.)
4011ED|.PUSH [ARG.1]                            ; |hWnd = 004A0452 ('Crackme - not cracked yet',class='FHCF_Crackme')
4011F0|.CALL <JMP.&USER32.GetDlgItemTextA>      ; \GetDlgItemTextA;ismimiz alınıyor
4011F5|.CMP EAX,4    ;isim uzunluğu 4 ile karşılartırılıyor
4011F8|.JB SHORT crackme_.00401245  ;4'ten az ise dallan
4011FA|.MOV ECX,EAX    ;ecx=eax ismin uzunluğu ecxte
4011FC|.MOV DWORD PTR DS:[4030C0],ECX           ;  USER32.7E3821CC;ecx değerini 4030C0 adresine yazdırıyor
401202|.PUSH EDI
401203|.PUSH crackme_.00403051                  ; /Arg2 = 00403051
401208|.PUSH crackme_.00403061                  ; |Arg1 = 00403061
40120D|.CALL crackme_.00401262                  ; \crackme_.00401262;hesaplama yapılan call F7 ile dalalım
40120D adresindeki call 401262 adresine dallanıyor ve orada ismimizi kullanarak bir hesaplama yapıyor.Bu hesaplamanın sonucu bizim gerçek serialimiz.
401262/$ PUSH EBP    ;buradayız
401263|. MOV EBP,ESP
401265|. ADD ESP,-4
401268|. XOR EBX,EBX    ;ebx=0
40126A|. XOR EDX,EDX    ;edx=0
40126C|. XOR EAX,EAX    ;eax=0
40126E|. XOR ECX,ECX    ;ecx=0
401270|. XOR ESI,ESI                            ;esi=0  crackme_.00401180
401272|. XOR EDI,EDI    ;edi=0
401274|> MOVSX EAX,BYTE PTR DS:[ECX+403078] ;ismimizin ilk baytı alınıyor
40127B|. ADD EBX,EAX    ;her bayt ebx'e atılıp toplanıyor
40127D|. ADD EBX,123    ;ebx=ebx + 123 ;ebx'e 123h ekleniyor
401283|. INC ECX    ;ecx bir artır
401284|. CMP DWORD PTR DS:[4030C0],ECX  ;ecx ve ismin uzunluğu aynımı?
40128A|.^JNZ SHORT crackme_.00401274  ;değilse devam et
40128C|. ADD EBX,6666    ;döngü bitince ebx=ebx AND 6666h
      ;sonucunda gerçek serial ortaya çıkıyor
401292|. LEAVE
401293\. RETN 8
Döngüden çıkıp devam edince aşağıda gördüğünüz PUSH EBX komutu ile ebx'te bulunan gerçek serial yığına atılıyor. Daha sonra tekrar çağrılacak tabi ki.
401212|.PUSH EBX
401213|.PUSH crackme_.00403096                  ;  ASCII "112233"
401218|.CALL crackme_.00401320   ; bu CALL girdiğimiz seriali bir döngüye sokuyor ve oradan bir sonuç çıkartıyor
40121D|.POP EBX                                 ; bu komut ile yığına attığımız gerçek seriali çağırıp ebx'e yazıyoruz
40121E|.POP EDI                                 ;  0013FC78
40121F|.CMP EAX,EBX    ;iyi ve kötü serial burada karşılaştırılıyor
401221|.JNZ SHORT crackme_.00401245  ;eax doğru serial ise dallanma olmuyor ve devam ediliyo (iyi çocuk)
401223|.PUSH 40                                 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
401225|.PUSH crackme_.0040304D                  ; |Title = "wee"
40122A|.PUSH crackme_.00403019                  ; |Text = "You did it! Now make a keygen =)"
40122F|.PUSH 0                                  ; |hOwner = NULL
401231|.CALL <JMP.&USER32.MessageBoxA>          ; \MessageBoxA
401236|.PUSH crackme_.0040303A                  ; /Text = "Crackme - cracked!"
40123B|.PUSH [ARG.1]                            ; |hWnd = 004A0452 ('Crackme - not cracked yet',class='FHCF_Crackme')
40123E|.CALL <JMP.&USER32.SetWindowTextA>       ; \SetWindowTextA
Şimdide keygeni yazalım:
XOR EBX,EBX     ;ebx=0
XOR EDX,EDX     ;edx=0
XOR EAX,EAX     ;eax=0
XOR ECX,ECX     ;ecx=0
XOR ESI,ESI                           ;esi=0  crackme_.00401180
XOR EDI,EDI     ;edi=0
MOVSX EAX,BYTE PTR DS:[ECX+403078]  ;ismimizin ilk baytı alınıyor
ADD EBX,EAX     ;her bayt ebx'e atılıp toplanıyor
ADD EBX,123h     ;ebx=ebx + 123h ;ebx'e 123h ekleniyor
INC ECX      ;ecx bir artır
CMP DWORD PTR DS:[4030C0],ECX   ;ecx ve ismin uzunluğu aynımı?
JNZ SHORT crackme_.00401274   ;değilse devam et
ADD EBX,6666h     ;döngü bitince ebx=ebx AND 6666h
      ;sonucunda gerçek serial ortaya çıkıyor
Yukarıda keygen kodlarını alıp radasmye göre düzenleyip algoritmamızı hazırladık. Ancak bir şeye dikkat etmenizi istiyorum. Kodlara 123h ve 6666h yazdık, yani bunlar on altılık değerler, karışıklık olmasın. Keygen kaynak kodlarını BURADAN indirebilirsiniz.
sorularımı cevapsız bırakmayan herkese
sonsuz TEŞEKKÜRLER ........
Öldürmeyen Her Darbe Güce Güç Katar ::: BlueDeviL // SCT
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.

Blue DeviL
E-Mail: bluedevil@sctzine.com
ICQ: 82503282

Keygenme 1

Keygen Nasıl Yazılır?01.11.2009




Merhabalar, keygen hazırlama konusunda basit bir keygenme ile yazı hazırlamaya devam ediyorum. Amacımız keygen algoritmasını anlamak, analiz etmek, çözmek ve kendi keygenimizi hazırlamak. Bunun için satır satır ilerleyecek ve algoritmayı anlayacağız. Assembly ile keygenimizi hazırlayacağız. Bunun için SCTZine #14 ve #15 deki assembly yazılarını okumanızı ayrıca web sitemizdeki assembly sayfasına uğramanızı tavsiye ederim.
Artık başlayalım. Programımızı PEiD ile kontrol ediyoruz, herhangi bir sıkıştırma yok. Kripto analizide 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 = 00100526 ('Crackme - not cracked yet',class='FHCF_Crackme')
4011DF|.CALL <JMP.&USER32.GetDlgItemTextA>      ; \GetDlgItemTextA ;seriali alıyor
4011E4|.PUSH 1E                                 ; /Count = 1E (30.)
4011E6|.PUSH crackme_.00403078                  ; |Buffer = crackme_.00403078
4011EB|.PUSH 65                                 ; |ControlID = 65 (101.)
4011ED|.PUSH [ARG.1]                            ; |hWnd = 00100526 ('Crackme - not cracked yet',class='FHCF_Crackme')
4011F0|.CALL <JMP.&USER32.GetDlgItemTextA>      ; \GetDlgItemTextA ;ismi alıyor
4011F5|.CMP EAX,4    ; ismimiz 4 hanemi? az ise hiç algoya sokmuyor
4011F8|.JB SHORT crackme_.00401245  ; bu jump ile dallanıyor
4011FA|.MOV ECX,EAX    ; eax değeri ecx'e atılıyor, eax'te ismimizin kaç hane olduğu var
4011FC|.MOV DWORD PTR DS:[4030C0],ECX  ; ecx'te bu değeri 4030C0 adresine atıyor
401202|.PUSH EDI
401203|.PUSH crackme_.00403051                  ; /Arg2 = 00403051
401208|.PUSH crackme_.00403061                  ; |Arg1 = 00403061
40120D|.CALL crackme_.00401262                  ; \crackme_.00401262 ;bu call içinde birşeyler oluyo F7 ile içine girelim
Yukardaki CALL 'un içine girersek buraya dallanıyoruz:
401262/$ PUSH EBP
401263|. MOV EBP,ESP
401265|. ADD ESP,-4
401268|. XOR EBX,EBX    ; ebx=ebx XOR ebx =0
40126A|. XOR EDX,EDX    ; edx=0
40126C|. XOR EAX,EAX    ; eax=0
40126E|. XOR ECX,ECX    ; ecx=0
401270|. XOR ESI,ESI                            ; crackme_.00401180
401272|. XOR EDI,EDI    ;edi=0
401274|>>MOVSX EAX,BYTE PTR DS:[ECX+403078] ;403078=ismimiz bu adreste
      ;sırayla ismimizin her bir hanesinin hex değeri eax'e atılıyor
40127B|. ADD EBX,EAX    ;ebx=ebx AND eax
40127D|. INC ECX    ;ecx=ecx+1(bu sayaç yazmacı bir bir artarak 
      ;ismimizin diğer hanelerinin alınmasını sağlıyor)
40127E|. CMP DWORD PTR DS:[4030C0],ECX  ;4030C0 adresine ismimizin kaç hane olduğunu atmıştık
      ;o uzunluğu ecx ile karşılaştır
401284|.^JNZ SHORT crackme_.00401274  ;aynı değilse devam
401286|. LEAVE
401287\. RETN 8
Bu CALL sonucunda ismimizin her bir karakterinin hex değeri birbiriyle AND işlemi yapılarak bir sonuç elde ediliyor. Döngü bitince CALL'dan çıkıyoruz ve devam ediyoruz:
401212|.PUSH EBX    ;yukardaki döngünün sonucu ebx'e yazılıp yığına atılıyor
401213|.PUSH crackme_.00403096                  ;  ASCII "112233" ;serial
401218|.CALL crackme_.00401314   ; buaradaki callda hesaplama yapılıyor girelim içine F7 ile
Bu call içinde bir takım hesaplamalar yapılıyor şimdi satır satır inceleyelim:
401314/$  PUSH EBP
401315|.  MOV EBP,ESP
401317|.  PUSH EBX
401318|.  PUSH ESI
401319|.  PUSH EDI                              ; crackme_.00403096
40131A|.  MOV EDI,[ARG.1]                       ; crackme_.00403096; ediye serialimiz atılıyor
40131D|.  MOV ESI,[ARG.1]                       ; crackme_.00403096; aynı şekilde esiyede
401320|> /MOV AL,BYTE PTR DS:[EDI]  ; serialimizin her bir karakterinin hex değeri al'ye atılıyor
401322|. |INC EDI                               ; crackme_.00403096; bir sonraki karakter
401323|. |OR AL,AL    ; al=al OR al
401325|.^\JNZ SHORT crackme_.00401320  ; sıfır değilse devam et
Yukardaki küçük döngünün amacı Acaba kullanıcı serial girdi mi onun kontrolü. Çünkü eğer bir sayı girilmişse bunun bir baytının yine o bayt ile OR işlemine tabi tutulmasının sonucu yine kendisi olacaktır. Ama Serial girilmemişse sonuç 0'dır ve döngüden çıkılır.
401327|.  SUB ESI,EDI                           ;esi=esi-edi ;edi'de serial vardı ama yukardaki döngüde 
      ;ediyi küçülterek içindeki serial bitti ve sıfırlandı
      ;bu çıkarma işlemiyle esi ye aralarındaki farkı yazdıracağız
      ;ancak esi küçük edi büyük değer, sonucu ise aşağıda esiyi
      ;NOT 'layaraktekrar esiye yazdıracağız
401329|.  XOR EBX,EBX    ;ebx=0
40132B|.  ADD EDI,ESI    ;edi=edi+esi; bu toplamanın sonucunda edi'de tekrardan serialimiz olacak
40132D|.  XOR EDX,EDX    ;edx=0
40132F|.  NOT ESI    ;NOT işlemi sonucunda hedefin değerleri tersine döner
      ;yani ikili sistemden konuşursak 1 olur 0, 0 ise olur 1
      ;bu işlemin sonucunda esi'de yaniden bizim serialimizin uzunluğu olmuş olacak
401331|.  JMP SHORT crackme_.00401356  ;koşulsuz 401356 adresine dallan
401333|> /MOV AL,BYTE PTR DS:[EDI]  ;serialin ilk hanesinin hex değerini AL'ye yaz
401335|. |CMP AL,41    ;41 ile karşılaştır(41h = ASCII olarak A harfidir)
401337|. |JB SHORT crackme_.00401345  ;daha altındaysa dallan(serialimizde harf de olabiliyor)
401339|. |SUB AL,57    ;41h dan büyükler için al=al-57
40133B|. |ADC DL,0    ;dl=dl ADC 0
40133E|. |SHL DL,5    ;DL=DL SHL 5
401341|. |ADD AL,DL    ;AL=AL ADD DL
401343|. |JMP SHORT crackme_.00401347
401345|> |SUB AL,30    ;AL=AL-30h
401347|> |LEA ECX,DWORD PTR DS:[ESI-1]  ;ecx=esi-1 (esi'de serial uzunluğu vardı)
40134A|. |AND EAX,0F    ;eax=eax AND 0F (0Fh=16d)
40134D|. |SHL ECX,2    ;ecx=ecx SHL 2
401350|. |SHL EAX,CL    ;eax=eax SHL CL
401352|. |ADD EBX,EAX    ;ebx=ebx + eax
401354|. |INC EDI                               ;edi değerini bir artır
401355|.  DEC ESI    ;esiyi bir azalt
401356|>  OR ESI,ESI    ;buradan başlıyouz;esi= esi OR esi
401358|.^\JNZ SHORT crackme_.00401333  ;esi sıfır değilse devam et
40135A|.  MOV EAX,EBX    ;döngü bitince eax'e ebx değeri atılıyor
40135C|.  POP EDI                               ;  crackme_.00403096
40135D|.  POP ESI
40135E|.  POP EBX
40135F|.  LEAVE
401360\.  RETN 4    ;döngüden çık
Döngüden çıkıp aşağıdaki kodlara devam ediyoruz ancak 2 satır sonra bir karşılaştırma yapılıyor. POP EBX ile yığın(stack)dan bir değer çağrılıyor ve bu değer eax ile yni yukardaki döngüde yaptığımız işlemin sonucu ile karşılaştırılıyor. Yani İsmimizi soktuğumuz döngüden çıkan sonuç bizim gerçek serialimizdi. hemde ham hali(hex hali)
40121D|.POP EBX                                  ;  0013FC78 ;yığından çağırdığı değer daha önce ismimiz ile yapılan döngünün sonucu
40121E|.POP EDI                                  ;  0013FC78
40121F|.CMP EAX,EBX    ;serialden üretilen sonuç ile ismimizden üretilen sonuç burada karşılaştırılıyor
401221|.JNZ SHORT crackme_.00401245  ;patch yapmak ne kadar kolay olur du değil mi :D
401223|.PUSH 40                                  ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
401225|.PUSH crackme_.0040304D                   ; |Title = "wee"
40122A|.PUSH crackme_.00403019                   ; |Text = "You did it! Now make a keygen =)"
40122F|.PUSH 0                                   ; |hOwner = NULL
401231|.CALL <JMP.&USER32.MessageBoxA>           ; \MessageBoxA
401236|.PUSH crackme_.0040303A                   ; /Text = "Crackme - cracked!"
40123B|.PUSH [ARG.1]                             ; |hWnd = 00100526 ('Crackme - not cracked yet',class='FHCF_Crackme')
40123E|.CALL <JMP.&USER32.SetWindowTextA>        ; \SetWindowTextA
401243|.JMP SHORT crackme_.00401245
401245|>JMP SHORT crackme_.0040125C
401247|>PUSH [ARG.4]                             ; /lParam = B04B4
40124A|.PUSH [ARG.3]                             ; |wParam = 67 (103.)
40124D|.PUSH [ARG.2]                             ; |Message = WM_COMMAND
401250|.PUSH [ARG.1]                             ; |hWnd = 00100526 ('Crackme - not cracked yet',class='FHCF_Crackme')
401253|.CALL <JMP.&USER32.DefWindowProcA>        ; \DefWindowProcA
401258|.LEAVE
401259|.RETN 10
40125C|>XOR EAX,EAX
40125E|.LEAVE
40125F\.RETN 10
O zaman bizde ismimizi soktuğumuz döngüyü alır assemblyde güzelce bir keygen yazarız :)
Peki keygeni nasıl yazacağız? Sormak bile gereksiz çünkü yukarıda crackme bizim ismimizi alıp döngüye soktuğunda çıkarttığı sonuç zaten serialdi. Ben o döngüyü aldım doğrudan assemblyde düzenledim Kaynak kodlarını buradan indirebilirsiniz.
sorularımı cevapsız bırakmayan herkese
sonsuz TEŞEKKÜRLER ........
Öldürmeyen Her Darbe Güce Güç Katar ::: BlueDeviL // SCT
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.

Blue DeviL
E-Mail: bluedevil@sctzine.com
ICQ: 82503282


Alıntıdır