"BYTE v3.5.0.0"

raskolnikov
Program Url: http://www.bytesoft.com
Program Tipi: Eczane programı
       Araçlar:
 Ollydbg 1.08 (debugger),Aspackdie(unpacker),IDA Pro 4.xx(disassembler),Winhex(editor)  
Basit ()  Orta (x)  Zor (x )  Pro ( ) 

Başlangıç

Canımın sıkıldığı bir gün bu programla uğraşıyım dedim.İlk başta kolay olucağını düşündüğüm bu program beni epey uğraştırdı.Bu yazıda size unpack yapmadan nasıl inline path yaparız yine bunun üstünde durucam.

Yazı

BYTE 3.5.0.0 , bir önceki versiyonu 3.3.0.0 gibi Aspack 2.11 ile paketlenmiş moduller içeriyor. Yazilimi lisanslamak için kullanilan program Lisans.exe adli modul.Bu arada Eczwin.exe adlı ana program üzerinde de yapilabilecek birkaç kod degişikligi ile programi korumadan kurtarmanin mümkün oldugunu belirtelim , ancak bizim burada ki amacimiz korumanin tam olarak neyi nasil yaptigini bularak BYTE in koruma algoritmasi üzerine bilgi sahibi olmak

Öncelikle programımızı (Lisans.exe) sıkıştırılmış halinden kurtarmamız gerekiyor.(unpack)
Bunun için en uygun yardımcı aracımız Aspackdie adlı unpacker,arzu eden arkadaşlar başka bir program da kullanabilirler.Programın unpack edildikten sonra sorunsuz çalışıp çalışmadığını kontrol edin.Eğer herşey yolunda ise IDA Pro ile disassemble edin.
IDA’nın sağladığı avantajlarla programın disassemble edilmiş halini incelemenizi tavsiye ederim.

Lisans.exe her çalıştırıldığında her biri 9 adet ikili sayılardan oluşan 2 tane parametre üretiyor ve bu parametreler her çalıştırılışta farklı değerler alıyor.Dikkat edilirse bu sayılar ASCII gibi tüm karakterleri içermiyor sadece hexidecimal sayı karakterlerinden oluşuyor.Yani 9 byte lık hexidecimal bir sayı formunda.


Şimdi Debuggerimizi açip (Ollydbg 1.08) unpack edilmiş Lisans.exe yi yükleyelim ve çaliştiralim.
Program normal bir şekilde açilip bize 1. ve 2. parametreleri gösterince, ister debuggerimizden isterseniz winhex gibi herhangi bir bellek dump programi ile 1. parametre ile gösterilen degerleri bellekte ASCII karakterleri olarak aratalim.Parametre degerlerinin ???????? adresinde oldugunu göreceksiniz.Bu adres işletim sisteminize ve onun konfigürasyonuna göre değişik değerler alabilir.Bu değer örnek olarak benim çalıştığım win 2000 platformunda 00ED6D90 olmaktadır.(bir başka örnek win98 işletim sisteminde 00D3673C olarak görünüyor).

Şimdi debuggerimizde restart yapip tüm dll lerin yüklenmesine kadar kismi çaliştiralim ki (load library dahil) breakpoint koyacagimiz adresler açilsin.

004D6BA2 : CALL LoadLibraryA (programın kullandığı librarylerin yüklendiği adres)

00ED6D90 (sizde parametre hangi adreste çıktıysa onu kullanın) adresinde ki byte üzerine memory breakpoint koyarak programı çalıştıralım.Bu adrese parametre değerleri gelene kadar F9 (run) devam edelim.Yeni parametreler gelince görüleceği gibi bu adreste ASCII olarak belirlenen parametre değerleri 00ED6D58 adresinde hex sayı olarak aynen yer almaktadır.(breakpoint koyduğunuz adresten sadece 38h byte yukarda görebilirsiniz).Yani program bize bildireceği parametrenin değerini hesapladıktan sonra bu değerleri decimal format ‘a çevirmeden hexidecimal değerleri ASCII formunda vermektedir.
Okuduğumuz parametreler aslında bellekte hexidecimal olarak bir değer ifade bir grup sayının aynen bellekte duruş pozisyonuyla bize gösterilmesidir.Bildiğiniz gibi değerleri ifade eden byte'lar dizisi bellek bölgesinde ters şekilde durur.( AABBCCDD hex sayısının bellekteki pozisyonu DDCCBBAA şeklindedir)

Peki şimdi ne yapacagiz?? BYTE ilgilileri lisanslama işlemi için ne yapıyorlardı ??
Müşterinin okuduğu parametrelerden bir takım bilgilere kavuşuyorlar sonrada bu bilgilerin karşılık değerini programın içersinde kodlanmış olan algoritmaya uygun olarak hesaplayıp geri gönderiyorlar ( yani sanırım böyle : )
Herhangi bir serial veya parametrenin ne ifade ettigini bilmemiz için bu parametrenin üretilmesinde kullanılan değerler ile metodları bilmemiz gerekir.(harddisk no veya bir sabit gibi)

O halde biz de onlar gibi yapalım (bizimki biraz daha zor olacak :) ve okunan parametrelerin hangi değerleri kullanarak üretildiğini bulalım.

Sabırlı ve ısrarlı arkadaşlar , tekrar tekrar restart yaparak(defalarca) ve parametre değerlerinin bulunduğu 00ED6D58 adresinden başlayıp geriye doğru giderek memory breakpoint koyarak bu adrese gelen parametre değerlerinin hangi adreslerde ve ne şekilde hesaplandığını bulabilirler.Sonunda varacakları aynı kod satırları olacaktır.

Daha az sabırlı olanlar için ben söyleyeyim :)
İşte aşağıdaki kod satırlarında bize gösterilen parametre değerleri şifrelenmekte ve bize gösterilmek üzere hazırlanmaktadır.

004D6663 CALL Kopya_un.00404104 => okunacak parametrenin byte sayısını bul ( her açılışta max 8 değerini alıyor) 
004D6668 MOV EBX,EAX => bu sayıyı EBX e koy
004D666A TEST EBX,EBX => değer uygunmu?
004D666C JLE SHORT Kopya_un.004D66A5 => değilse bu adrese git
004D666E MOV EDI,1 => 1. byte’tan başla
004D6673 XOR EAX,EAX
004D6675 MOV AL,BYTE PTR SS:[EBP-5] => Katsayı’ yı AL’ ye yerleştir
004D6678 CALL Kopya_un.00402D24
004D667D MOV EDX,EAX
004D667F OR EDX,80
004D6685 MOV EAX,DWORD PTR SS:[EBP-4]
004D6688 MOVZX EAX,BYTE PTR DS:[EAX+EDI-1] => şifrelenecek parametreden sırası gelen byte’ı al
004D668D XOR EDX,EAX => komut işlem görünce şifrelenmiş byte EDX te
004D668F LEA EAX,DWORD PTR SS:[EBP-C]
004D6692 CALL Kopya_un.0040402C => şifrelenmiş byte’i yerleştir
004D6697 MOV EDX,DWORD PTR SS:[EBP-C]
004D669A MOV EAX,ESI
004D669C CALL Kopya_un.0040410C
004D66A1 INC EDI
004D66A2 DEC EBX => kaç byte kaldı
004D66A3 JNZ SHORT Kopya_un.004D6673 => okunacak byte varsa devam

Burada dikkat edilecek husus , üretilen parametrenin 9 byte olmasına rağmen oluşturulan döngünün max.8 byte lık olması ve bir byte’lık bitsel işlemlerin yapılması.Bunun tam olarak anlaşılması için sadece 004D668F adresine breakpoint koyun , programı restart yaparak F9(run) basın ve program her durduğunda(16 kez duracaktır) EDX in değerini bir kenara yazın.yazdıklarınızı ilk sekiz ve ikinci sekiz olarak ayırın.Program açıldığında göreceksinizki okunacak parametrelerin ilk sekiz byte’ı ile sizin not aldığınız değerlerle aynı.Yukardaki kod satırlarında ki açıklamalarımdan da anlaşılacağı üzere program şifrelenecek 1 byte’lık değeri okumadan önce 004D6675 adresindeki çağrı ile kullanacağı değeri alıp şifrelemeyi ona göre yapıyor ve dikkat ederseniz bir parametrenin tamamı aynı değer ile şifreleniyor.Az önceki debug işlemini bu sefer 004D6675 adresine de bir breakpoint koyarak gerçekleştirirseniz elde edilen parametrelerin sonundaki 9. byte değerinin bu şifreleme değeri olduğunu görürsünüz.

İşte bu parametrelerin sonundaki 1 byte değerine sadece Katsayı diyeceğiz.Bu katsayının sistem saatiyle ilgili olarak randomize bir şekilde üretildiğini görmek isteyen arkadaşlar Yukardaki kod satırlarından yukarıya doğru araştırma yapabilirler.
Böylece byte’ın bize verdiği parametrenin niçin 9 byte olduğu anlaşıldı.Artık bizi ilgilendiren parametrelerin sonunda yer alan byte’lar dışındaki ilk sekiz byte’lık kısımlarını çözümlemek.

Buraya kadar ne bulduğumuza bakalım.
Program yukardaki kod satırlarına gelene kadar 4 adet 32 bit’lik (FFFFFFFF) değer hesaplayıp bunları bellek içersine yerleştiriyor ve ikişerli gruplayarak toplam sekiz byte’ı byte byte olmak üzere randomize bir katsayı ile şifreleyerek bize parametre olarak sunuyor
Bu katsayıyı da parametrenin sonuna yazarak müşterinin hangi katsayı ile şifrelendiğini
Byte ilgilisinin öğrenmesini sağlıyor:)
Bir başka deyişle 4 adet gerçek 32 bit sayiyi hesaplayan program bunlarin herbir byte’i üzerinde bit’sel işlemler yaparak şifreli parametre olarak bize veriyor.

Şimdi de bizim girecegimiz karşilik degerlerine ne gibi bir işlem yapiyor ona bakalim isterseniz
Bunun uzun yolu (ben gittiğim için biliyorum) karşılık parametresi olarak girdiğimiz değerleri yine bellekten bularak bu adreslere memory breakpoint koyup defalarca restart yapıp bu değerlerin hangi adreslerden hangi işleme tabi tutularak geldiklerini bulmak. Israrcılar ve bunun keyfini çıkarmak isteyenler denesinler
Uğraşamayacaklar için ben söyleyeyim,

Girdiğimiz karşılık parametreleri de aynen yukarda ki şifrelemenin yapıldığı kod satırlarına gidiyor.Yani program kendi yaptığı gibi bizimde gerçek şifre değerlerini aynı mantıkla şifreleyerek girdiğimizi düşünüyor ve aynı kod satırları aynı zamanda girdiğimiz parametrenin şifresini çözüyor.Adım adım (F8) yapacağınız küçük bir incelemeyle girdiğiniz karşılık parametrelerinin sonundaki katsayı değeri esas alınarak şifresinin çözüldüğünü göreceksiniz.

Bu arada 1 byte lık randomize bir hex sayıyla şifrelemenin veya çözmenin de hoş bir yanı dikkat çekiyor şöyleki ,her parametre 1 byte lik bir degerle şifreleniyorsa veya çözülüyorsa max. FFh kadar şifrelenebilir yada FFh kadar girilebilecek doğru parametre var demektir.Milyarlarca olasılığın yanında denizden bir kova :) ama en azından yalnız değiliz !

Bu kod satırlarında yapılan işlemi şöyle açıklayabiliriz
Herhangi bir X sayısını Y parametresi ile fonksiyona tabi tutarsak sonuç=Z
Elde edilen Z sayısını yine aynı Y katsayısı ile fonksiyona gönderirsek sonuç=X

Bu bitsel işlemin 8086 komut setindeki karşılığını biliyormusunuz ? XOR
5 XOR 3 => 6
6 XOR 3 => 5

O halde bizde okunan parametreleri aynen karşilik parametresi olarak girip şifresiz gerçek anahtar degerleri elde edebiliriz.

Okunacak parametreleri katsayılarıyla beraber olmak üzere 1.karşılık ve 2. karşılık parametresi olarak girdik ve 004D6673 adresine breakpoint koyarak F9(run) yapalım.
004D668F adresine her gelişte EDX değerlerini bir kenara yazalım
Bu şekilde ilk sekiz byte’in degerini alabilirsiniz ve program ondan sonra parametreler hatali mesaji vererek durur. Halbuki 8+8=16 byte in degerini ögrenmemiz gerekirdi degil mi?
Bir terslik var ama korkmayın buda byte çıların daha sonra değerlendirebileceğiniz küçük bir extra koruma hilesi.Yinede aldığınız ilk sekiz değere iyi bakın.

Şimdi ayni işlemi şöyle yapalim.1. okunacak parametrede gördügünüz degerleri 2. karşiliga
2.okunacak parametrede gördüğünüz değerleri 1. karşılığa yazın ve az önceki adreslere breakpoint koyarak tekrar deneyin.

Bu sefer 3x8=24 byte lık değer okudunuz değil mi?? Ama dikkat edin ilk iki sekiz byte aynı,
İlk olarak çözümlenen 8 byte bu değere ihtiyaç duyulan başka bir procedure‘dan yapılan dallanma sonucu olduğunu söyleyip geçelim.Bu durumda elimizde iki adet sekiz byte lık birbirinden farklı dizi olduğunu görüyoruz.
Bu anlattığımız işlemi (okunacak parametreleri yer değiştirip karşılık parametresi olarak girmek) birkaç kere tekrarlarsanız ve elde ettiğiniz değerleri incelerseniz şu sonuca varabilirsiniz.

İkinci okunacak par. = Şifresiz Birinci karşılık parametre = XX XX XX XX 5F 00 00 00

Birinci okunacak par. = Şifresiz Ikinci karşilik parametre = YY YY YY YY ZZ ZZ ZZ ZZ

Elde ettiğimiz bu 4 adet 32 bitlik değerlerin ne olabileceklerini yorumlamaya çalışalım.

i) XX ile gösterdiğimiz anahtar değeri programı her çalıştırışımızda değişiyor belli ki bir sayac kullanıyor .(Sistem saatini kullanıyor tahmini ile getsystemtime api’sinden gelen değerleri sabitlediğim halde değişmeye devam etti)
ii) 5F sayısının bellekteki pozisyonu olan 00 00 00 5F görüldüğü gibi bir sabit ancak her seferinde randomize bir katsayı ile şifrelenerek bize 2.okunacak parametrenin ikinci 4 byte’ı olarak gösterildiğinden daha önce farketmemiz olanaksızdı.
iii) YY ve ZZ ile gördüğümüz değerler de devamlı sabit değer görünüyor ama 5F gibi bir değerede benzemiyor. Tahmin ettiğiniz gibi bu sizin makinanızın bu programa ait kimlik kartı olmalı
İkinci bir makinanız varsa hatta ona da gerek yok, harddisk,ram gibi bir parça değiştirirseniz bu değerlerdeki değişikliği hemen göreceksiniz.

Şu an elimizde biri tamamen sabit,ikisi makinaya bagli sabit,biride devamli degişken olan 4 adet deger var.Oldukça iyi yol geldik ama bu dört degeri anlamlandiracak bilgiye ihtiyacimiz var hala.Bunun için program kurulumdan-çalişmaya ne yapiyor neleri kullaniyor nereden bir tüyo bulabiliriz bunlari düşünmemiz gerekiyor.
Siz düşünmeye devam edin :)) Bunu prensip edinin diye yazdim , benim çok fazla araştırmama gerek kalmadi çünkü sevgili “slowbend” aradığım ipucunu farketmiş.
Ve bu bana büyük bir kolaylık oldu gerçekten.(tekrar teşekkür ediyorum)

Bu bilgi C:\Byte\shared dizininde de bulunan kurulum esnasında da system klasörünün içine atılan Keylbe32.dll isimli bir library dosyası.Dosyanın üreticisine baktığınızda Concept Software,Inc ismini görüyorsunuz.Tahmin edebileceğiniz gibi program yabancı bir library dosyasından yararlanıyor ve isminden de bunun bizim istediğimiz ipucunu vermesi kuvvetle muhtemel.

İnternet ten sizinde bu ismi aratarak çok kısa zamanda erişebileceğiniz adres tam olarak şöyle
www.softwarekey.com

Daha ilk sayfadan buranın profesyonel bir yazılım koruma firmasının olduğu meydanda.
Biraz gezinip bilgilendikten sonra Protection Plus isimli ürünün .LF korumanın ta kendisi olduğunu öğrenip .LF dosyaların editörü olan LFEdit içeren demoyu indirebilirsiniz.
(bizde böyle yaptık zaten :)

Gelen demoyu kurup bakarsanız harika hazırlanmış bir help dosyası ile karşı karşıya kalacaksınız.Gerçekten adamlar müşterilerine herşeyi anlatmışlar.Tabii bizede :)

Dersi çalışınca resim oldukça netleşiyor LF dosyası ile koruma mantığında Trigger code denilen bir code üretilmesi var.Bu Trigger code en önemli kontrol noktası bir şifre ancak bunun üretilmesi için bir dizi değerlerin elde edilmesi gerekiyor.

Bu kodun üretilmesi için gerekli bileşenler şöyle,
i) Compno : Computer ID number : Kullanılan PC nin özelliklerini temsil eden bir sayı (sabit)
ii) Cenum : Code entry number : Session ID olarak bilinen oturuma ait bir sayı(değişken)
iii) Seed code : Yazılımcı tarafından seçilecek bir sabit sayı(sabit)

Eğer bu 3 bileşen değerini bulursanız Trigger code hesaplayabilirsiniz demektir.Gelen demo’nun tools kısmında trigger code üretecinden faydalanabilirsiniz.

Parametre okunan Yazılım ilgilisinin şifreyi hesaplayabilmesi için buradan alması gereken iki önemli değer var “compno” ve “cenum”. Seed code’u Yazılımcılar zaten biliyorlar çünkü kendileri saptadılar.Bir de 5F değeri var.

Peki cenum hangisi,compno hangisi

Tebessüm ettiğinizi görür gibiyim :)) Evet yukarıda XX XX XX XX ile sembolize ettiğimiz değişkenin “Cenum” olması gerekiyor değil mi? Her oturumda değişen sayımız!!.

Bir de elimizde “compno” var ama
YY ve ZZ olarak sembolize ettiğimiz iki tane 32 bitlik sabit var.
Birisi “compno” ise diğeri ne ?

Help dosyasına bakıyoruz tekrar pp_compno fonksiyonuna

Cevap burada : Protect Plus yazılımcılara 9 adet ayrı compno hesaplayabilme olanağı veriyor
Nasıl mı? BİOS ile ilgili özellikleri temsil eden bir computer numarası isterseniz fonksiyona key olarak 1 gönderiyorsunuz gelen değer makinanızın bios bilgilerine göre hazırlanıyor
Yalnızca Harddiskinizi temsil eden bir computer numarası isterseniz fonksiyona göndereceğiniz key 2 olmalı vs vs diye liste uzuyor.Böylece isteğinize göre birden fazla compno hesaplatabilirsiniz

Bildiğimiz kadarıyla, bu program sadece harddisk değil donanımla ilgili bir parça değiştiğinde bile
Demoya düşüyor.Büyük ihtimal hem “harddisk” , hemde “bios” özelliklerine göre iki compno değeri olmalı.
Peki bunun doğrusunu nerede bulacağız ?? Tabii ki hepsi zaten elimizde olan Keylbe32.dll adlı library’nin içinde.Biz farketmesekde programımız zaten bunu kullanıyor.
Trigger code’un hesabı Keylbe32.dll içersinde “ pp_tcode “ fonksiyonu ile yapılıyor.

İşte adresi: 10007810 : pp_tcode

pp_tcode fonksiyonunun, bu fonksiyona dallanma yapıldığında yukarda bahsettiğimiz seed code,compno,cenum değerlerinin sırasıyla stack e push edilmesi gerektiğini yine help dosyasından öğreniyoruz , O halde bizde bu adreste durursak bu değerleri okuyabiliriz

Haydi şimdi debugger de lisans programimizi açalim ve bütün breakpointleri disable edelim ve F9(run) yapalim.
Program açıldıktan sonra yine parametreleri yer değiştirerek (1. yerine 2, 2. yerine 1) girelim ve 004D668F ve 10007810 adreslerine breakpoint koyarak F9 yapalım.
Şifresi çözülmüş parametre değerlerini EDX ten okuyup not alalım(4 adet 32 bitlik hex değer)
F9 ile devam edince 10007810 adresindede duracağız.
10007810 adresinde durunca ESP+10, ESP+C, ESP+8 adres değerlerini not alın
Bunlar sırasıyla seed code,compno ve cenum değerleri

ESP+10 adresinde aldığımız değer 1DE6h sabit sayısı olmalı. Bu BYTE çıların bu program için uygun buldukları “seed code”

Ne görüyorsunuz ?? XX ile tariflediğimiz sayı ile ESP+8 adresinden aldığımız sayı aynı değil mi?
Evet bu cenum’un ta kendisi . “code entry number” (bir başka ismi session ID)

Burada ESP+C stack adresinde bulduğumuz compno değeri ile bizim YY ve ZZ ile sembolize ettiğimiz iki değerin arasında bir ilişki kurmaya çalışın bakalım şimdi.

Umarım fazla uğraştırmamıştır. YY YY YY YY ve ZZ ZZ ZZ ZZ hex değerleri toplarsak
ESP+C deki compno değeri ile aynı olduğunu göreceksiniz

Program harddisk ve bios özelliklerine göre iki ayrı compno oluşturuyor ve Trigger code un üretilmesinden önce bunları toplayarak tek bir Compno değeri elde ediyor

Compno=compno1+compno2 şeklinde

Başlangiçta anlam vermekte zorlandigimiz bize gösterilen parametrelerin içindeki
4 adet 32 bitlik değerlerin hepsi şimdi anlam kazandı

parametrelerin şifrelenmeden önceki degerleri
compno1 compno2
cenum 5F 00 00 00
şeklinde olmaktadir

Programin bize gösterdigi parametrelerin açilimini artık biliyoruz

1. Okunacak par.’nin ilk dört byte’ı makinamızın “bios”una ait computer numarası-compno1
1. Okunacak par.’nin ikinci dört byte’ı makinamızın harddiskine ait computer numarası-compno2
1. Okunacak par.’nin son byte’ı 1. karşılık parametrenin şifreleme Katsayısı

2. Okunacak par.’nin ilk dört byte’ı programın oturum kimlik numarası -cenum
2. Okunacak par.’nin ikinci 4 byte’ı 5F sabiti (birazdan ne manaya geldiğini öğreneceğiz)
2. Okunacak par.’nin son byte’ı , 2. Okunacak parametrenin şifreleme Katsayısı


Şimdi sıra geldi elde ettiğimiz bu değerlere karşılık olarak bizim gireceğimiz karşılık parametrelerinin giriş değerlerini bulmaya.

Öncelikle programın bizden isteyeceği şifreyi (Trigger code) nereye gireceğimizi bulalım.
Bunun için yine Keylbe32.dll içindeki pp_tcode fonksiyonunu kullanacağız.Bu fonksiyonun giriş adresi olan 10007810 adresinden F8 ile adım adım ilerlersek az aşağıda 100078AC adresinde
CMP ESI,ECX şeklinde bir komut satırı görürsünüz.İşte tam bu sırada ESI register’inde programın hesapladığı doğru şifre bulunmaktadır.ECX ‘te ise bizim girdiğimiz değerlerin karşılığı oluşturulan şifre.
Bu arada bir şey dikkatinizi çekmiştir belki. Programın bize verdiği parametreleri aynı değerlerle ancak yer değiştirerek girmezseniz Keylbe32.dll içindeki pp_tcode fonksiyonuna breakpoint koysanızda burada duramazsınız.Sebebi tamamen BYTE yazılımcılarının geliştirdiği extra bir koruma.Hani 5F sabitine rastlamıştık ya yukarıda ,işte o değerin sorgulandığı yer bu adreste

004DD624 CMP EAX,DWORD PTR SS:[EBP-4]
004DD627 JE SHORT lisans.004DD63A

Biz eğer 5F değerini katsayı ile şifreleyip doğru giremezsek bu eşitlik şartı sağlanmıyor ve program akışı kesiliyor.Aslında 5F sayısı da bütünüyle değişmez bir sabit değil.Biliyorsunuz programımız default olarak “standart” modunda çalışıyor ama “başlangıç”, “standart pilot” ve “profesyonel” mod seçeneklerinin var olduğunu (help dosyasında şimdilik sadece “standart” ve “standart pilot” modlarının işlevsel olduğu bahsediliyor) incelemişseniz görürsünüz.00525318 adresinde EAX ve EDX registerlerinin değerlerinden hareketle 5F sayısının çalışılan “mod” u ifade eden değer olduğunu ve hangi adresten (data) alındığını ve hangi mod’da hangi sabit kullanılıyor bunu bulmayı size bırakıyorum.

Şimdilik geçici olarak 004DD627 adresindeki eşitliği (je) , eşitsizlik (jnz) yaparak Key dll limizin içine düşmeyi sağlayalım ve katsayıları 01 olmak şartıyla tüm parametreleri sıfır değeri girelim.
100078AC adresine breakpoint koyduktan sonra F9 yapalım.Durduğumuzda girdiğimiz şifreyi gösteren ECX’in değerine bakalım. ECX=80808080 değil mi?

Karşılık parametresi olarak girilecek değerleri 4 adet 32 bitlik olarak düşünüp her birini ayrı ayrı
Sıfır değeri verip katsayıyı da 01 olarak girer ve 100078AC adresine breakpoint koyarak ECX teki girilen şifre değerini hangi 4 byte lık değerin etkilediğine bakarsak şifreyi girmemiz gereken doğru yerin 1. karşılık parametresinin ilk dört byte’ ı olduğunu kolayca bulabiliriz.
Parametreleri yer değiştirerek girdiğimizden biliyoruzki 5F sabitini de 1. karşılık parametrenin ikinci dört byte lık kısmına gireceğiz.

Yukarıda tüm şifreleri sıfır girince ECX=80808080 sonucu size bir şey açıklıyor mu?
Peki , girilen 4 adet sıfır byte ını 80 ile XOR işlemine sokunca sonuç ne oluyor.80808080 J)
Katsayı 01 iken her byte 80h XOR işlemi ile şifreleniyor veyahut çözülüyor.Katsayı değiştikçe
Her byte için 80 değeri farklı olabiliyor.
Bizde katsayıyı 01 kullanırsak 5F sayısını DF808080 olarak girebiliriz. 5F XOR 80 =>DF

Az önce 004DD627 adresindeki je yi orijinal haline getirin ve 1. karşılık parametresi olarak

80808080DF80808001 şeklinde 2. parametreyede birşeyler uydurarak girin.100078AC adresine breakpoint koyun ve F9 yapın.Programın kesilmeden Keylbe32.dll içine düştüğünü göreceksiniz.

ECX teki 00000000 değerini ESI deki değerle(gerçek şifre) modify’ e edin ve F9 basınca programın lisanslandığını(standart) göreceksiniz.

Program lisans işlemi için esas olarak 1. karşılık parametreyi kullanıyor
İlk dört byte trigger code=şifre , ikinci dört byte =çalışılan mod’un hex değeri

2. karşılık parametresi çok kullanıcı veya süreli kullanımlı lisans işlerinde kalan gün için kullanılıyor

İşin keyfini kaçırmamak için onları tespit etmeyi de size bırakıyorum :)

Programın şifreleme-veyahut çözme yapan kodlarını içeren bir programcık yaparsanız o zaman tüm katsayılarla bize verilen değerlerden rahat bir şekilde “cenum”,”compno” değerlerini okuyabilir ve karşılık parametreleride istediğiniz katsayıyı kullanarak girebilirsiniz.

Ayrıca indireceğiniz LFEdit demo dosyasında bulunan LFRW.exe adlı program ile de .lf dosyasında tüm değişikliklerin nasıl kolayca yapılabildiğini görünce çok keyifleneceksiniz.Ancak bir şart ile, Lisans Programını debugger’da inceleyerek .lf dosyasının şifresini ele geçirmeniz gerekiyor .Aslında LFEdit.exe yi demodan kurtarabilirseniz o çok çok daha iyi olur ama o da size kalmış bir şey !!

İyi eğlenceler...................

raskolnikov...

rasko2099@yahoo.co.uk

Son Notlar

Bir programı kullanarak para kazanıyorsanız, programı satın alın.