Bir programı kırmaya yada
tersine çevirmeye (reverse) karar verdiğinizde eğer maksadınız , programa
bedavadan sahip olmaksa bu işten şimdiden vazgeçin inanın ki bu kadar uğraşmaya
değmez çünkü o programı mutlaka birileri zaten kırmıştır ve siz onun crack’ini
internette kolaylıkla bulabilirsiniz hatta full versiyonunu da bulmanız mümkün
olabilir. Eğer , ben kullandığım programların benden habersiz ne yaptıklarını
bilmek istiyorum diyorsanız ve herşeyin kontrolüm altında olmasını istiyorum
diyorsanız devam edin. Demo programların kırılmasını örnek olarak vermemiz ise
sadece bir araçtır ama kesinlikle bir amaç değildir , demo programlardaki nag
screen ( programın demo olduğuna dair uyarı ekranı) , seri numaralar , tarihsel
ve rakamsal kısıtlamalar iyi birer örnek teşkil ettiğinden yazılarımda kullanılmaktadır.
Crackerlar ve programcılar arasında karşılıklı bir yarış vardır , programcılar
yeni bir koruma geliştirir crackerlar onu kırar , programcılar daha yeni bir
koruma geliştirir ve asla kırılamayacağını idda eder , crackerlar yeniden kırar
ve bu sefer programcıları tiye alırlar , programcılar buna çok kızarlar ve artık
programlarının içine sadece kırmaya çalışan crackerların farkedeceği türden
mesajlar bırakırlar ( PleasefollowmeMRCracker adında bir fonksiyon buna bir
örnek) bu iş böylece sürüp gider ;ama asla kırılamayacağı iddia edilen
neredeyse tüm programlar her zaman kırılmıştır. Yani galip gelen taraf hep
cracker’lardır. Neyse şimdilik bu konuya burada ara veriyorum.
Bir programı kırmak için onun dissasemble edilmiş koduna ihtiyacınız vardır ,
birincisi ya bir dissasembler programı kullanarak o programın dead list denilen
( çalışır vaziyette olmayan bir exenin içeriği) olan assembly kodunu elde
edersiniz yada ikinci yol olan debugger kullanarak live(canlı ; yani o anda çalışan
ve cpu’da işlenen assembly kodu)olarak bu programın içeriğini
görüntüleyebilirsiniz. Birinci yöntem daha uzun süre gerektirir , çünkü tüm exe
analiz edilip içinde geçen tüm jump ve call komutları için referans açıklamaları
oluşturmak gerekir, diğer yöntem ise daha basittir , sadece o anda işlenen
kodun birkaç satır öncesi ve sonrası da dahil olmak üzere görüntülenir . Yeni
başlayanlar için birinci yol daha kolay ve cazip gelebilir , çünkü bu yöntemle
assembly kodlarının yanında daha fazla açıklama vardır ve bir altyordamın
nerelerden çağrıldığını ve hangi adresleri yada değişkenleri kullandığını daha
açık bir şekilde görebilirsiniz , ama ben bir an önce kırayım şu programı
diyorsanız debugger kullanmak daha işinize gelicektir , bunun birinci sebebi
disassembler programların exe’yi disassemble etmek için harcadığı zamandan
kurtulmuş olacaksınız ikinci sebebi ise breakpoint (Durak noktası) koymadaki
kolaylıktır. Debugger kullanarak daha dinamik breakpoint’lar koyma şansına
sahipsiniz . Örnek vermek gerekirse: Disassembler olarak Wdasm programını ve
Debugger olarak da Softice programını ele alalım. Önümüzde bir program var ve
registiration olanağı var , bizden bir kayıt numarası (programın parası
ödendikten sonra size yollanan şifre) istiyor , birinci yol ile yani
disassembler ile kırmamız için bu programın exe’sini disassemble etmemiz
gerekiyor , bu en azından 10 dakikamızı alıcaktır. Daha sonra programın kullandığı
windows API’lerinin listesinden getwindowtexta fonksiyonunu arayıp tümüne breakpoint
koyma şansımız var ama bunun için fonksiyonun geçtiği herbir satıra listeden
çift tıklayarak gelip breakpoint olarak işaretlememiz gerekiyor bu da en azından
5 dakikamızı alıyor , ve programı çalıştırıyoruz (aslında burada wdasm programının
debugger özelliğini kullanmış oluyoruz aksi halde işimiz çok daha uzun sürer)
.Program çalışmaya başladıktan sonra getwindowtexta fonksiyonunu çağıran her
breakpoint’te duraklayacağız , çünkü biz breakpointları koyarken hangisinin
neredekine ait olduğunu bulmamız zor olacağından biz tümüne koyduk ve bu yüzden
de bayağı vakit kaybedip istediğimiz registiration ekranındaki geçen
getwindowtexta fonksiyonuna ulaşabildik. Buraya kadar en azından 30 – 40 dakika
vaktimizi aldı , bundan sonra ise disassembler ekranındaki satırları rahatça
inceleyip gerekli kodu , algortimayı yada patch uygulayacağımız noktayı bulduk.
Şimdi aynı programı softice ile kıracağımızı düşünelim , yapacağımız çok basit
programı çalıştırıp registiration ekranına geliyoruz uydurma bir şifre yazıp OK
tuşuna yada bunun benzeri tuşa basmadan evvel Softice programına atlıyoruz
ctrl+D ile ; şimdi sıra breakpoint’u koymaya geldi bpx getwindowtexta yazıp
enter’a basıyoruz , ve tekrar programımıza dönüyoruz şimdi OK tuşuna yada
herneyse o tuşa basıyoruz , işte! Softice’ın içindeyiz bundan sonrası ise beş
dakikamızı alır ve registiration kodunu yada patch uygulayacağımız noktayı
tespit ediyoruz . İşte bu kadar bu yöntem ise en fazla 10 dakikamızı aldı.
Tabii ki disassembler programların da çok işe yaradığı zamanlar yok değil
mesela bazı programları disassemble ettikten sonra programın içinde geçen
textlere ait referans satırlarına daha kolay ulaşıp bazen debuggerda çok
vaktimizi alabilecek crackleri çok daha kısa bir zamanda gerçekleştirmemiz de
mümkün olabiliyor . Bilhassa debugger ile uğraşıp ta bir türlü istediğiniz API
ye denk gelen bir breakpoint bulamadığınızda .
Şimdilik bu konuda yazıcaklarım bu kadar ilerki aylarda bu konunda ayrıntılarına
gireceğiz mesela debugger ile breakpoint’u bulduktan sonra crack uygulamamız
gereken noktayı nasıl tespit edeceğimizi ve bunun hakkında ipuçları .
Gelelim ikinci konumuza yani kırarken kullandığımız araçlar ; tahmin ettiğiniz
gibi softice debugger olarak , wdasm disassembler olarak ( ben bunu genelde
TR-Scene deki yazılarım için kullanıyorum) , hexworkshop hexeditör olarak ve
patch uygulamak için , pcom yada herhangi bir c++ yada pascal derleyici de
crack yada keymaker hazırlamak için .
Yine bana gelen mailler içinde sıkça sorulan bir soru breakpoint ların uygulanamaması
hakkında , yani birçok okuyucu bpx getwindowtexta yazdığında hata mesajı aldığını
yazıyor . Bunun sebebi softice ‘ın bu API den habersiz olması , peki nasıl
haberi olacak ? Softice programını ilk kurduğunuzda yapmanız gereken birkaç şey
var yani benim size tavsiye edebileceğim , 1- Symbol loader’a girip edit
menüsünden Softice initialization settings yazan yere tıklayıp , initialization
string yazan yere x; den sonra şunları eklemeniz lines 40; wd; wr; wc 20; code
on; yani string şöyle görünmeli’ X;lines 40;wd;wr;wc 20 ;code on; ‘ buradaki 40
ve 20 rakamlarını kullandığınız ekran çözünürlüğüne göre ayarlayabilirsiniz ,
code on komutu assembly komutların yanında hexedecimal olarak makine kodlarının
da yer almasını sağlıyacak bu da bize patch hazırlamakta lazım olacak .
2-winice.dat dosyasını notdefteri ile açıp başında EXP ibaresi olan tüm satırların
önündeki ; ( noktalı virgül ) işaretlerini kaldırmanız gerekiyor işte böylece
softice windows API lerinden haberdar olacak , ayrıca softice da iken başını
hatırladığınız bir API yi bulma için exp kmoutunu kullanabilrisiniz mesela ‘exp
getwindow’ komutu bize getwindow ile başlayan tüm API leri listeleycektir.
Peki softice ile patch uygulayacağımız nktayı bulduktan sonra ne yapacağız
diyorsanız işte burda hexeditörün kullanımı devreye giriyor , diyelimki jz
xxxx:xxxx olan bir komutu jnz yada jmp xxxx:xxxx yaptığımızda programın çalışacağını
tespit ettik , o zaman hemen elimize bir kağıt kalem alıp bu satırdan bir yada
iki satır evvelinden başlayarak bir yada iki satır sonrasına kadar olan
komutların hexedecimal formattaki makine kodlarını yazmaya başlayalım (yukarıda
bahsettiğim code on komutu bunları görmemizi sağlıyacak ) , not alma işlemimiz
bittikten sonra Hexworkshop programı ile yada herhangi bir hexeditör ile bu exe
yada dll dosyasını açıyoruz ve az evvel not aldığımız hex kodları bu dosya
içinde tümünü olmak üzere aratalım , büyük bir ihtimalle bir yerde bulacaktır
bu kodları işte burası bizim crack’i uygulayacağımız nokta , ister bu noktanın
ofset adresini hexworkshop tan okuyup bir yere yazarak c++ yada pcom gibi basit
bir derleyici ile gerekli değişikliği yapacak bir crack yazabiliriz yada daha
hexworkshop’ta iken istediğimiz kodu değiştirebiliriz. Böylece crack’imizi
sabit bir hale getirmiş olduk .
Aynı şekilde crack uygulayacağımız noktayı wdasm programından da elde etmemiz
mümkün , dikkat ederseniz wdasm programın en altında bulunan status bar ‘da o
anda olduğumuz satırın ofset adresi yer alır.
İşte adım adım bir programın crack edilme işlemi bu şekilde gerçekleşiyor . Bu
arada bilmeniz gereken birkaç husus daha var mesela op kod denilen makine dili
komutların karşılığı yani softice da iken assembly kodların sol tarafında
görülen hexedecimal rakamların anlamları , biraz çalışma ile bize lazım olacak
bu op kodları ezberlemek fazla zamanınızı almayacaktır.Yada internetten intel
op codes olarak arattıp bu kodların tümünü içeren dokümalara ulaşmanız da o
kadar zor değil .