|
ÖN SÖZ |
Önceki örneklere nazaran bir farklı crackme daha. Bunu beğendim. Çünkü bu crackme'yi gerçekren reverse etmemiz gerekecek. Öncekilerde serial hesaplanıp ortaya çıkıp bizimkiyle kontrol ediliyordu. Ancak burada gerçek serial algoritmaya girmiyorsa hata oluyor. Bu sebeple crackme'deki serial kontrol algoritmasının tersine çevireceğiz ki gerçek olan tek seriali bulalım.
YAZI |
Crackme'yi olly ile yükleyin. CTRL + N yapın. Gelen Pencerede programın dallandığı APIleri görüyosunuz. Daha doğrusu windowsdali DLL(dinamik link kütüphanelerinden)den çağırdığı APIleri görüyorsunuz. Bize lazım Olan "GetDlgItemText" APIsi onu bulup sağ tıklayın ve "Set Breakpoint on every reference" seçeneğini seçin. Olly menüsünde B işareti breakpointleri gösterir. Ona tıklarsanız programın breakpointleri koyup koymadığını hangi adreslere koyduğunu görürsünüz. neyse lafı uzattık. Şimdi F9 ile çalıştıralım crackme açılınca isim seriali girelim "check" diyince olly hoop diyecek ve duracağız:
4011D3|.PUSH 19 ; /Count = 19 (25.) 4011D5|.PUSH crackme_.00403082 ; |Buffer = crackme_.00403082 4011DA|.PUSH 66 ; |ControlID = 66 (102.) 4011DC|.PUSH [ARG.1] ; |hWnd = 000C0764 ('Crackme - not cracked yet',class='FHCF_Crackme') 4011DF|.CALL <JMP.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA---> serialimiz burada alınıyor (breakpoint buraya konulmuş) 4011E4|.CMP EAX,8 ;serialin uzunluğu 8 ile karşılaştırılıyor 4011E7|.JNZ SHORT crackme_.0040124A ;8 den farklı ise dalllan yoksa devam et 4011E9|.PUSH 1E ; /Count = 1E (30.) 4011EB|.PUSH crackme_.00403064 ; |Buffer = crackme_.00403064 4011F0|.PUSH 65 ; |ControlID = 65 (101.) 4011F2|.PUSH [ARG.1] ; |hWnd = 000C0764 ('Crackme - not cracked yet',class='FHCF_Crackme') 4011F5|.CALL <JMP.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA---->ismimiz bu api ile alınıyor(diğer breakpoint buraya konulmuş) 4011FA|.TEST EAX,EAX ;isim var mı yokmu 4011FC|.JE SHORT crackme_.0040124A ;yoksa dallan 4011FE|.PUSH EDI 4011FF|.PUSH crackme_.0040303F ; /Arg2 = 0040303F 401204|.PUSH crackme_.0040304F ; |Arg1 = 0040304F 401209|.CALL crackme_.00401267 ; \crackme_.00401267 40120E|.PUSH EBX 40120F|.PUSH crackme_.00403082 401214|.CALL crackme_.00401330 401219|.CALL crackme_.00401271 ;hesaplamamın yapıldığı call buraya F7 ile dalıyoruz 40121E|.POP EBX 40121F|.POP EDI 401220|.CMP EDX,91919191 401226|.JNZ SHORT crackme_.0040124A 401228|.PUSH 40 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL 40122A|.PUSH crackme_.0040303B ; |Title = "wee" 40122F|.PUSH crackme_.00403019 ; |Text = "You did it! =)" 401234|.PUSH 0 ; |hOwner = NULL 401236|.CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA 40123B|.PUSH crackme_.00403028 ; /Text = "Crackme - cracked!" 401240|.PUSH [ARG.1] ; |hWnd = 000C0764 ('Crackme - not cracked yet',class='FHCF_Crackme') 401243|.CALL <JMP.&USER32.SetWindowTextA> ; \SetWindowTextA
Aşağıda gerçek serial hesaplanmıyor arkadaşlar eğer sizde olly ile tek tek incelerseniz göreceksiniz. Burada girilen seriali belli komutlar ile test ediyor. Eğer istenen değerler ile bir doğruluk varsa hataya atlama yapılmıyor ve devam ediyor. Şimdi kodları inceleyelim:
401271/$MOV CL,0FD ;CL=0FDh 401273|.XOR EBX,EBX ;ebx=0 401275|.MOV BX,AX ;bx=ax-> serialin en sağ 4baytı 401278|.AND EAX,FFFF0000 ;seriali FFFF0000 ile AND işlemi yap 40127D|.ROR EAX,10 ;eax=eax ROR 10 401280|.ADD BX,0FCDE ;bx=bx + 0FCDEh 401285|.ROR AX,CL ;AX=AX ROR CL(0FDh) 401288|.CMP AX,1337 ;burada ax=1337 olmalı 40128C|.JNZ SHORT crackme_.004012A2 40128E|.ROL BX,CL ;BX=BX ROL CL(0FDh) 401291|.CMP BX,9292 ;burada bx 9292h olmalı 401296|.JNZ SHORT crackme_.004012A2 401298|.MOV EDX,91919191 ;edx=91919191h eğer doğru serial grildiyse ;buraya kadar devam ediyor ve edx'e bu değer atanıyor ;sonrada mesajdan önce bununla karşılaştırma yapılıyor 40129D|.SUB EAX,3897 ;eax=eax-3897h bunun neden yaptığını anlamadım
Sanırım keygeni nasıl yazmamız gerektiğini biraz detaylı anlatmalıyım. Yukarıdaki döngüyü olly ile incelediğinizde herhangi bir serialin hesaplanmadığını anlamış olmalısınız. Anlamadıysanız, bilgisayarı kapatıp televizyonu açın. Anladıysanız Ters mühendislik şimdi başlıyor, çünkü yukarıdaki kodu tersten çalıştırmazsak gerçek seriali bulamayız, şimdi inceleyelim:
SerialUret PROC uses ebx edi esi,hWin:DWORD;keygenimiz açılır açılmaz bu işlemi çalıştırıp ;bize gerçek seriali verecek xor eax,eax ;eax=0 xor ecx,ecx ;ecx=0 xor ebx,ebx ;ebx=0 mov cl,0FDh ;CL=0FDh->CL değeri döngü boyunca değişmiyor mov bx,9292h ;BX=9292h-&en son işlem bx mutlaka 9292h olmalı ror bx,cl ;BX=BX ROR CL-> ROL işleminin tersi mov ax,1337h ;AX=1337h-> AX'de mutlaka 1337h olmalı rol ax,cl ;AX=AX ROL CL->ROR'un terside ROL sub bx,0FCDEh ;BX=BX-0FCDEh->toplamanın tersi çıkartma ilkokul matematiği :D rol eax,10h ;EAX=EAX ROL 10h->bununla axte yazılı olan değeri eax'in en soluna yazıp ax'i boş bırakıyoruz mov ax,bx ;ax=bx->boşalan ax değerine bx'i yazıyoruz mov [serial],eax ;eax=doğru serial ;Crackme için tek bir serial var ;bizim girdiğimiz seriali bir döngüden geçirerek ;bazı kontroller yapıyor ve arada hata bulunca döngüden çıkıyor ;biz döngüyü inceleyip ters çevirdik ;ve gerçek seriali hesapladık invoke wsprintf,addr serial,addr format,serial;seriali olduğu gibi alır hex hali ile invoke SetDlgItemText,hWin,edtSerial,ADDR serial xor eax,eax ret SerialUret endp
SON NOTLAR |
basit olmasına rağmen en beğendiğim yazı bu oldu. Algoritma basit ama öğrenilmesi gereken bir konu ezber yok kafa çalıştırma var.
Birde aşağıdaki resmi incelemenizi istiyorum:
Birde aşağıdaki resmi incelemenizi istiyorum:
TEŞEKKÜRLER |
Türk Ters Mühendisliğine Gönül vermiş
zamanını harcamış herkese
sonsuz TEŞEKKÜRLER ........
zamanını 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