Puzzle
Inlay keygen algoritması tam çözüm |
|
maviboynuz |
|
Program
Url:
http://www.gamehouse.com Program
Tipi:
süre kısıtlaması |
|
Araçlar: Softice, c++ builder(keygen için),
sabır |
|
Basit
( x ) Orta ( x ) Zor ( ) Pro ()
|
|
Başlangıç
|
Selamün
Aleyküm, herkese hayırlı akşamlar. Gamehouse oyunlarıyla uğraşmaya devam
ediyoruz. 13
adımda AdvantureInlay unpack
yazısında da bahsettiğimiz gibi bu oyunların koruması oldukça dandik. Biz oyunu
koruma dosyasından kolayca ayırabilsek de bu sefer keygen algoritmasını
çözeceğiz ve kendi keygenimizi yazacağız. Oldukça uzun bir yazı olacağını tahmin
ediyorum. Ayrıntıya girmeyi de düşünüyorum. Yazıyı daha iyi anlayabilmeniz için
önce programı indirip, biraz karıştırmanızı tavsiye ederim. İnşallah yararlı
olur. O zaman bilgisayar başına serüvenimiz başlıyor.
|
Yazı |
Programın keygen algoritması ilk bakıldığında çok karışık görünüyor. Oysa
oldukça basit. Tek sorun takibi yapabilmekte. Çünkü adamlar isme karşılık gelen
serialı 4 veya 5 aşamada hesaplatmışlar programlarına. Ben debug işlemleri için
softice’ı kullanmayı tercih ettim. Aynı işlemleri Ollydbg de yapıyor. Programı
bilgisayarınıza kurun ve biraz
oynayın. Gerçekten insanı rahatlatan oyunlar. Bağımlılık yapıyor bile denebilir.
Oyunu her açtığınızda aşağıdaki pencere ile
karılaşıyorsunuz.
|
|
Unregistered Version yazan pencere başlığında oyunu daha 41 dakika
oynayabileceğimiz yazıyor. Try Now ile oyunu oynuyoruz. Ancak biz Name ve Code
kısmına birşeyler yazmaya başlayınca Try Now pasif hale geliyor. Name kısmına
maviboynuz
Code
kısmına da 1234567890 sayılarını girelim ve Enter License Information butonuna
tıklayıp hata mesajına bir bakalım.
|
|
Kötü olan ingilizcemle çevirmeye çalışayım. “Lisans kodunuzun uzunluğu
yanlış, lütfen girdiğiniz bütün harfleri kontrol edin.” diyor. Demek ki kod için sabit bir uzunluk var.
Program girdiğimiz lisans kodunun doğruluğuna bakmadan uzunluğunu kontrol
ediyor. Tamam butonuna tıklayıp bu sefer Ctrl+d tuşlarına basarak softice
programını çalıştıralım. bpx hmemcpy yazarak breakpointimizi koyalım. Softice’ın
komut satırına x yazıp enter tuşuna basalım ve softice şimdilik uyku moduna
geçsin. Enter License Inormation butonuna tekrar tıklayalım. Evet softiceDayız.
bd 0 yazarak breakpointu kaldırıyoruz. F12 tuşuna basarak
(9
defa) program kodlarına ulaşıyoruz. Artık işimizi yapabiliriz. Kodlar önümüzde.
Elimden geldiğince açıklamaya çalışacağım.
//---0-------0---------0----------0------------0------------0----------------0-----------------0-------------------------0
00512584 6A 18 PUSH 18 ; softice ile programa giriş noktamız
00512586 8D4424 28 LEA EAX, DWORD PTR SS:[ESP+28] ; esp+28 deki adres eax’e yükleniyor
0051258A 50 PUSH EAX ; push komutları dikkat ederseniz genellikle call
0051258B 68 E9030000 PUSH 3E9 ;çağrılarından önce kullanılıyor. Push komutları
00512590 56 PUSH ESI ;değeri hafızada saklıyor. Böylece registerlar baş-
00512591 FFD7 CALL NEAR EDI ;ka işlemler için kullanılabiliyor.
00512593 8A4424 40 MOV AL, BYTE PTR SS:[ESP+40] ;esp+40 adresimde girdiğimiz ismin ilk karakteri
;var. Al ye aktarılıyor.
00512597 84C0 TEST AL, AL ;test komutu ile al nin boş olup olmadığına bakıyor
00512599 0F84 33030000 JE INLAY.005128D2 ;al nin içi boşsa program dallanacak.
0051259F 8A4424 24 MOV AL, BYTE PTR SS:[ESP+24] ;esp+24 adresinde de girdiğimiz kodun ilk karak-
005125A3 84C0 TEST AL, AL ;teri yer alıyor. Ve al ye yüklenerek test ile kontrol
;ediliyor. Bir değer girilmemişse program adrese
005125A5 0F84 27030000 JE INLAY.005128D2 ;dallanıyor. Bu iki karşılaştırma bana mantıksız
;geldi. Çünkü isim veya kod kısmını boş bırakır-
;sanız zaten Enter license information butonuna
;tıklayamıyorsunuz. Yani gerek yok kontole.
005125AB 8D4C24 24 LEA ECX, DWORD PTR SS:[ESP+24] ;girdiğimiz yanlış lisans kodunun ilk karakteri
;ecx’e yükleniyor.
005125AF 51 PUSH ECX
005125B0 E8 EBEBFFFF CALL
INLAY.005111A0
;bu çağrıya girmeden lisans kodumuzla ilgili bir
;işlem yapılacağını tahmin edebiliriz. F8 ile bakalım.
//---1-------1---------1----------1------------1------------1----------------1-----------------1-------------------------1
burda biraz açıklama yapmak gerekiyor. Dallanma komutları ile dallandıkları komut satırlarını aynı renk yaptım ki anlaşılması kolay olsun. Evet bu kısımda girdiğimiz lisans kodu bazı karşılaştırmalardan geçiyor. Biraz inceleyelim. Şimdi satır satır açıklama ile program parçasının toplu olarak yaptığı işi açıklama farklı anlamlar içerebilir. Biraz öyle biraz da öyle deneyelim.
005111A0 8B4C24 04 MOV ECX, DWORD PTR
SS:[ESP+4] ;esp+4 de
bizim girdiğimiz lisans kod var. Bu kodun ilk ka-
;rakterinin adresi ecx registerına yükleniyor. Adresin
yük-
;lendiğine dikkat edin. Ecx 1 artarsa bu lisans kodunun 2.
;karakterine geldiğimiz anlamına gelir.
005111A4 8A01
MOV AL, BYTE PTR
DS:[ECX]
;lisans kodumuzun ilk karakteri Al registerında
005111A6 33D2
XOR EDX, EDX
;edx regiserı sınıflanıyor. (1xor 1= 0, 0 xor 0=0,1 xor
0=1)
;olduğundan kendisiyle xorlanan registerlar
sıfırlanır.
005111A8 84C0 TEST AL, AL ;al registerı boş mu? Boş ise dallancak ve orada ecx
005111AA 7E 10
JLE SHORT
INLAY.005111BC
;registerındaki
değer al ye aktarılacak.
005111AC 8D6424 00 LEA ESP, DWORD PTR
SS:[ESP]
;
005111B0 3C 20
CMP AL, 20
;” “boşluk mu? Al deki
005111B2 7F 08
JG SHORT
INLAY.005111BC
; jg
kullanıldığına göre 20h değerinden küçük mü?
005111B4 8A41 01 MOV AL, BYTE PTR DS:[ECX+1] ;
005111B7 41
INC ECX
;
;
005111B8 84C0
TEST AL, AL
;
;
005111BA 7F F4
JG SHORT
INLAY.005111B0
;
005111BC 8A01
MOV AL, BYTE PTR
DS:[ECX]
;
005111BE 84C0
TEST AL, AL
;
005111C0 74
24
JE
SHORT
INLAY.005111E6
;
005111C2
41
INC ECX
;
005111C3 3C 2D
CMP AL, 2D
;”-“
005111C5 74 19
JE SHORT
INLAY.005111E0
;
005111C7 3C 61
CMP AL, 61
;”a”
005111C9 7C 04
JL SHORT
INLAY.005111CF
;
005111CB 3C 7A
CMP AL,
7A
;”z”
005111CD 7E 10
JLE SHORT
INLAY.005111DF
;
005111CF 3C 41
CMP AL, 41
;”A”
005111D1 7C 04
JL SHORT
INLAY.005111D7
;
005111D3 3C 5A
CMP AL, 5A
;”Z”
005111D5 7E 08
JLE SHORT
INLAY.005111DF
;
005111D7 3C 30
CMP AL, 30
;”0”
005111D9 7C 0B
JL SHORT
INLAY.005111E6
;
005111DB 3C 39
CMP AL, 39
;”9”
005111DD 7F 07
JG SHORT
INLAY.005111E6
;
005111DF 42
INC EDX
; lisans kodumuzu sayıyor. Sayaç olarak
kullanılmış.
005111E0 8A01
MOV AL, BYTE PTR
DS:[ECX]
;
005111E2 84C0
TEST AL, AL
;
005111E4 75 DC
JNZ SHORT
INLAY.005111C2
; asıl
döngü bu.
005111E6
33C0
XOR EAX, EAX
; döngü bitti. Eax registerı 0’lanıyor.
005111E8 83FA 0F
CMP EDX,
0F
; F -> 15, edx bizim girdiğimiz kodun uzunluğunu
içeriyor.
005111EB 0F94C0
SETE AL
; eğer eşitlerse al 1 değerini alıyor.
005111EE C3
RETN
; call çağrısı sona eriyor.
//---2-------2---------2----------2------------2------------2----------------2-----------------2-------------------------2
toplayacak
olursan yukarıdaki kodlardan lisans kodumuzun 15 karakter olması gerektiğini
anlıyoruz. Eğer girdiğimiz 15 karakter 0 dan 9 za kadar rakamlar, a dan z ye
kadar ve A dan Z ye kadar ingiliz alfabesinin harflerini içeriyorsa sorun yok.
Noktalama işaretleri veya türkçe karakterler girilirse program saymayı bırakıp
sete al komutu ile al 0’lanıyor. “ “ boşluk girilirse sayım devam
ediyor ancak boşluk sayılmıyor. Ascii karakter tablosundaki ilk 32(20h)
karakterden birisi girilirse bunlar da yine başta olurlarsa sayılmıyorlar, arada
olurlarsa sayma işini sona erdiriyorlar. Burada yer alan call çağrısındaki bu
sayım işi yazacağımız keygende yer almayacak. Çünkü biz ismi alıp kodu
vereceğiz. Yine de incelemiş olduk.
//---3-------3---------3----------3------------3------------3----------------3-----------------3-------------------------3
005125B5 83C4 04
ADD ESP,
4
;
005125B8 85C0
TEST EAX,
EAX
; eax call çağrısında lisans kodumuz 15 karakter-
;se 1, değilse 0 olarak set edilmişti. Burada
005125BA 75 22
JNZ SHORT
INLAY.005125DE
;kontrol ediliyor. Eğer dallanma gerçekleşmezse
;
“Lisans kodunuzun uzunluğu yanlış, lütfen ;girdiğiniz bütün harfleri kontrol
edin.”
;türünden
bir mesaj alıyoruz. 15 karakter ;girmişsek, jnz dallanması gerçekleşecek
ve
;farklı
bir hata mesajı göreceğiz.
005125BC A1 D45A5100 MOV EAX, DWORD PTR
DS:[515AD4]
;
005125C1 68 00040000 PUSH 400
;
005125C6 8D9424 C4010000 LEA EDX, DWORD PTR
SS:[ESP+1C4]
;
005125CD 52
PUSH EDX
;
005125CE 6A 0C
PUSH 0C
;
005125D0 50
PUSH EAX
;
005125D1 FF15 D8405100 CALL NEAR DWORD PTR
DS:[<&USER32.LoadStringA>]
005125D7 6A 00
PUSH 0
;
005125D9 E9 85000000 JMP INLAY.00512663
;
005125DE 6A 01
PUSH 1
;bu kısma dallandığımıza göre 1. aşamayı atlattık.
005125E0 8D4424 28 LEA EAX, DWORD PTR SS:[ESP+28]
005125E4 50
PUSH
EAX
005125E5 8D4C24 48 LEA ECX, DWORD PTR
SS:[ESP+48]
|
|
Lisans kodunuz 15 karakter ancak yanlış ise yukarıdaki mesajı göreceğiz.
Bozuk bir ingilizce ile tercüme edelim. Yanlış kod girdiniz. Lütfen....
anlıyoruz da anlatamıyoruz ne yapalım. Neyse yinede iyi çünkü gerçek seriale
daha yakınız. Takibe devam edelim. 005125DE
adresinde iken softice programında F9’a
basıp breakpoint koyalım. Komut satırına x yazıp enter ve softice dan
çıkalım.
Evet şimdi license name yerine maviboynuz, license code yerine 123456789abcdef yazalım enter license information tuşuna basalım.
//---4-------4---------4----------4------------4------------4----------------4-----------------4-------------------------4
005125DE 6A 01
PUSH 1
;
005125E0 8D4424 28
LEA EAX,
DWORD PTR SS:[ESP+28] ;
bizim girdiğimiz lisans kodu
005125E4 50
PUSH EAX
;
005125E5 8D4C24 48
LEA ECX,
DWORD PTR SS:[ESP+48] ;
girdiğimiz isim
005125E9 51
PUSH ECX
;
005125EA 8D9424 CC000000 LEA EDX, DWORD PTR
SS:[ESP+CC] ; bu adrese sonra
kullanılacak gerçek lisans
; kodunun ilk karakteri hariç geri kalanı gelecek.
005125F1 52
PUSH EDX
;
//---5-------5---------5----------5------------5------------5----------------5-----------------5-------------------------5
00511DC0 8B5424 08
MOV EDX,
DWORD PTR SS:[ESP+8]
; ismimizin ilk karakterinin adresi edx’e alınıyor.
00511DC4 8A02
MOV AL,
BYTE PTR DS:[EDX]
; ismin ilk karakteri al’ye alınıyor.
00511DC6 81EC 00010000 SUB ESP, 100
; ismimizin bulunduğu adresten 100h(256) byte geriye
yer
;açılıyor. Sonradan
anlıyorum ki küçük harfle girilen lisans
;ismi büyük harfe çevrilecek ve bu hafız bölgesine
yerleş-
;tirilecek. 100h olmasının sebebi gireceğimiz lisans
name
; en fazla 255(ffh) karakter olacak.
00511DCC 53
PUSH EBX
; işlem yapılacağı için eski değerleri saklanıyor.
00511DCD 56
PUSH ESI
; register sayısı fazla olmadığından farklı işlemler için aynı
; registerler kullanılıyor. Eski değerlerinin kaybolmaması
için
; push la hafızaya saklanıyor.
00511DCE 33C9
XOR ECX,
ECX
; ecx ve esi 0 lanıyor.
00511DD0 33F6
XOR ESI,
ESI
;
00511DD2 84C0
TEST AL, AL
; al de değer var mı? Yukarda ismin ilk karakterini
almıştı.
00511DD4 57
PUSH EDI
; edi de döngüde kullanılacak demek ki değeri
saklanıyor.
00511DD5 74 3E
JE
SHORT INLAY.00511E15
; al boşsa döngüden çıkılıyor.
00511DD7 81F9 FF000000 CMP ECX,
0FF
; ecx de girdiğimiz lisans name in uzunluğu var.
FFh(255)
; den fazlası dikkate alınmayacak. Kimin o kadar uzun ismi
; ki. Burası aynı zamanda döngünün başlangıcı
00511DDD 7D 36
JGE SHORT
INLAY.00511E15
; lisans ismi 255 i geçerse döngüyü sonlandır.
00511DDF 3C 61
CMP AL,
61
; ‘a’ ile ismin karakteri karşılaştırılıyor
00511DE1 7C 13
JL SHORT
INLAY.00511DF6
; daha küçükse büyük harf mi diye bakılacak
00511DE3 3C 7A
CMP AL,
7A
; ‘z’ ile ismin karakteri karşılaştırılıyor
00511DE5 7F 0F
JG SHORT
INLAY.00511DF6
; daha büyükse büyük harf mi diye bakılacak yalnız
burada
; bir saçmalık var zaten z den büyükse büyük harf olma
ihti-
;mali yok . çünkü ascii tablosunda büyük harfler küçük
;harflerden daha küçüktür.
00511DE7 0FBEF8
MOVSX EDI, AL
;bu kısım çalışırsa demekki girilen lisans isminin
karşılaştırı-
;lan karakteri küçük harftir. Tabi ingiliz alfabesinin. al deki
; değer edi ye alınıyor.
00511DEA 8BD9
MOV EBX,
ECX
; ecx deki değer ebx e alınıyor. Ecx sayaçtı. 0 dan
başladı.
;ebx de 0 dan başladı. İlk karakter için ebx 0.
00511DEC 03DF
ADD EBX,
EDI
;edi deki değer ile ebx deki değer toplanıp ebx e
alınıyor
; yani c deki ebx+=edi gibi
00511DEE 8D74B3 E0
LEA ESI, DWORD PTR
DS:[EBX+ESI*4-20]
; işte algoritmanin formülü bu ebx yani karakterin numarsı
;ve sıra numarsı ebx de tabi sıra numarası 0 dan
başlıyor
; esi ilk önce 0 ve 20 az sonra ne olduğunu
anlayacağız.
;hepsi toplanıp esiye alınıyor. Demek ki bulacağımız
sonuc
;esi de olacak
00511DF2 2C 20
SUB AL,
20
;bu işlem küçük harfi büyültür. Büyük harfe çevirir. Biraz
;anlatalım. a harfi 61, A harfi 41 aradaki fark 20
hexadecimal.
;onluk sistemde a harfi 97, A harfi 129 yani fark
32.
00511DF4 EB 12
JMP SHORT
INLAY.00511E08
; bu jmp büyük harfe çevrilmiş karakteri yeni yerine
koya-
;cak olan komut satırına gönderiyor. Çünkü hemen
altındaki
; kodlar lisans ismi büyük karakter girilirse çalışacak olan
kı
;sımlar. Yani karakter küçükse jmp nin üstündeki
kodlar
;karakter büyükse jmp nin altındaki kodlar çalışacak. Her
;durumda harf büyüyecek ve yeni yerine yerleşecek.
00511DF6 3C 41
CMP AL,
41
; karakter ‘A’ ile karşılaştırılıyor.
00511DF8 7C 13
JL SHORT
INLAY.00511E0D
; küçükse bir sonraki
karaktere geçilecek
00511DFA 3C 5A
CMP AL,
5A
; karakter ‘Z’ ile karşılaştırılıyor
00511DFC 7F 0F
JG SHORT
INLAY.00511E0D
; büyükse bir sonraki karaktere geçilecek. Bunun
anlamı
; eğer küçük harf değilse, büyük harf mi? Eğer büyük harf
;de değilse o karaktere hiçbir işlem yapma ve bir sonraki
;karaktere geç yani lisans ismi sadece küçük veya
büyük
;ingiliz alfabesinin harflerinden oluşabilir.
00511DFE 0FBEF8
MOVSX EDI, AL
;evet burası çalışıyorsa girilen karakter büyük harf
demektir.
;ve edi ye alınıyor
00511E01 8BD9
MOV EBX,
ECX
;ecx deki değer yani harfin sırası ebx e alınıyor
00511E03 03DF
ADD EBX,
EDI
;ve üstüne harfle toplanıyor. Sıra nosunun 0 dan
başladığı-
;unutmayın
00511E05 8D34B3
LEA ESI,
DWORD PTR DS:[EBX+ESI*4]
;evet formülümüz burada –20 yok. Şimdi küçük harf
formü-
;lünde neden 20 olduğu anlaşılıyor. Küçük harflerle
büyük
;harfler arasında 20h değeri vardı. Demek ki maviboynuz
ile
;MaViBoynuZ veya maviBOYNUZ aynı lisans numarasına
;sahip olacak.
00511E08 88440C 0C MOV BYTE PTR
SS:[ESP+ECX+C], AL
;büyük harf yeni yerime yerleşiyor.
00511E0C 41
INC
ECX
;ecx artıyor. Yani sıra numarası artıyor
00511E0D 8A42 01
MOV AL,
BYTE PTR DS:[EDX+1]
; bir sonraki karakter al ye alınıyor
00511E10 42
INC
EDX
; bir sonraki karaktere geçiliyor
00511E11 84C0
TEST AL, AL
; son karakter mi?
00511E13 75 C2
JNZ SHORT
INLAY.00511DD7
; hayırsa döngü başına
şimdi döngünün kısaca ne iş yaptığını yazalım. Lisans name ile girilen karakterler içindeki küçük ve büyük harfleri topladı ve bir sayı hesapladı. Girdiğiniz lisans isminin içindeki harfler ayıklandı ve diğer karakterlerden ayrıldı ve yeni yerine yerleştirildi. Demek ki mavi1b?o*nuZ ile maviboynuz aynı lisans numarasına sahip olacak. Tabi ma1222342vibo,üğöçynuz da. Burada oluşan sayı esi de bakalım hangi sayı oluşmuş ve kodlara devam edelim. Yazının uzun olacağını söylemiştim. Ancak daha da uzun olacak çünkü gerçek lisans koduna ulaşmak için daha aşama çok. Kayıt edelim de elektrik gider.
//---6-------6---------6----------6------------6------------6----------------6-----------------6-------------------------6
girdiğimiz
lisans name sonucu bir değer hesaplandı. maviboynuz için bu değer 1924AE7h
sayısı. Bir alt satıra bakalım.
00511E15 81E6 FFFFFF7F AND ESI, 7FFFFFFF
;esi de bizim girdiğimiz name için hesaplanan sayı var. Peki
;diğer sayı da ne. 7FFFFFFF sayısı 32 bitte yazılabilecek en
;büyük işaretli sayıdır. 7FFFFFFF=2147483647. sayılar
işaretli
;ve işaretsiz olarak 2ye ayrılır. İşaretli sayılar – ve +
olur.
;işaretsizler ise 0 dan başlar yani negatifleri
yoktur.
;1byte 8
bittir. 11111111 sayısı 8 bit ile yazılabilecek en büyük sayıdır. Ve bu sayı 255
dir. Çevirme işlemi şu şekilde olur.
;1*1+1*2+1*4+1*8+1*16+1*32+1*64+1*128
bu sayı işaretsizdir. Eğer işaretli olursa soldan ilk bit sayı değil işaret biti
olur. Eğer 1 ;ise sayı negatif 0 ise pozitiftir. 11111111 sayısı 1. bit 1
olduğundan negatif bir sayıdır. Sayının değeri ise
;
1*1+1*2+1*4+1*8+1*16+1*32+1*64=-127 bu da işaretli 8 bit ile yazılabilecek en
küçük sayıdır. Toparlayalım 8 bit işaretsiz sayılar
;0 ile
255 arasında işaretliler ise –127 ile +127 arasında olurlar. Gelelim 7FFFFFFF
sayısına 7 nin karşılığı 0111 dir. Bu da ne ;demek işaretli sayılarla
yazılabilecek en büyük sayı. Bir fazlası 8000000 sayısı eder. 8 in karşılığı
1000 dır. Yani negatif bir sayı.
;buradaki
and işlemi bizim isimden dolayı hesaplanan sayımızın fazlasını yok etmek yani
soldan ilk biti 0 yaparak sayıyı +hale getir
;mek
için kullanılmış. Çünkü 1 and 0=0 ve
0 and 0 = 0 dır.
00511E1B 75 14
JNZ SHORT
INLAY.00511E31 ;aşağıdaki
kodları atlıyoruz. Yalnız aşağıdaki kodlar çalışırsa
00511E1D 8B8424 10010000 MOV EAX, DWORD PTR
SS:[ESP+110] ; yanlış serial numarası mesajı ekrana
geliyor.
00511E24 5F
POP
EDI
;
00511E25 5E
POP
ESI
;
00511E26 C600 00
MOV BYTE
PTR DS:[EAX], 0 ;tabi
buradaki 0 ı 1 yaparsanız başka
00511E29 5B
POP
EBX
;
00511E2A 81C4 00010000
ADD ESP, 100
;
00511E30 C3
RETN
;
00511E31 C6440C 0C 00 MOV BYTE PTR
SS:[ESP+ECX+C], 0 ;algoritmayı çözmeye
devam 0 değeri bir adrese atılıyor.
;bu adres bizim girdiğimiz ve büyük harflere çevrilen
lisans
;name in sonuna konuyor. İsmin sonuna gelindiğini
anlasın.
00511E36 8B8C24 1C010000 MOV ECX, DWORD PTR
SS:[ESP+11C] ;esp+11c deki değer bir adres bu adresteki
değer
;ecx e aktarılıyor. Değeri 1
00511E3D 51
PUSH ECX
;bu değer saklanıyor.
00511E3E
8D5424 10 LEA EDX, DWORD PTR
SS:[ESP+10] ;büyük harflere çevrilmiş
lisans isminin ilk karakteri edx e
;aktarılıyor.
00511E42 52
PUSH EDX
;
00511E43 E8 38FEFFFF CALL
INLAY.00511C80
;evet biraz da buraya dalalım. Bakim burada neler karşımıza
çıkacak.
//---7-------7---------7----------7------------7------------7----------------7-----------------7-------------------------7
00511E43
E8 38FEFFFF
CALL
INLAY.00511C80
00511C80 81EC 7C040000 SUB ESP, 47C
;
00511C86 53
PUSH EBX
;registerdaki değerler saklanıyor.
00511C87 55
PUSH EBP
;
00511C88 56
PUSH ESI
;
00511C89 8B35 1C505100 MOV ESI, DWORD PTR
DS:[51501C] ;bazı sabit değerler var daha doğrusu isimler
00511C8F 803E 00
CMP BYTE
PTR DS:[ESI], 0
;sonuna geldi mi?
00511C92 57
PUSH EDI
;
00511C93 8BBC24 90040000 MOV EDI, DWORD PTR
SS:[ESP+490] ;bizim girdiğimiz lisans ismi
00511C9A 74 24
JE SHORT
INLAY.00511CC0 ;döngüden
çıkıyor
00511C9C 8B1D 58405100 MOV EBX, DWORD PTR
DS:[<&KERNEL32.lstrcmpiA>] ;
00511CA2 8B2D 34405100 MOV EBP, DWORD PTR
DS:[<&KERNEL32.lstrlenA>] ;
00511CA8 56
PUSH ESI
;sabit isim
00511CA9 57
PUSH EDI
;bizim isim
00511CAA FFD3 CALL NEAR EBX ;iki isim karşılaştırılıyor
00511CAC 85C0
TEST EAX,
EAX
;aynılarsa eax 0 değerini alıyor
00511CAE 0F84 E3000000 JE
INLAY.00511D97
;ve serial alamıyorsunuz. Hatta kayıt defterine not bile
yazılıyor
00511CB4 56
PUSH ESI
;
00511CB5 FFD5
CALL NEAR
EBP
;sabit ismin uzunluğu hesap ediliyor
00511CB7 8D7406 01 LEA ESI, DWORD PTR
DS:[ESI+EAX+1] ;bir sonraki isme geçiliyor
00511CBB 803E 00
CMP BYTE
PTR DS:[ESI], 0
; isimler bitti mi?
00511CBE 75 E8
JNZ SHORT
INLAY.00511CA8 ;hayırsa döngü
başına
00511CC0 8B8424 94040000 MOV EAX, DWORD PTR
SS:[ESP+494] ;buraya program akışı geldiyse isminiz arananlar
liste-
;sinde yok demektir.
Kısa bir açıklama yapalım. Programcılar bazı isimlere lisans kodu vermek istememişler. Sizin girdiğiniz bu isimlerden mi diye kontrol ediyorlar. İsimler bana tanıdık gelmedi. Belki sizler bilirsiniz. Serial üretilmeyecek isimler şunlar.
NEILRUDNITSKI, CHATTERCENTIL, CHONGCHINGBAK, FRIENDSOFZEDTEC, MARIONNIEDRINGHAUS,
CRACKEDPROGRAM, PERCRACKS, KELLYKRONE. Bu isimler hakkında bilgisi olan varsa foruma yazarsa sevinirim.
Bizim ismimiz farklı olduğundan devam ediyoruz.
//---8-------8---------8----------8------------8------------8----------------8-----------------8-------------------------8
00511E43
E8 38FEFFFF
CALL
INLAY.00511C80
bu çağrıda bundan başka önemli bir şey yok. Onun için fazla
dalmayın. Call dan sonraki kodları takip edelim.
00511E48 83C4 08
ADD ESP, 8
;
00511E4B 85C0 TEST EAX, EAX ; eax deki değer kontrol ediliyor. Hangi isimler vardı girilmemesi gereken
;eğer onlardan birisini girdiyseniz bu je komutu sizi dallandırmıyor ve program size hacker diyor. Bunu da registeriye(kayıt defterine)
;kayıt ediyor. Bundan sonra başka bir isimle doğru lisans kodunu girseniz de yanlış kod girdiniz mesajı ile karşılaşıyorsunuz. Tekrar ;eski haline getirmek için kayıt defterindeki satırı silin tam adresi ve silinecek kısmı da verelim
;Bilgisayarım\HKEY_LOCAL_MACHINE\Software\GameHouse\PuzzleInlay adresindeki
;RegFault “OK” satırını silerseniz hacker olmaktan çıkarsınız.böylece isme karşılık gelen lisans kodu girdiğinizde oyun sizindir. ;yalnız hacker ismine lisans kodu üretiliyor. Ne kadar ilginç. Demek ki hackerları seviyorlar.
00511E4D 74 1D
JE SHORT
INLAY.00511E6C ; sorun
yoksa sıçrama yapıyor.
00511E4F 8B8424 10010000 MOV EAX, DWORD PTR
SS:[ESP+110] ;
00511E56 68 B8425100 PUSH INLAY.005142B8 ; ASCII
"HACKER"
00511E5B 50
PUSH EAX
;
00511E5C FF15 38405100 CALL NEAR DWORD PTR
DS:[<&KERNEL32.ls> ;
00511E62 5F
POP EDI
;
00511E63 5E
POP ESI
;
00511E64 5B
POP EBX
;
00511E65 81C4 00010000 ADD ESP, 100
;
00511E6B
C3
RETN
;
00511E6C 8BC6
MOV EAX,
ESI
; evet burdan devam edelim. Biz lisans name den dolayı hesaplanan
sayı
;(maviboynuz
için 1924AE7h)
eax e atılıyor
00511E6E 99
CDQ
;
00511E6F F73D 08505100 IDIV DWORD PTR DS:[515008] ;idiv
bölme için kullanılır. Her zaman önündeki değer eax deki sayıyı
;böler.
Bölümü eax’e kalanı da edx atar. 515008 adresine bakınca “d”görüyoruz.
d->64h->100 onluk sistemde. Demekki 100 e bölü-
;yor.
00511E75 8B3D 60505100 MOV EDI, DWORD PTR
DS:[515060] ;bu adresin gösterdiği adreste 10 karakterden oluşan
toplam
;100
tane anlamsız kelime var. Her 10 karakterin arasındada “00” karakteri ve
bunların ilki ediye atılıyor.
00511E7B 55
PUSH EBP
;
00511E7C 8B2D 34405100 MOV EBP, DWORD PTR
DS:[<&KERNEL32.ls> ;
00511E82 85D2
TEST EDX, EDX
;edx te 100 bölümden kalan vardı. Kalan 0 sa dallanma
gerçekleşiyor.
00511E84 7E 0C
JLE SHORT
INLAY.00511E92
;
00511E86 8BDA
MOV EBX,
EDX
;kalan 0 değilse kalan ebx e atılıyor
00511E88 57
PUSH EDI
;
00511E89 FFD5
CALL NEAR EBP
;eax e A yani 10 karakteri sayısı atılıyor. Anlamsız kelimeler 10
;karakterdi.
00511E8B 4B
DEC EBX
;ebx deki değer 1 azaltılıyor.
00511E8C 8D7C07 01 LEA EDI, DWORD PTR
DS:[EDI+EAX+1] ;bir sonraki 10 lu gruba geçiliyor.
00511E90 ^ 75 F6
JNZ SHORT
INLAY.00511E88 ; işlem
ebx 0 olana kadar tekrar ediyor.
;anlamsız
10 ar karakterden oluşan ve aralarında bulunan “00” değerleri. Yani 11 karakter
atlayarak bir sonrakine geçiliyor. 100 tane ;değer var tabloda. Sayıyı da 100 e
bölmüştük. Demekki 100 e bölümünden kalanı buluyor ve kalanın sırasındaki 10 lu
grubu alıyor.
;Tablo
aşağıda 1 değer kalan 0 sa sonuncu değer kalan 99 olunca seçiliyor.
maviboynuz için
kalan 2Fh->47. sıradaki
;tabi
saymaya 0 dan başlayacağız.
;FJHJMRTJEF.IDOPIUWGBI.QVTWHHIDJM.SCKAULGIWV.MSFDNIENKS.ZUKNCIWIRL.VKTCVPROFR.NNRLBKIFOR.
;AKBIVLAIAA.QESNBIUMPJ.TSMXXZMLBP.KCETQECACH.GOVMEEHGHJ.TEAAMJZAAM.QZTRGXOTQM.ITIVXYCZOW.
;UITOYQNIHT.LIHMWKXRXV.XXABYUNGOP.OGKLFVMZUS.MBQTLJLDLZ.JTBUYBRCHX.YDLQOHCOBO.YOMFAVPGVE.
;IUWHMXGKKX.QANKYKOJJN.XEELTOWQJC.JQZEDUDVEU.HUVVFXWSIK.QYQUUZKWOE.BPTBDLJXPV.YNSUGMCNQX.
;IQYNGICAVU.UDUOSMUKYM.UWIFRGQGHP.AJHEYMOLCC.XWPLCDGUCN.EEARIUSPQ.UDWJQLGMLX.QRGZSSZVWX.
;GTNVLZMVAA.AKVMSQPGGF.IDWYGTNFSP.VRIQMZEPQU.AINZPKGQCE.RRVJHFSBLS.PARGIFPVZL.CWKNWXGNUL.
;XVEVELCIYK.NUKVTMWCKB.MAVNEUDAJO.UCKUWZRFME.EKGYOUOTBF.ENEYSWMQKC.UGKEGVKBYE.FFXYQXLIMD.
;KOKNRRKXVQ.WFNUOLSZWF.EOPBYUFAGQ.KTZBSVGELC.YBGLXJLCYM.AYXNVGIPKL.ZPQNKPQKLQ.PRNQJEWHQL.
;KBZULXUJZP.AVQEFDFOVW.ANTBCAHTNS.SYTBMDODBI.LNWBIASDPV.XUYJQSPDYS.KYVNRJQMRY.WXGAKFRONF.
;IGSMZVERJQ.USLSJYICFD.TDDRKPNERN.ZVAOILWPET.WFXSRMVJFO.JEWXWYIBRU.ZUKFARIVPQ.VUIBPEOWOE.
;KYQNKWFQOH.LHOFXWLTBU.KLHYAGSQAQ.DMWQAWPMYP.QWYDZBLOND.LUCLFRBBAP.ANWFHSVTSI.PJAOUNGHDI.
;GJOGVPSJXJ.DCIBBUTXMU.FQELROMLDY.HJHQKMPSCV.EWRHKVKMBC.GEWHHWBLYA.YDTFWQIFRF.OYVNSNFDDF.
;HDOJYAJWGO.TRPZFSFGAM.GKTEKMQMCO.ANBOINKMRS.
;bu şifrenin bir parçası diye düşünüyoruz. Ve yanılıyoruz. Ama sonlara doğru yaklaştık. Bu 10 karakteri bir kenara yazalım.
00511E92 81FE A0860100 CMP ESI, 186A0
; lisans isminden dolayı hesaplanan sayıyı bu seferde başka bir sayı
ile
;karşılaştırıyor.
Hı 186a0h sayısı = 100000
00511E98 7C 10
JL SHORT
INLAY.00511EAA
;küçükse atla dediğine göre hesaplanan sayının 100000 den küçük
ol-
;ması
isteniyor. 100000 den küçük demek 5 basamaklı bir sayı demek. 10 da karakter var
toplam 15 yapar. Bu lisans kodun uzun-
;luğuna
eşit.
00511E9A 8D9B 00000000 LEA EBX, DWORD PTR DS:[EBX] ;
00511EA0 D1FE
SAR ESI,
1
;bu komut eax değerini 1 defa sağa kaydırıyor.yani 2’ye bölüyor.
00511EA2 81FE A0860100 CMP ESI, 186A0
;şimdi beş basamaklı oldu mu?
00511EA8 ^ 7D F6
JGE SHORT
INLAY.00511EA0
;olmadıysa tekrar 2 ye böl. 5 basamaklı olana kadar.
;
1924AE7h sayısını 2 ye böle böle onluk sistemde 51493 kalıyor. 5 basamaklı hale
8 defa bölerek geldi.
00511EAA 57 PUSH EDI ;10 karakterlik anlamsız kelime grubu tablodan alınan
00511EAB 8D4C24 14 LEA ECX, DWORD PTR
SS:[ESP+14] ;MAVIBOYNUZ
00511EAF 51 PUSH ECX
00511EB0 FF15 38405100 CALL NEAR DWORD PTR
DS:[<&KERNEL32.ls> ;MAVIBOYNUZ’un bulunduğu adrese
10
;karakterlik
kelime grubu kopyalanıyor
00511EB6 68 F0425100 PUSH INLAY.005142F0
; ASCII "%05d" ; sayı için 5 yer açılıyor. d onluk
sistemde
00511EBB 8D5424 14 LEA EDX, DWORD PTR
SS:[ESP+14]
00511EBF 52
PUSH
EDX
00511EC0 FF15 54405100 CALL NEAR DWORD PTR
DS:[<&KERNEL32.ls> ;kelimenin yanına %5d yazılıyor. Yani
buraya
;5
basamaklı sayı gelecek. Eğer sayı 3 basamaklı ise sola 0 konularak 5 basamağa
çıkartılacak.
00511EC6 8BBC24 14010000 MOV EDI, DWORD PTR
SS:[ESP+114]
00511ECD 56
PUSH
ESI
00511ECE 8D4424 14 LEA EAX, DWORD PTR
SS:[ESP+14]
00511ED2 50
PUSH
EAX
00511ED3 57
PUSH
EDI
00511ED4 FF15 D4405100 CALL NEAR DWORD PTR
DS:[<&USER32.wspr> ; iki değeri birleştiriyor.
;yani
tablodan alınan 10 karakter ile lisans isminden oluşan ve 5 basamağa düşürülen
sayıyı.
;maviboynuz için
CWKNWXGNUL51493
evet
bu lisans kodumuz mu acaba? Üzgünüm değil Ama az kaldı tek bir aşama
kaldı.
00511EDA 83C4 0C
ADD ESP,
0C
00511EDD 68 30505100 PUSH INLAY.00515030
; ASCII ;"ZXHYGKLQ9867WEPRCDSANMJBVFTU5342"
;evet
son tablomuz da bu. Az önce oluşan 15 karakter aşağıdaki döngü ve bu tablo ile
lisans kod haline gelecek. Mantığı çok
;basit.
Yine bölme ve kalana göre sıra. Kaça bölecek tahmin edin. Tabloda kaç karakter
ve 32. 0 dan 31 e kadar. Hex olarak da 20
;ayrıca
lisans kod bu 32 karakterden oluşuyor. Bazı harfler ve rakamlar
yok.
00511EE2 FFD5 CALL NEAR EBP;eax’e 20h değeri yani 32
00511EE4 8BF0
MOV ESI,
EAX
;esi de 32 var
00511EE6
803F 00
CMP BYTE
PTR DS:[EDI], 0 ;edi de CWKNWXGNUL51493
var.
Şimdi tek tek gerçek lisans
;koda
dönüşecek
00511EE9 5D POP EBP
00511EEA 74 19
JE
SHORT INLAY.00511F05;sona geldiyse git.
00511EEC 8BCF
MOV ECX,
EDI;dönüşecek karakter ecx’e alınıyor
00511EEE 8BFF
MOV EDI,
EDI
00511EF0 0FBE01
MOVSX EAX, BYTE PTR
DS:[ECX];dönüşecek karakter eax de
00511EF3 99
CDQ
00511EF4 F7FE
IDIV
ESI;karakter 20h’a bölünüyor. Bölüm eax de ama önemli değil önemli olan
edx deki kalan
00511EF6 41
INC
ECX;bir sonraki karaktere geç
00511EF7 8A92 30505100 MOV DL, BYTE PTR
DS:[EDX+515030];yeni tablonun başından kalan kadar sayılıyor. Ve
bulunan
;yeni
karakter dl ye atılıyor. C(43h-67onluk) mod 20h(32 onluk) = 3 yani tabloda
0,1,2,3. karakter Y evet gerçek lisans kodunun
;ilk
karakteri.
00511EFD 8851 FF
MOV BYTE
PTR DS:[ECX-1], DL;edi de C nin üzerine yazılıyor.
00511F00 8039 00
CMP BYTE
PTR DS:[ECX], 0 ;sona geldik mi?
00511F03 ^ 75 EB
JNZ SHORT INLAY.00511EF0;
gelmediysek
bir sonraki karakter
;
yeni tablodaki yerler bu şekilde bulunuyor ve lisans kodumuz hazır hale geliyor.
License
name : maviboynuz
License
code :
YB7PBVQPMWMDNFA
Kod
hesaplandığına göre bunu bir de karşılaştırmak gerekecek bakalım o nerede ve
nasıl yapılıyor.
00511F05 8B9424 18010000 MOV EDX, DWORD PTR
SS:[ESP+118]; bizim lisans kod edx de
00511F0C 8BF7
MOV ESI,
EDI
;gerçek lisans kod esi de
00511F0E 8BFF
MOV EDI,
EDI
00511F10
8A0E
MOV CL,
BYTE PTR DS:[ESI]
;karşılaştırma döngüsünün başı karşılaştırma tek tek
yapı-
;lıyor
ve ilk hatada döngüden çıkılıyor. İlk hatada 00511F47
adresine 00 karakteri konuluyor. Burası lisans kodun ilk karakteri
00511F12 84C9
TEST CL,
CL
00511F14 75 05
JNZ SHORT
INLAY.00511F1B
00511F16 803A 00
CMP BYTE
PTR DS:[EDX], 0
00511F19 74 2F
JE SHORT
INLAY.00511F4A
00511F1B 33C0
XOR EAX,
EAX
00511F1D 8A02 MOV AL, BYTE PTR DS:[EDX]
00511F1F 3C 30
CMP AL,
30
00511F21 7C 1D
JL
SHORT INLAY.00511F40
00511F23 3C 7A
CMP AL,
7A
00511F25 7F 19
JG
SHORT INLAY.00511F40
00511F27 50
PUSH
EAX
00511F28 E8 33F1FFFF CALL
INLAY.00511060
00511F2D 51
PUSH
ECX
00511F2E 8AD8
MOV BL,
AL
00511F30 E8 2BF1FFFF CALL
INLAY.00511060
00511F35 83C4 08
ADD ESP,
8
00511F38 3AC3 CMP AL, BL
00511F3A 75 0B
JNZ SHORT
INLAY.00511F47
00511F3C 42
INC
EDX
00511F3D 46
INC
ESI
00511F3E ^ EB D0 JMP SHORT INLAY.00511F10
00511F40 84C0 TEST AL, AL
00511F42 74 03 JE SHORT INLAY.00511F47
00511F44 42 INC EDX
00511F45 ^ EB C9 JMP SHORT INLAY.00511F10
00511F47 C607 00 MOV BYTE PTR DS:[EDI], 0 ; yanlış karşılaştırma sonucunda program akışı buraya geliyor.
00511F4A 5F POP EDI ; lisans kodunuz doğruysa döngü bitimi akış buraya geliyor.
00511F4B 5E POP ESI ; bu komutlar registerların kullanımlarının sona erdiğini ve eski değerlerini
00511F4C 5B POP EBX ;almalarını söyler
00511F4D 81C4 00010000 ADD ESP, 100
00511F53 C3 RETN ;call çağrısı sona eriyor. Çok şükür.
///-----------------------------------------------------------------------------------------------------------------------------------------------
005125F7 8A8424 D0000000
MOV AL,
BYTE PTR SS:[ESP+D0]
;karşılaştır sonucu hata varsa al de 00 olacak
;ve
program register olmayacak. Karşılaştırma doğruysa al de lisans kodunun son
karakteri bulunacak.
005125FE 83C4 10
ADD ESP,
10
;
00512601 84C0
TEST AL, AL
;
00512603 74 39
JE SHORT
INLAY.0051263E
; hata
mesajına gidiyor. Anlayacağınız burayı jne
; yaparsanız sakın doğru lisans kodunu girmeyin
; yalnız program lisans ismini ve kodunu kayıt
; düzenleyiciye kaydediyor ve program her çalıştı-
;ğında kontrol ediyor. Oyunu her açtığınızda yanlış
;kod girmeniz gerekecek anlayacağınız.
00512605 8D4424 40
LEA EAX,
DWORD PTR SS:[ESP+40]
;
00512609 50
PUSH EAX
;
0051260A 8D8C24 C4000000
LEA ECX,
DWORD PTR SS:[ESP+C4]
;
00512611 51
PUSH ECX
;
00512612 E8 09F2FFFF
CALL
INLAY.00511820
;
00512617 83C4 08 ADD ESP, 8 ;registeriye kayıt yapılıyor.
0051261A 85C0
TEST EAX,
EAX
;
0051261C 74 20
JE SHORT
INLAY.0051263E
; hata
mesajına gidiyor. Hacker iseniz doğru ;serialı girseniz bile program sizi hata
mesajına gönderiyor. Bundan daha önce bahsetmiştim. Normalde burayı
değiştirmeniz
;gerekmiyor.
0051261E 68 EB030000
PUSH 3EB
;
00512623 56
PUSH ESI
;
00512624 E8 47FDFFFF
CALL
INLAY.00512370
;
00512629 83C4 08
ADD ESP,
8
;
0051262C 5F
POP
EDI
;
0051262D 5E
POP
ESI
;
0051262E 5D
POP
EBP
;
0051262F B8 01000000
MOV EAX,
1
;
00512634 5B POP EBX ;
00512635 81C4 B0090000
ADD ESP,
9B0
;
0051263B C2 1000
RETN 10
;oyuna gider bir analiz de burada biter.
0051263E A1 D45A5100
MOV EAX,
DWORD PTR DS:[515AD4] ;
hata
mesajı hazırlıkları başlıyor. Buraya program
00512643 68 00040000
PUSH 400
; akışının
gelmemesi gerekiyor.
00512648 8D9424 C4010000
LEA EDX,
DWORD PTR SS:[ESP+1C4]
;
0051264F 52
PUSH EDX
;
00512650 6A 0A
PUSH 0A
;
00512652 50
PUSH EAX
;
00512653 FF15 D8405100
CALL NEAR DWORD
PTR DS:[<&USER32.LoadStringA>]
;
00512659 6A 30
PUSH 30
;
0051265B FF15 18415100
CALL NEAR DWORD
PTR DS:[<&USER32.MessageBeep>];
kayıt
düzenleyicisindeki görüntüyü de verelim.
|
|
Registration
ve RegName satırlarını silerek istediğiniz kadar deneme yapabilirsiniz. Biraz
uzun bir yazı oldu okumaktan sıkılanlar için toparlanmış keygen algoritmasını, c
de yazılmış kaynak kodunu ve borland c++ builder ile derlenmiş exe dosyasını
verelim.
Bu
tutorialı yazmamdaki sebep birşeyler öğrenmekti. Öyle de oldu. Algoritmayı
çözmüştüm ancak bu kadar ayrıntılı değil. Unutmayın en iyi öğrenme öğretirken
yapılan öğrenmedir. Başka bir yazıda görüşmek üzere hayırlı
akşamlar.
Key
algoritması
1.lisans
isminden ingiliz alfabesinin harfleri hariç diğer karakterleri
çıkart.
2.kalan
kısımla sabit isimleri karşılaştır. Eğer onlardan biriyse hiç serial
üretme
3.isimle
bir sayı hesapla
4.hesaplanan
sayıyı 100 e böl ve kalanı bul
5.tablodan
kalan sırasındaki 10 karakteri al
6.hesaplanan
sayıyı sürekli 2’ye bölerek 5 basamaklı hale getir
7.tablodan
aldığın 10 karakterle 5 basamaklı sayıyı birleştir
8.15
karakterden oluşan yeni değerini 1. karakterden başlamak üzere 32 ye
böl
9.kalan
yeni bir tablodaki gerçek lisans kodunun sıra numarasını
gösteriyor.
10.yeni
tablodan değeri al ve ekranda göster
11.oynu
oynamaya başla eğer halen isteğin varsa.
|
Son Notlar |
program kodları parayı hak ediyor ama fazlasını değil. yine de bir programdan para kazanıyorsanız, programı satın alınız. Bu tutorial yalnızca bilgi vermek maksadıyla yazılmıştır. kötü bir amacımız yok yani. farklı bir amaçla kullanılacak olursa sorumluluk kabul edilmeyecektir. Lisansız kullanımdan tutoriali hazırlayanlar sorumlu değildir. insanlar açlıktan ölürken bir oyuna da bu kadar para verilmez ki. Belki de programları daha çok insan tarafından kullanılsın diye korumaları bu kadar basit. Neyse Formda bilgi paylaşan herkese teşekkürler.
E-Mail: maviboynuz@mynet.com