Ziggy's KeyGenMe #1

kresuz
Program Url:keygenme1.exe
Program Tipi: KeyGenMe
     Araçlar:
OllyDbg version 1.10
Basit (x )  Orta ( )  Zor ( )  Pro ( )


Başlangıç

Forum kuralları gereği KeyGenMe ler üzerine yazıyorum. Burada ollydbg'in bazı özelliklerine de değineceğim.(breakpoint,asmcopy,Patch vs.).Önce zugzwang'ın derlediği Ollydbg v1.10 cekin.(Ollydbg'un bütün pluginleri hazır şekilde)
Yazı

A==>Seriali bulmak ve keygen yazmak:

Ollydbg'u açın F3 ile Keygenme1 dosyasını yükleyin F9 ile yüklenmiş olan proğramı çalıştırın.Name bölümüne kresuz,serial bölümüne 1234567890 yazın ve register tuşuna basın.İnvalid registration şeklinde bir mesaj verdi.tamam tusuna basın ve ollydbg'a geçin.Şimdi şu sıraları takip edin yukarıda olan Plugins tuşu ==>ApiBreak==>ApiBreak==>Dialog==>GetDlgItemTextA ==>ok Şimdi tekrar Keygenme1 dosyasına dönün ve tekrar register tuşuna basın.Breakpoint çalıştı.Ollydbg ye döndük.F2 tuşu ile breakpointi kaldırın.Bir sefer ALT+F9 basınki apilerden kurtulup,olly de calısan proğram kodlarına dönün 4010DD PUSH 50 =========>Buradayız F8 ile ilerliyoruz. 4010DF PUSH keygenMe.00403396 4010E4 PUSH 3EA 4010E9 PUSH DWORD PTR DS:[4036E4] 4010EF CALL 4010F4 PUSH keygenMe.00403396 4010F9 CALL 4010FE OR EAX,EAX 401100 JNZ SHORT keygenMe.0040111C 401102 PUSH keygenMe.00403014 401107 PUSH 3F1 40110C PUSH DWORD PTR DS:[4036E4] 401112 CALL 401117 JMP keygenMe.004012C0 40111C PUSH keygenMe.00403396 401121 CALL keygenMe.004012C7 ==============>F7 ile calle bakıyoruz (keygen Başlıyor) 401126 OR EAX,EAX / 401128 JNZ SHORT keygenMe.0040117D / =>hata mesajı 40112A PUSH keygenMe.004030EE / 40112F PUSH DWORD PTR DS:[4036E4] / 401135 CALL / 40113A PUSH 50 / 40113C PUSH keygenMe.00403396 / / / 4012C7 PUSH EBP 4012C8 MOV EBP,ESP 4012CA PUSH keygenMe.00403396 ====>Girilen ismi al (kresuz) 4012CF CALL ====>Girilen ismi büyük harfe çevir. 4012D4 PUSH [ARG.1] ====>Girilen isim (KRESUZ) 4012D7 CALL ====>listele 4012DC MOV EDX,EAX ====>ismin boyutunu EDX e al (kresuz 6h) 4012DE TEST EDX,EDX 4012E0 JLE SHORT keygenMe.0040134F 4012E2 XOR ESI,ESI ====>esi yi sıfırla (serial eside olacak) 4012E4 MOV ECX,1 ====>ecx 1 4012E9 MOV EAX,[ARG.1] ====>eax'a ismi al 4012EC MOV AL,BYTE PTR DS:[ECX+EAX-1] ====>isimden 1 karakter AL'e al 4012F0 CMP AL,20 ====>alınan karakter boşluk ise diger karakterlere bak 4012F2 JE SHORT keygenMe.00401303 4012F4 AND EAX,0FF 4012F9 IMUL EAX,DWORD PTR DS:[403616] ====>eax'ı [403616] deki sayı ile carp([403616]=01749h) 401300 DEC EAX ====>eax' 1 eksilt 401301 ADD ESI,EAX ====>seriali esi'ye ekle. 401303 INC ECX ====>diger karakteri al 401304 DEC EDX ====>ismi boyutunu 1 eksilt 401305 JNZ SHORT keygenMe.004012E9 ====>ismin boyutu 0 değilse başa dön 401307 LEA EDX,DWORD PTR DS:[4034D6] ====>Edx'e seriali al 40130D MOV EAX,ESI ====>Eax' seriali al 40130F PUSH EAX ====>serial eax'ta 401310 PUSH keygenMe.0040361F 401315 PUSH EDX 401316 CALL 40131B ADD ESP,0C 40131E PUSH keygenMe.0040361A ===>(SnD-)ekle 401323 PUSH keygenMe.00403256 ===>serialin basına (SnD-)ekle Name==>kresuz ,Serial==>SnD-2885118 Bu bilgilere göre keygenimizi yazalım. (Keygen Taslağı için Mr_Stop'a teşekkürler) .data fmat db "SnD-%d",0 Generate PROC USES ebx ecx edx esi edi, _hWin:DWORD invoke GetDlgItemText, _hWin, EDIT_NAME, ADDR szName, 32h ;ismi al cmp eax,0 ;isimde birşey var mı ? je @@err ;yoksa hata mesajını göster invoke CharUpperBuff,addr szName,eax ;büyük harfe çevir MOV EDX,EAX MOV ECX,00000001 ;ecx=1 XOR ESi,ESi ;esi=0 LOC_004012E9: ;Ref: 00401305 MOV EAX, offset szName MOV AL, BYTE PTR [EAX+ECX-01] CMP AL, 20h JE LOC_00401303 AND EAX,0FFh IMUL EAX,1749h DEC EAX ADD ESI,EAX LOC_00401303: ;Ref: 004012F2 INC ECX DEC EDX JNZ LOC_004012E9 invoke wsprintfA,addr szSerial,addr fmat,esi ;desimale çeviriyoruz invoke SetDlgItemTextA, _hWin, EDIT_KEY, offset szSerial ;edit box'a yazıyoruz fzk: xor eax, eax RET @@err: invoke SetDlgItemTextA, _hWin, EDIT_KEY, offset nameerr ;isim girilmedi jmp fzk Generate ENDP Masm da derlediğim keygenekte

B==>Proğramın kendisini keygene çevirmek. Gerçi proğram yazarı Patch yapmayı yasaklıyor.Biz burada bazı yöntemleri deneyeceğiz.Bu arada ollydbg'nin bazı özelliklerinide kullanacağız.Şimdi proğrama dönelim. Hatırlayalım. 401121 CALL keygenMe.004012C7 ==============>F7 ile calle bakıyoruz (keygen Başlıyor) 401126 OR EAX,EAX / 401128 JNZ SHORT keygenMe.0040117D / =>hata mesajına yönlendiriyordu. 401323 PUSH keygenMe.00403256 ===>serialin basına (SnD-)ekle Name==>kresuz ,Serial==>SnD-2885118 PUSH keygenMe.00403256 doğru seriali saklıyordu biz şimdi messageboxa hata mesajı yerine push 00403256 yı göndersek ne olur.bakalım. 401128 den itibaren F8 ile takip edin .004011BE de messageboxa gönderilen PUSH keygenMe.00403086 (invalid registration details) yazısı var.Olly bunları hemen yanında gösteriyor. F8 ile 004011BE inin üzerine kadar gelin.Mouse üzerinde iken sağ tuş Assamble -space yapıp önümüze gelen ekrandaki PUSH 403086 degerini PUSH 00403256 yapın.

Assemble tuşuna basın ve kapatın.F9 tusu ile proğramı çalıştırın.
Gördüğünüz gibi proğram hata mesajı yerine gercek seriali gösterdi.Peki bu değişikliği Hiew veya Ultraedit-32 kullanmadan 
kalıcı hale getirebilirmiyiz ?.Olly bu konuda da bize çok yardım ediyor tam tembel işi.Tekrar ollydby dönün.
(004011BE nin push degerleri değişikken ve proğram kodları önümüzde iken).Yine mouse ile kodlar üzerinde sağ tuş yapın.
Şu sırayı takip edin.Copy to executable ==>all modifications==>copy all==>önümüze gelen ekranda yine sağtuş==>save file ve 
farklı bir isimle kaydet.Hepsi bukadar basit ve kolay.Ultraedit32 ye gerek yok.Yazım uzun oldu bir şeyden bahsetmeden 
konuyu kapatamayacağım.Ollydbg'nin kolaylıkları ve sürekli sorulan sorularla ilgili.Softice de eax degerleri d eax veya 
? eax şeklinde öğreniliyordu.olly de bu iş daha kolay.Bir örnek:Proğramı yeniden ollydbg de f3 ile yükleyin F9 a basın 
keygenme çalıssın.sallama name ve serial girin.Register tusuna basmadan ollydbg'ye dönün.
ctrl+G tusuna aynı anda basın önünüze gelen ekrana 0040130F yazın(niye bunu yazdık yukarıdan hatırlayın 
[40130F	PUSH EAX  ====>serial eax'ta])ok.tusuna basın.simdi 40130F üzerindeyiz. F2 ile breakpoint koyun ve programa dönüp 
register tusuna basın.Şimdi ollydby'e döndük.
Yukarıda görüldüğü gibi olly de sağ üstte ki bölümde bulunan eax çift tıklanırsa burada eax ın hexadecimal ve decimal 
degerleri(Signed bölümünde)görülebilir.
Son Notlar
Bu yazıda yazım yanlışları , bilgi hatası olabilir.Eğer bir yanlış bulursanız bana mail atın düzeltmeye çalışırım.

kresuz E-Mail: kresuz@hotmail.com