Cracking – III

 


1.      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:


3.1. 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].


3.1.1. 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].


3.1.2. 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.)


3.1.3. 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 mirc32.exe). 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].
3.1.3.1. 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].


3.1.3.2.  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].


3.1.3.3. 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].


3.1.3.4. 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 Kernel32.dll’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ır.Bu noktadan sonra yapılacak işlemlerde dikkatli olmak gerekmektedir[6].

3.1.3.5. 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].


3.1.3.6. 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, asa1.txt 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.


3.1.3.7.  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].


3.1.3.8. İki Log dosyasının karşılaştırılması.


Tüm adımlar tekrarlandıktan ve 2. log dosyası (örn:asa2.txt) 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.


3.1.3.9. İ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.


3.1.3.10. 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].


3.1.3.11. 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


belgesi-609

Belgeci , 2422 belge yazmış

Cevap Gönderin