|
ÖN SÖZ |
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ş.
YAZI |
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.
SON NOTLAR |
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.
TEŞEKKÜRLER |
Türk Ters Mühendisliğine adanmış her saniyenin sahiplerine
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