Natural

natural

Breaking News

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

Hiç yorum yok