"E-cafe v2.10"

Mr_Stop
Program Url: http://www.bsoft.com.tr
Program Tipi: Internetcafe otomasyonu
       Araçlar:
 SoftICE, Dede, Delphi  
Basit (x)  Orta (x)  Zor ( )  Pro ( ) 

Başlangıç

Bu program intercafeler için yapılmış bir program.Kullanışlı bir programa benziyor.Türk shareware programı internette yok gibi birşey.Bu yazıda paketlenmiş exenin nasıl patch edileceğini, zor gibi görünen bir korumamın nasıl kırılacağını ve keygenin nasıl yazılacağını görecez.

Yazı

Bu programı renaTgaD söylemişti.Exe paketlenmiş olduğu için kendisi memory patch yazmış.Paketlenmiş exeler şöyle çalışıyor.Exenin başlangıcında küçük bir kod kısmı var bu paketlenmiş exenin nasıl açılacağını belirtiyor.Bu kısım paketlenmiş exeyi memory 'e açıyor ve program memmory den çalıştırılıyor.Bu yüzden direkt olarak patch etmek olanaksız.Programın koruması Harddisk numarasına göre serial olduğundan bir serial bulup dağıtmanız da imkansız o yüzden iki seçenek var ya patch yada keygen biz ikisini de yapıcaz.İlk başta patch kısmına geliyoruz.

Patch:

İlk başta nereleri değiştireceğimizi bulalım.E-cafe programın açıyoruz ve kayıt ekrarnına gidiyoruz.Anahtar no kısmına sallama birşeyler yazıyoruz.SoftICE 'a geçip bpx hmemcpy ile breakpointi koyuyoruz.Tamam tuşuna tıklıyoruz.Birden SoftICE'ın içine geleceksiniz.Şu an kernelim içersindeyiz o yüzden alt kısımda ecafe yazıncaya kadar F12 tuşuna basıyoruz.Bir kaç F12 den sonra şöyle birşey göreceksiniz.

004DC514 FF75F4           push     dword [ebp-0c]
004DC517 68F8C74D00       push     dword 004DC7F8
004DC51C 8D55F0           lea      edx,[ebp-10]
004DC51F 8B830C020000     mov      eax,[ebx+020c]
004DC525 E86E52F4FF       call     00421798

Birça defa F10 ile kodu takip edin ve neler olup bittiğini anlamaya çalışın.Yani bizim yazdığımız kod nereye kopyalanmış, hata mesajı nerden sonra gözüküyor ...raya kadar iyi.Eğer seriali öğrenmek istiyorsanız 0040D608 satırında eax ve ebx in değerlerine bakın.Serialin nasıl hesaplandığını öğrenmek istiyorsanız devam ediyoruz.Ben 0040D5F4 satırına geldiğimde F8 ile call ın içine girdim.

004DC60C 8D45FC                  lea eax, dword ptr [ebp-04]
004DC60F BA05000000              mov edx, 00000005
004DC614 E87379F2FF              call 00403F8C
004DC619 8B45F8                  mov eax, dword ptr [ebp-08];bizim serial
004DC61C 8B55FC                  mov edx, dword ptr [ebp-04];gerçek serial
004DC61F E8B879F2FF              call 00403FDC              ;karşılaştır
004DC624 0F85E2000000            jne 004DC70C               ;eşit değilse hata mesajı
004DC62A B149                    mov cl, 49
004DC62C BA18C84D00              mov edx, 004DC818

.....
004DC70C B148                    mov cl, 48           ;Mesajın tipi 48=error 49=info
004DC70E BA18C84D00              mov edx, 004DC818    ;Hata mesajının başlığı  
004DC713 B8DCC84D00              mov eax, 004DC8DC    ;Hata mesajı
004DC718 E8AF610000              call 004E28CC        ;Mesajı göster

Evet nereyi patch ediceğimizi bulduk.Eğer biz 4DC713 'e hata mesajı yerine bizim seriali gönderirsek program hata mesajı yerine gerçek seriali gösterecektir.Patchimiz yapıldıktan sonra durum şöyle olucak

004DC70C B148             	     mov      cl,49        ;Mesaj tipi info :) 
004DC70E BA18C84D00    		     mov      edx,004DC818  ;Hata mesajının başlığı
004DC713 8B45FC          	     mov      eax,[ebp-04] ;Gerçek serial
004DC716 90        	             nop                   ;Geri kalan yerler için iki tane nop
004DC717 90          	         nop
004DC718 E8AF610000              call 004E28CC         ;Mesajı göster

Nereyi değiştireceğimizi bulduk ama hex editörledirekt olarak o adrese gidip patch yapamıyoruz.Şimdi bir kaç seçeneğimiz var.Bu dosyayı unpack ederiz ve hex editörle değiştiririz.Hafızada açılmasını bekleriz ve hafızada patch ederiz veya daha elit bir şekilde şöyle yapabiliriz.Program kendini hafızaya açtıktan sonra program gerçek entrpoint'e zıplıyor.Biz şöyle yapıcaz.Dosyaya ekleme yapıcaz.Program kendini unpack ettikten sonra programı çalıştırmak yerine bizim patch kısımna zıplıycak.Eğer bunu başaramazsaınız.Aspatch diye bir program var o da aynı işe yarıyor onu deniyebilirsiniz.Memory patch yapmak içinde bir sürü program var.Protools dan çekip inceleyebilirsiniz.Neyse şimdi biz patch'i bırakıp daha temiz ve ağrısız bir çözüme gelelelim.Programın keygen algoritmasını anlamak ve keygen yazma..

Keygen:

  Yukarıda ki kodu incelerken hafızada birkaç sayının dolaştığını görmüşsünüzdür.B27U03L88, WD- ....Bu sayıların keygen ile bir lakası olduğu kesin ama naıl bir alaka..Program Delphi 3 ile yazılmış.Evet şimdi size yeni bir programı tanıtma vakti geldi.Bu program Delphi programlar için tam bir katil.Süper bir alet..Bir ara ben Exe2dpr diye bir programın crack'ını ararken adamın birisi bana bunu yollamıştı v0.9b felandı.Bir ara beta testerlığını felan yapmıştım.Şu an v 2.34 ve süper bir hal aldı.

  Dede'yi Protools dan indiriyoruz.Bizim porgramımız paketlenmiş olduğu için direkt açamıyoruz.Ya unpack ediceksiniz (Procdump ile yapabilirsiniz) veya Dede'nin süper özelliğini kullanabilirsiniz.Process dumper.İlk başta Ecafe sonra Dede'yi açın,Tools kısmından "Dump Active Process" seçeneğini seçin karşınıza gelen menüden Ecafe'yi seçin.Dump tuşuna tıklayın.Biraz bekledikten sonra artık programı kırmaya hazırız.İşlemin sonunda dump successful mesajını alacaksınız.İlk başta classes info'dan adamın hangi componet ları kullandığına bakalım.Ahm, zart,zurt...HDinfo, Tcryptlib....Neyse burayı geçiyoruz.Forms kısmına bakarak hangi formun nerede oluştuğuna bakabiliriz.EN önemli yere geldik.Procedures..Bu arada programın kullandığı prosedürler var.Sol kısımda ilginç bir prosedür varmı diye bakıyoruz.Kayit diye bir prosedür var ona tıklıyoruz.Burada bir kaç event göreceksiniz, formcreate,form activate....Ben bitbtn1click'e tıkladım.Off o da ne..mükemmel bir kod çözümü karşımıza geliyor.Dede standart delphi kodlarını anlıyabildiği için işimiz çok kolaylaşıyor.Biraz aşağılara doğru inin karşınıza şöye bir kod gelecek

* Possible String Reference to: "B27U03L88E"
|
004DC55D   BA04C84D00             mov     edx, $004DC804
004DC562   E8794FF7FF             call    004514E0

  Bu B27U03L88E denen şey de nerden geliyor acaba.Keygen ile bir alakası olabilir.Ben 4DC562 deki call'a çift tıkladım.Karşıma şöyle birşey geldi.

00451503   E8C429FBFF             call    00403ECC
00451508   83F80C                 cmp     eax, +$0C
0045150B   7E20                   jle     0045152D
0045150D   8D4338                 lea     eax, [ebx+$38]

* Reference to: System..LStrClr()
|
00451510   E83B27FBFF             call    00403C50

* Possible String Reference to: "TCryptLib.Password is too long"  ;Aha :)
|
00451515   B964154500             mov     ecx, $00451564
0045151A   B201                   mov     dl, $01
0045151C   A198704000             mov     eax, dword ptr [$407098]

  Programı yazanlar yine büyük bir hata yapmışlar.Başkasının güvenlik yazılımın kullanmışlar.Hemde shareware olanı.Büyük hata...Şimdi biz biliyoruzki adamlar Tcryptlib diye bir component kullanmışlar.Ayrıca, ben kod içersinde dolaşırken harddisk numaramın da işin içinde olduğunu öğrendim.Bu tcryptlib'in kriptolaması çok dandik, basit iki taraflı bir xor dan ibaret.Herneyse biz tcryptlib nemenem bir şey ilk başta onu öğrenelim.Altavistadan arama yapıyoruz ve tcryptlib'i download ediyoruz.Ben http://ntadm.euro.ru/english.htm adresinde buldum.İçinde kaynak kodu da olduğundan incelemesi çok kolay.Ben gelen demo exeyi de inceleyerek fonsiyonlarını belirledim.Olay kısaca şöyle, bir password,addkey,multkey den oluşan üç varibale ile istediğiniz bir stringi şifreliyorsunuz.İlk başta password sonra addkey daha sonrada multkey geliyor.Yeniden biz Dede'ye dönelim ve kaynak kodumuzu yeniden inceleyelim.

  Dedenin daha iyi çalışabilmesi için bu component için bir dsf dosyası hazırlıyalım.Dsf dosyası, bpl dosyalarındaki fonksiyonları belirliyor, dissamble ettiğimizde bize fonksiyonların ismini belirtiyor tıpki W32Dasm da api kodlarını belirttiği gibi.Component'ı install ettikten sonra bpl dosyanız muhtemelen delphi klasörünüzün projects/bpl kısmında olacaktır.Dede yi açıyoruz.Tools kısmından Bpl dumper'ı seçiyoruz.Install ettiğimiz component'ın bplsinin yerini gösteriyoruz.Böylelikle dsf dosyamız hazır hale gelecektir.Eğer sizde Delphi yoksa, hazır dsf dosyasını buradan download edebilirsiniz.Bu dsf dosyasını dede'nin symbol dosyası kısmına eklemeniz lazım.Options kısmında configuration kısmına gidin.Buradadaki symbol kısmına yeni yaptığınız dsf'yi ekleyin.Evet artık dissamble etmeye hazırız.Dede'yi tekrar açıyoruz ve yeniden aynı yere geliyoruz.Bu sefer daha güzel bir kod karşımıza gelicek.

* Possible String Reference to: "B27U03L88E"
|
004DC55D   BA04C84D00             mov     edx, $004DC804
* Reference to: Kbcrypt.TCryptLib.WriteFPassword(System.AnsiString) ;mükemmel !
|
004DC562   E8794FF7FF             call    004514E0
004DC567   A1C4F94E00             mov     eax, dword ptr [$4EF9C4]
004DC56C   8B00                   mov     eax, [eax]
004DC56E   8B8064020000           mov     eax, [eax+$0264]
004DC574   BA9AAF3F00             mov     edx, $003FAF9A ;addkey=4173722 (desimal)
004DC579   E86250F7FF             call    004515E0 ;addkey uzunluk kontrolü
004DC57E   A1C4F94E00             mov     eax, dword ptr [$4EF9C4]
004DC583   8B00                   mov     eax, [eax]
004DC585   8B8064020000           mov     eax, [eax+$0264]
004DC58B   BA3EC22300             mov     edx, $0023C23E ;multkey=2343486 (desimal)
004DC590   E8EF4FF7FF             call    00451584 ;multkey uzunluk kontrolü
004DC595   8D4DFC                 lea     ecx, [ebp-$04]
004DC598   A1C4F94E00             mov     eax, dword ptr [$4EF9C4]
004DC59D   8B00                   mov     eax, [eax]
004DC59F   8B9048030000           mov     edx, [eax+$0348] ;şifrelenecek string
004DC5A5   A1C4F94E00             mov     eax, dword ptr [$4EF9C4]
004DC5AA   8B00                   mov     eax, [eax]
004DC5AC   8B8064020000           mov     eax, [eax+$0264]
* Reference to: Kbcrypt.TCryptLib.EncryptStr(System.AnsiString) ;Evet!
|
004DC5B2   E85D54F7FF             call    00451A14  ;şifrele
004DC5B7   8D45E8                 lea     eax, [ebp-$18]
004DC5BA   50                     push    eax
004DC5BB   B904000000             mov     ecx, $00000004 ;kopyalanacak 4 karakter
004DC5C0   BA01000000             mov     edx, $00000001 ;1. karakterden itibaren
004DC5C5   8B45FC                 mov     eax, [ebp-$04]

* Reference to: System..LStrCopy()
|
004DC5C8   E8037BF2FF             call    004040D0   ;copy it
004DC5CD   FF75E8                 push    dword ptr [ebp-$18]
004DC5D0   68F8C74D00             push    $004DC7F8
004DC5D5   8D45E4                 lea     eax, [ebp-$1C]
004DC5D8   50                     push    eax
004DC5D9   B904000000             mov     ecx, $00000004 ;kopyalanacak 4 karakter
004DC5DE   BA09000000             mov     edx, $00000009 ;9. karakterden itibaren
004DC5E3   8B45FC                 mov     eax, [ebp-$04]

* Reference to: System..LStrCopy()
|
004DC5E6   E8E57AF2FF             call    004040D0 ;kopyala
004DC5EB   FF75E4                 push    dword ptr [ebp-$1C]
004DC5EE   68F8C74D00             push    $004DC7F8
004DC5F3   8D45E0                 lea     eax, [ebp-$20]
004DC5F6   50                     push    eax
004DC5F7   B904000000             mov     ecx, $00000004 ;kopyalanacak 4 karakter
004DC5FC   BA11000000             mov     edx, $00000011 ;17. karakterden itibaren(17h=11)
004DC601   8B45FC                 mov     eax, [ebp-$04]

* Reference to: System..LStrCopy()
|
004DC604   E8C77AF2FF             call    004040D0 ;kopyala
004DC609   FF75E0                 push    dword ptr [ebp-$20]
004DC60C   8D45FC                 lea     eax, [ebp-$04]
004DC60F   BA05000000             mov     edx, $00000005

* Reference to: System..LStrCatN()
|
004DC614   E87379F2FF             call    00403F8C ;birbirine ekle
004DC619   8B45F8                 mov     eax, [ebp-$08] ;bizim serial
004DC61C   8B55FC                 mov     edx, [ebp-$04] ;gerçek serial

* Reference to: System..LStrCmp()
|
004DC61F   E8B879F2FF             call    00403FDC   ;karşılaştır
004DC624   0F85E2000000           jnz     004DC70C   ;hata mesajına zıpla


  Evet buradan anlıyoruz ki bizim passwordumuz B27U03L88E.Ben 004DC59F satırında iken d edx yaptığımda memory de WM6231132186 diye bir numaraı gördüm.Bu numara nereden geliyor dye bir incelemem yaptım.Program bu numarayı DeviceIoControl ile elde ediyor.Muhmetemel kafa sektör bilgisi felandır.Demekki bu program bizim harddiskin özelliklerini tcryptlib ile şifreliyor.Mesela şifrelenen değer 2017F93FE82F1A35302B böyle birşey oluyor.Mavi kısımlar bizim serialimiz oluyor. yani 2017-E82F-302B.Olay bu kadar basit bizim yapacağımız şey harddisk numarasını bulmak ve password B27U03L88E, addkey=4173722 ,multkey=2343486 olarak şifrelememiz.Program Hdinfo95 diye bir componet kullanmış.Bende delphi 5 olduğundan bu component'ı kullanamadım.Install componet diyorum hep hdinfo.pas bulnamadı felan diyor.Heheh delphi lamerıyız normal olarak.Neyse eğer delphi 3 varsa sizde belki siz kullanabilirsiniz.

  Bizde başka yönden yaklaşırız.Bizde çare tükenmez.Kayıt ekranında referans no diye birşey var.Bu refereans nosunun bizim serialle veya harddisk ile mutlaka bir ilgisi olması lazım yoksa adamlar nerden bilecek bizim harddisk özelliklerini :).Bu referans nosu form ilk açılırken oluşuyor.Dede'ye geri dönüyoruz.Events kısmınnda bu sefer form activate'e tıklıyoruz.Biraz aşağıya indiğimzde şöyle birşey göreceksiniz.

004DC1F6   E8A97AF2FF             call    00403CA4
004DC1FB   8B07                   mov     eax, [edi]
004DC1FD   8B8064020000           mov     eax, [eax+$0264]

* Possible String Reference to: "I28R08E64M"   ;password
|
004DC203   BA98C34D00             mov     edx, $004DC398
004DC208   E8D352F7FF             call    004514E0 ;password boyut kontrolü
004DC20D   8B07                   mov     eax, [edi]
004DC20F   8B8064020000           mov     eax, [eax+$0264]
004DC215   BAEDA62B00             mov     edx, $002BA6ED ;addkey=2860781
004DC21A   E8C153F7FF             call    004515E0 ;addkey boyut kontrolü
004DC21F   8B07                   mov     eax, [edi]
004DC221   8B8064020000           mov     eax, [eax+$0264]
004DC227   BA5C702B00             mov     edx, $002B705C ;multkey=2846812
004DC22C   E85353F7FF             call    00451584  ;addkey boyut kontrolü
004DC231   8D4DFC                 lea     ecx, [ebp-$04]
004DC234   8B07                   mov     eax, [edi]
004DC236   8B9048030000           mov     edx, [eax+$0348] ;şifrelenecek değer
004DC23C   8B07                   mov     eax, [edi]
004DC23E   8B8064020000           mov     eax, [eax+$0264]
004DC244   E8CB57F7FF             call    00451A14   ;şifrele

Hehe.Olmaz böyle birşey sayın seyirciler.Eğer 4DC236 satırında iken edx 'in içeriğine bakacak olursanız yine aynı numarayaı göreceksiniz.rogramımız bizim harddisk numaramımızı başka bir password addkey ve multkey ile şifreliyor ve bunu referans kodu olarak kullanıyor.Biz adamlara bu referans numarasını yolladığımızda onlar bu referans kodu deşifre edip bizim harddisk nomuzu buluyorlar sonra başlangıçta verdiğim password addkey ve multkey ile yeniden şifreleyip bize seriali söylüyorlar.Ben delphiden hiç anlamıyorum.Ama yinede biraz uğraşarak keygeni yazmayı başardım.Keygenin çalışması için sizdede Tcryptlib component'ın yüklü olması gereklidir.Boş bir form açın iki tane edit box ve bir tane buton koyun.Serial diye string bir variable ekleyin.Birinci editbox'a referans no yazılacak sonuç ikinci edit boxta gözükecek.Sonra butona şu kodu verin:

procedure TForm1.Button1Click(Sender: TObject);
begin

Serial:=(Edit1.Text);
Serial:=copy(Serial,1,4)+copy(Serial,6,4)+copy(Serial,11,4)+copy(Serial,16,4)+
copy(Serial,21,4)+copy(Serial,26,4);
CryptLib1.Addkey:=2860781;
CryptLib1.Multkey:=2846812;
CryptLib1.Password:='I28R08E64M';
Serial:=CryptLib1.DecryptStr(Serial);
CryptLib1.Addkey:=4173722;
CryptLib1.Multkey:=2343486;
CryptLib1.Password:='B27U03L88E';
Serial:=CryptLib1.EncryptStr(Serial);
Edit2.Text:=copy(Serial,1,4)+'-'+copy(Serial,9,4)+'-'+copy(Serial,17,4);

  Delphiden anlayan arkadaşlar kodu daha da iyi bir hale getirebilir.Componet'ın içersindeki gereksiz kodları çıkarabilirler.(Lzh, addkey multkey boyut kontrolü.....).Artık gerisi size kalmış.Daha elit olan arkadaşlar Harddisk nosunu elde etmek için DeviceIoControl'u kullanabilirler.Off be amma uzun yazı oldu.Keygenin hazır halini download etmek isterseniz buraya tıklayın

Son Notlar

Bu yazıda yazım yanlışları hatta bilgi hatası olabilir.Eğer bir yanlış bulursanız bana email atın düzeltmeye çalışırım.Bir programı eğer gerçekten kullanıyorsanız, programı satın almayı düşünün.Micro$oft programlarını - bırakın satın almayı - kullanmayı bile düşünmeyin.