Crack Nasıl Yapılır ? - Part-II |
11-28-2007 | #1 |
RaHaTSiZ
|
Crack Nasıl Yapılır ? - Part-II235 Girilen değerlerin okutulması Kayıt ekranında üç tane girdi olduğu için program bunları teker teker okuyacak ve kendi gerçek seri numarası ile verilen seri numarasını karşılaştıracaktır Bu nedenle, Soft-ICE’ta iken x yazılıp enter’a basılacaktır Sonra bir kez daha x yazıp entere basılacak, böylelikle girilen isim ve şirket kısımları programa okutulmuş olur Bundan sonra program artık registerlar aracılığıyla bu bilgileri değişik hesaplardan geçirecek ve kodu hesaplayarak sonradan girilen kod ile karşılaştıracaktır Soft-ICE’ta şu şekilde bir ekran çıkacaktır [4] : USER32!GetWindowTextA BFF51804 B1B2 MOV CL,B2 BFF51806 55 PUSH EBP 236 Gerçek seri numarasının bulunması Burada iken bc 0 ile koyulan breakpoint temizlenir Şimdi bu kod takip edilerek gerçek serial bulunmaya çalışılır Kodları adım adım izlemek için F10 tuşuna basılır Alt tarafta o an hangi exe veya dll’nin çalıştığı yazmaktadır Hala Teleport Pro verilen bilgileri okuduğundan şu noktaya gelinceye kadar F10 a basılır [4] * Reference To: USER32GetWindowTextA, Ord:013Fh :0044A950 FF15C0434600 Call dword ptr [004643C0] :0044A956 8B4D10 mov ecx, dword ptr [ebp+10] :0044A959 6AFF push FFFFFFFF :0044A95B E83793FFFF Call 00443C97 :0044A960 EB0B jmp 0044A96D 00444A95B deki çağrı (call) nın F8 ile içine girilebilir ancak çağrıların ardından conditional jump yani "je" "jne" gibi kodlar yoksa bu çağrılar F10 ile izlenebilir F10 ile kod izlendiğinde şu noktaya gelinir [4] : 0042472D C6415C01 mov [ecx+5C], 01 :00424731 E958FFFFFF jmp 0042468E :00424736 B8981F4600 mov eax, 00461F98 :0042473B E8B0610000 call 0042A8F0 :00424740 51 push ecx :00424741 51 push ecx :00424742 53 push ebx :00424743 56 push esi :00424744 57 push edi :00424745 8BF9 mov edi, ecx :00424747 6A01 push 00000001 :00424749 E8F1DE0100 call 0044263F :0042474E 33DB xor ebx, ebx :00424750 6A0A push 0000000A :00424752 53 push ebx :00424753 FFB7DD000000 push dword ptr [edi+000000DD] ;Seriali edi+dd ye tek tek yaz :00424759 E852700000 call 0042B7B0 :0042475E 8B0D9C1A4800 mov ecx, dword ptr [00481A9C] :00424764 83C40C add esp, 0000000C :00424767 8945EC mov dword ptr [ebp-14], eax :0042476A 3899CD020000 cmp byte ptr [ecx+000002CD], bl :00424770 0F841B020000 je 00424991 Bu noktada yani xx:00424753 de iken d edi+dd yazılırsa data penceresinde EC 25 A3 00 görülür Eğer d A325EC yazılırsa data penceresinde sonradan girilen '7777777' şeklindeki kod görülür Dword ptr, programın verilen Serial’ı byte byte alarak belirtilen belleğe yerleştirmesi anlamındadır Bu yüzden testen işlem yapılarak girilen koda ulaşıldı Kod izlenmeye devam edildiğinde şu noktaya gelinir [4] : * Possible StringData Ref from Data Obj ->"User" :00424778 BED0B74700 mov esi, 0047B7D0 :0042477D 0F840B010000 je 0042488E :00424783 FFB7D5000000 push dword ptr [edi+000000D5] ;Kullanıcı ismini belleğe yerleştir :00424789 E894090000 call 00425122 :0042478E 3945EC cmp dword ptr [ebp-14] ; Eax ile gerçek kodu karşılaştır :00424791 59 pop ecx :00424792 753A jne 004247CE ;Kod doğru değil :00424794 8D4DF0 lea ecx, dword ptr[ebp-10];Kod doğru :00424797 E8B2EF0100 call 0044374E * Possible Reference to String Resource ID=07076: "Thank you! Your copy of Teleport Pro is now registered", 237 Programın register edilmesi Bu noktada yapılması gereken tek işlem :0042478E yi F10 ile geçtikten sonra (yani program o bölgeyi çalıştırdıktan sonra) ? eax yazmaktır Bu yazıldığında 1458171568 görülür Bu, gerçek seri numarasıdır Soft-ICE tan çıkıldıktan sonra, Name= Turgut Günata Company =turgutgunata Serial = 1458171568 yazıp program kayıtlanır Bu işlemlerin gerçekleştirilmesi için Soft-ICE konusunda bilgi sahibi olmak gerekmektedir 238 Programın seri numarasının hesaplanışı Programın serial’ının nasıl hesaplandığını görmek için 00424789 deki call a F8 ile girilebilir Hesaplama şu şekilde gerçekleşmektedir İlk başta isim en az 5 karakter mi diye bakılıp, daha sonra boydan 4 çıkartılır ve 4 karakterden sonraki her karakter 5DFEE4A4H ile xor edilip toplanır Assembly de yazılacak olursa, kod şu şekilde olur [4,5] : mov edi, offset szName ; İsmi edi ye yolla push edi call lstrlen ; Listele cmp eax, 5 ; 5 ten düşükse işlemi durdur jl ExitProc0 add eax, -4 ; 4 çıkart xor ebx, ebx ; ebx i sıfırla lea edi, szName ; İsmi al mov esi, 5DFEE4A4H ; Numarayı esi ye yolla Hesapla: cmp ebx, eax ; Sona gelindi mi ? jae Goster xor esi, [edi+ebx] ; Değilse Xor la inc ebx ; Ebx i artır jmp Hesapla Goster: mov eax,esi ; Serial eax 'ta 3 TIME TRIAL’LI PROGRAMLARDAN ZAMAN KISITLAMASININ KALDIRILMASI Süreli programlar, program kodunda kullanım süresinin kısıtlanması sayesinde, belirtilen süre dolduğunda (30 gün, 90 gün) çalışmayan programlardır Özellikle dergilerin verdiği CD'lerdeki programlar bu şekildedir Bu tür bir korumanın konulmasındaki amaç, ticaridir ve programın bu süre içinde tanıtılması ve satın alınmasını amaçlar Burada, zaman kısıtlamasının kaldırılması örnek bir program üzerinde bilinmesi gereken yöntemler ve tüm aşamalarıyla birlikte gösterilmektedir: 31 Call Flow Yaklaşımı: Herhangi bir program çalıştırıldığında, bir seri fonksiyon, prosedür ve açıklamalardan geçer Call Flow denilen olgu ise bir programın çalıştırılmasından sonra izlediği yolun bir listesi ya da diyagramına verilen addır Bu yol, programın çalıştırıldığı zamandaki koşullar nedeniyle farklılıklar gösterebilir Aşağıda verilen 6 basamak incelenmelidir [6] : 1) GetSystemTime (Sistem zamanını kontrol eder) 2) Installed (Programın ne zaman yüklendiğini kontrol eder) 3) Expired (Deneme süresinin bittiğini belirten bir mesajı gösterir) 4) DaysLeft ("Programı denemek için % gününüz kaldı" mesajını gösterir) 5) Halt (Programdan çıkar) 6) Main (Ana program) Bu prosedürler kullanılarak, Time Trial (zamana bağlı demo) korumalı bir programın asm kodu aşağıdaki gibi olacaktır: 00000001 : Call GetSystemTime 00000002 : Call Installed 00000003 : if (GetSystemTime - Installed) eğer 30 günden fazlaysa 00000004 : Call Expired, 00000005 : Jmp Halt 00000006 : 30 günden fazla değilse 00000007 : Call DaysLeft, 00000008 : Jmp Main Gerçek bir kodu incelediğimizde işe şuna benzer: Call 041829B0 (GetSystemTime) Call 0492832C (Installed) Cmp Ax,Bx (if koşulu) JL 04927435 (ax ve bx değerlerine göre Jump ya da No Jump) Call 04348234 (Expired=deneme süresi sona erdi) Jmp 0432833C (Halt=programdan çık) ---JL Address--- Call 04583BC0 (Kalan gün mesajı) Jmp 042392BC (Ana Program) Yukarıdaki kod incelenecek olursa, programın çalışma şekli JL emrinden önceki ax ve bx değerlerine dayanmaktadır Buradaki problem ise büyük bir kodun disassemble edilişinden sonra patchlemek için doğru yeri bulmanın zor olmasıdır, çünkü bu tür kodlarda bir çok cmp / jl veya cmp / jne oluşumları bulunmaktadır [6] 311 Yama yapılacak doğru yeri bulmak: Yukarıdaki kodu kullanarak ortaya 2 farklı program yolu çıkartılabilir Hala 30 günlük deneme süresi içindeyken, programın takip ettiği yol şuna benzeyecektir: GetSystemTime Installed Cmp ax,bx JL (Jump) DaysLeft Main Deneme süresi sona erdiğinde ise kod şuna benzeyecektir: GetSystemTime Installed Cmp ax,bx JL ( No Jump ) Expired Halt Bu iki listeye bakılırsa, JL komutuna kadar herşeyin aynı olduğu görülür; ama JL de ilk liste atlamayı yaparken 2 liste bizi programın sonuna getirmektedir JL komutu ax ve bx değerlerine bağlı durumdadır Zamana bağlı program kilidini kaldırmak içinse yapılması gereken ya ax ve bx in değerlerini değiştirerek (doğru yöntem) sürekli bir deneme süresine sahip olmak ya da JL komutunu Jmp komutu ile değiştirip programın ilk call flow’daki gibi çalışmasını sağlamak olacaktır [6] 312 Crack işlemi için ihtiyaç duyulacak dökümanlar: - Soft-ICE (Symbol Loader ı ile birlikte) - Bir Hex Editörü (örn: Ultra Edit) - Bir Text Editörü (örn: Notepad) (Disassembler’a ihtiyaç duyulmamaktadır) 313 Crack işleminin aşamaları Önce, Soft-ICE’la birlikte install edilmiş olan symbol loader yüklenir Bu görev çubuğundaki klasörden açılabilir Symbol Loader'daki file menüsüne gidip `open module` a tıklanır Buradan da kırılmak istenen programın ana çalıştırma dosyasına tıklanır (örn: mirc için mirc32exe) Bu işlem tamamlandıktan sonra `Module` menüsüne gidilerek "Load Module" a tıklanır Normalde bu bir hata mesajıyla gelecektir, `Yes` e tıklayıp yüklemeye devam edilir Şimdi Soft-ICE, Symbol Loader nedeniyle araya girecek ve aşağıdakine benzer birçok satır görüntülenecektir FFFF INVALID FFFF INVALID FFFF INVALID FFFF INVALID FFFF INVALID Bu bir hata değildir Soft-ICE, sadece hafızadaki henüz çözemediği bir bölümü göstermektedir Şimdi Soft-ICE, yapılmak istenen işleme göre ayarlanmalıdır [6] 3131 Kod penceresinin kapatılması Soft-ICE'ta "wc" yazılır Bu komut kod penceresini kontrol eder Kod penceresinin gözükmesi istenmediğinden, bu şekilde kapatılır Bu aynı zamanda mouse kullanılarak da yapılabilir Kapatılmak istenen pencerenin üst köşesine mouse ile tıklayıp sürüklenebildiği kadar yukarıya sürüklendiğinde, bu pencere kapanacaktır [6] 3132 GeTSystemTime için breakpoint konulması GetSystemTime (O anki tarih ve saati göstermek için kullanılan birçok api komutundan birisidir) için bir breakpoint konulmalıdır Bu, komut penceresinde "Bpx GetSystemTime" yazılarak sağlanır Bu arada, GetSystemTime sadece fonksiyonun adresini belirtir Fonksiyonun adresi bilinse, "Bpx 004283CD" gibi bir satır da yazılabilirdi Bu durumda bpx komutuna bir offset de eklenebildiği görülüyor; örn: "Bpx GetSystemTime +4" teki gibi Bu komut, fonksiyonun başlangıcından 4 offset sonra Soft-ICE’ın devreye gireceğini gösterir [6] 3133 Programın yüklenmeye devam edilmesi Soft-ICE'ta breakpoint (BPX GetSystemTime) ayarlandığına göre programın yüklenmesine ve çalışmasına devam etmek için izin verme zamanı geldi Yapılması gereken CTRL+D tuşlarına basmaktır Program yüklenmeye ve çalışmaya devam ederken 'GetSystemTime' komutunu işleyecektir Bu olduğunda, Soft-ICE belirecek ve programı fonksiyonun başında durduracaktır Komut penceresinde ise 'BPX due to KERNEL32!GetSystemTime' yazısı görülecektir Burası olayın kaydedilmeye başlanması gereken yerdir [6] 3134 Fonksiyondan çıkılması Şimdi 'GetSystemTime' fonksiyonunun başlangıcında bulunuluyor Bu fonksiyon atlamalıdır ki tüm fonksiyon işlendikten hemen sonra yer alan asm komutuna varılsın ('GetSystemTime' fonksiyonu Windows System dizininde bulunan Kernel32dll'nin bir parçasıdır) Bu fonksiyon bilgisayarın o anki durumundan bağımsız olarak her zaman aynı komutları işleyecektir, bu yüzden bu komutların kaydedilmesine gerek yoktur Fonksiyondan hemen sonraki asm komutuna atlamak için yapılması gereken "F11" tuşuna bir kez basmak olacaktırBu noktadan sonra yapılacak işlemlerde dikkatli olmak gerekmektedir[6] 3135 Nag ekranına kadar tüm komutların kaydedilmesi Bu noktada yapılan herşeyin kaydedilmesi gerekmektedir Yapılması gereken; `Programı kullanabilmek için % gününüz kaldı` text’ini içeren Nag Ekranı çıkana kadar F10 tuşuna basarak kodun içinde adım adım ilerlemektir Dikkat edilirse, komut penceresinde işlenen tüm kodun belireceği görülür Tüm bu bilgiler Soft-ICE Buffer'ında kaydedilmektedir [6] 3136 Log dosyasının kaydedilmesi Nag ekranı çıktığında, ilk log dosyasını kaydetmenin zamanı gelmiştir Yapılması gereken hala yüklü olan Soft-ICE Symbol Loader’a giderek File menüsünden `Save Soft-ICE history as` e tıklamaktır Şimdi bu dosya, asa1txt diye kaydedilecektir Bu dosya bir text editörle açılacak olursa, komut penceresindeki tüm olanların kaydedilmiş oldukları görülecektir [6] Bu, ilk “ Call Flow ” dosyasıdır 3137 Tarihi ileriye alıp tüm işlemlerin tekrarlanması Şimdi yapılması gereken 2 bir call flow logu hazırlamaktır, ancak bu sefer sistemin tarihi ileriye alınmalıdır ki, "Deneme Süreniz Sona Erdi" mesajı görülebilsin Bu, programımızın 'GetSystemTime' fonksiyonundan sonra fakat Nag ekranı çıkmadan önce farklı bir yol izlemesine neden olacaktır [6] 3138 İki Log dosyasının karşılaştırılması Tüm adımlar tekrarlandıktan ve 2 log dosyası (örn:asa2txt) kaydedildikten sonra iki log dosyasını karşılaştırmak gerekir Burada iyi korunulduğu söylenen bir Microsoft programını kullanarak ortaya çıkan 2 tane örnek log dosyası üzerinde açıklama yapılacaktır[6] Bu iki log dosyası, Ek-A'ya konulmuştur 3139 İki log dosyasının farklılaştığı ilk noktanın bulunması Dikkat edilirse her iki log dosyası da 015F:3000ADC1 adresine kadar aynıdır İlk dosyada, bu adresteki komut atlama yapmıyor, fakat ikinci dosyada aynı komut atlamayı yaptırıyor Bu, o noktadaki EAX in değerinin sistem zamanına bağlı olarak aldığı değişiklikten kaynaklanıyor Aşağıdaki kod satırları incelenmelidir: LEA EAX,[ESI-01] Bu komut, ESI-01’deki byte’a bakıp değeri EAX’e koyuyor CMP EAX,05 Bu komut, EAX’teki değerin 5’e eşit olup olmadığına bakıyor JA 3000AE00 Eğer değer 5'ten büyükse 300AE00 adresine atla komutu 31310 Dosyada değişiklikler yapılması JA komutunun atlama yapmaması için dosya değiştirilmelidir Bu bir çok yolla yapılabilir: Basit ve ucuz olan yol; 015F:3000ADC1 adresindeki `77 3D` değerlerini `90 90` olarak değiştirerek "JA 3000AE00" komutunu nop lamaktır (No Operation) Bu yol çoğu zaman işe yarasa da, doğru yol 3 byte uzunluğunda olan 'LEA EAX,[ESI-01]', yine 3 byte uzunluğunda olan 'CMP EAX,05' ve 2 byte uzunluğunda olan `JA` (3 asm kodu için toplam 8 byte etti) komutlarını; 5 byte uzunluğundaki 'MOV EAX,00000005' ve birer byte uzunluklarındaki 3 `NOP` komutuyla değiştirmek olacaktır Bu, EAX kaydının herzaman doğru değere sahip olmasını ve aynı sayıda byte'ın değiştirilmiş olmasınısağlayacaktır [6] 31311 Programı yamalamak (Patching olayı) Artık yapılması gereken, programı istenilen bir Hex editörüne yükleyerek log dosyasında LEA, CMP ve JA komutları için bulunan byte gurubunu arayıp yamamak olacaktır Bu örnek için; '8D46FF83F805773D' yi 'B805000000909090' ile değiştirir B805000000 = MOV EAX,05 90 = NOP "Call Flow Metodu" olarak anılan bu cracking yönteminin, 2 ayrı yol izlenen bir çok olayda da kullanılabilme imkanı vardır Örnek : - CRC rutinlerini kırmak için (Program modifiye edilmiş/edilmemiş) ; - Dongle korumasının (Dongle plugged in/not plugged in) kaldırılması ; - Üç deneme ve password soru alanının dışındasın (Sizin bir fonksiyonu sadece belli bir sayıda kullanabilmenizi sağlayan programlar) şeklindeki kısıtlamaların kaldırılması için kullanılır [5,6] ------------------------------------------------- 4 CD KORUMASININ KALDIRILMASI Programlardaki koruma tiplerinden bir tanesi de, CD sürücüde CD olup olmadığını kontrol eden koruma tipleridir Bu koruma, genelde oyun programlarında kullanılır Program bilgisayara install edilmesine(yüklemesine) rağmen, her kullanımda CD ister Bu tür korumaları kaldırılmasının aşamaları, örnek bir program üzerinde gösterilmektedir: 41 Kırılacak Program Hedef Program: Herhangi bir oyun programı 42 Kırılımı Gerçekleştirecek Program Kırılımında Kullanılacak Araçlar: W32Dasm ve HIEW 43 Programın Kırılım Aşamaları Programın kırılımı, yedi aşamada gerçekleşmiştir Bu aşamalar: 431 Programı CD’siz çalıştırarak hata mesajının alınması Öncelikle, kırılacak oyun programı CD takılmadan çalıştırılır Bu durumda, oyun çalışmayıp, ekrana hata mesajı veren bir pencere çıkacaktır Programın kırılmasında bu hata mesajından faydalanılacaktır, bu nedenle hatırlanması gerekmektedir [7] 432 W32Dasm programında kırılacak programın çağrılması Daha sonra, W32Dasm disassembler’ı çalıştırılır Disassembler ekranı açıldığında, Toolbar üzerinde sol tarafta bulunan ilk küçük butona basılır ya da menülerden - Open File to Disassemble – bölümüne gelinir Açılan menüde kırılmak istenen exe program seçilir Disassemble işlemi yaklaşık 5 dakika sürecektir Bu işlem tamamlandığında ekrana programın assembly kodu gelecektir [7] |
|