|
ÖN SÖZ |
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.
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_.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
SON NOTLAR |
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
TEŞEKKÜRLER |
Türk Ters Mühendisliğine gönül vermiş
zaman harcamış herkese
sonsuz TEŞEKKÜRLER ........
zaman harcamış herkese
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 şudurki: Emek verilipde yapılmış bir şeyi çalma, onu satın al.
Diyeceğim şudurki: Emek verilipde yapılmış bir şeyi çalma, onu satın al.
Hiç yorum yok:
Yorum Gönder