31 Ağustos 2016 Çarşamba

Time Trial'lı (Süreli Deneme) programların %99'unu nasıl kırarız

Call Flow Yaklaşımı:

Call Flow denilen olay nedir?
*****************************
Herhangi bir program çalıştırıldığında, bir seri fonksiyon, prosedür 
ve açıklamalardan (hem prosedürler hem de fonksiyonlar açıklamalardan 
oluşan, zaman ve yerden kazanmak için oluşturulmuş guruplardır) geçer. 
Call Flow dediğimiz olgu ise bir programın çalıştırıldıktan 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. Şimdi aşağıdaki hayali 6 prosedürü inceleyelim:

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ürleri kullanarak, Time Trial (zamana bağlı demo) korumalı bir
programın yaklaşık olarak ortaya çıkacak asm kodu şöyle 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) 

Eğer yukarıdaki koda bakacak olursanız programın çalışma şekli 
JL emrinden önceki ax ve bx değerlerine dayanıyor. Buradaki problem 
ise şu; büyük bir kodun disassemble edilişinden sonra patchlemek 
için doğru yeri bulmak zor, çünkü bu tür kodlarda bir çok cmp/jl veya 
cmp/jne oluşumları bulunmakta. E peki doğru yeri nasıl bulacağız ?¿

Yama yapılacak doğru yeri bulmak:
*********************************

Yukarıdaki kodu kullanarak ortaya 2 farklı program yolu çıkartabliriz. 
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 bakarsak JL komutuna kadar herşeyin aynı olduğunu görürüz; 
ama JL de ilk liste atlamayı yaparken 2. liste bizi programın sonuna 
getiriyor. JL komutu ax ve bx değerlerine bağlı. Eh Zamana bağlı program 
kilidini kaldırmak içinse bizim yapmamız 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.

Şimdi gidip kendime bir kahve daha yapacağım, bu arada siz de buraya kadar 
olan bölümü bir kere daha gözden geçirin ve kendinizi bu mantığı uygulamak 
için hazır bir konuma getirin; telefonunuzu kapatın, odadaki ışığın 
derecesini kendi rahatınıza göre ayarlayın, istiyorsanız kahve vs gibi 
sizi dinç tutacak birşeyler kapın (programı kırana kadar alkol almak yasak!), 
kapınızı kilitleyin ve şimdi buraya kadar olan bölümü bir kez daha okuyun =;o)

Eveet kahvemi koydum, sigaramı yaktım, cd ye de bi bad religion kondurdum yola 
dewam edebiliriz.

Mantığı kavradık. Şimdi bunu nasıl uygulayabiliriz?
***************************************************

İhtiyacımız olan alet edevat:

SoftIce v4.0 veya v3.23 Symbol Loader i ile birlikte.
Bir hex editörü. (örn: ultra edit)
Bir text editörü. (örn: notepad)
Pratik zeka, beyin, bir parmak, ve azim. (PC'niz olduğunu varsaymak zorundayım) 
(Disassembler a ihtiyacımız yok)

Önce, softice la birlikte install edilmiş olan symbol loader i yükleyin.
Bunu görev çubuğundaki klasörden açabilirsiniz. Symbol Loader'daki file 
menüsüne gidin ve `open module` a tıklayın. Burdan da gidip kırmak istediğiniz 
programın ana çalıştırma dosyasına tıklayın (örn: mirc için mirc32.exe).
Bu hallolduktan sonra `Module` menüsüne gidin ve "Load Module" a tıklayın. 
Normalde bu sizi bir hata mesajıyla karşılayacaktır, `Yes` e tıklayıp yüklemeye 
devam edelim. Şimdi SoftIce, symbol loader nedeniyle araya girecek ve bize 
aşağıdaki gibi birçok satır gösterecektir:

FFFF INVALID
FFFF INVALID
FFFF INVALID
FFFF INVALID
FFFF INVALID
.
.
.

Bunu umursamayın, bu bir hata değil. SoftIce, sadece hafızadaki henüz çözemediği 
bir bölümü gösteriyor. Şimdi SoftIce i yapmak istediğimiz şeye göre ayarlamanın 
zamanı geldi.

Adım 1: Kod penceresini kapa.
*****************************

Softice'ta "wc" yazın. Bu komut kod penceresini kontrol eder. Biz kod penceresinin 
gözükmesini istemiyoruz, o zaman kapalı olmasını bu şekilde sağlayalım. Bunu aynı 
zamanda mouse u kullanarak da yapabiliriz. Kapamak istediğiniz pencerenin üst 
köşesine mouse ile tıklayıp sürükleyebildiğiniz kadar yukarıya sürükleyin, bu 
pencerenin kapanmasını sağlayacaktır.

Adım 2: GeTSystemTime için bir breakpoint koyun.
************************************************

Şimdi GetSystemTime (O anki tarih ve saati göstermek için kullanılan birçok api 
komutundan biri.) için bir breakpoint koymalıyız. Bunu komut penceresinde 
"Bpx GetSystemTime" yazarak sağlıyoruz. -Bu arada, GetSystemTime sadece 
fonksiyonun adresini belirtecek bize. Fonksiyonun adresini bilseydik 
"Bpx 004283CD" gibi bir şey de yazabilirdik. Bu da demek oluyor ki bpx komutuna 
bir offset te ekleyebiliriz; örn: "Bpx GetSystemTime +4". Bu fonksiyonun 
başlangıcından 4 offset sonra softice in devreye gireceğini gösterir.-
Neyse bu örnek için "Bpx GetSystemTime" yazdık.

Adım 3: Programı yüklemeye devam et.
************************************

Softice'ta breakpointi (BPX GetSystemTime) ayarladığımıza göre programın 
yüklenmesine ve çalışmasına devam etmek için izin verme zamanımız geldi. 
Yapmanız gereken CTRL ve D ye tuşlarına basmak. Program yüklenmeye ve çalışmaya 
devam ederken 'GetSystemTime' komutunu işleyecektir. Bu olduğunda, Softice 
belirecek ve programı Fonksiyonun başında durduracaktır. Komut penceresinde ise 
'BPX due to KERNEL32!GetSystemTime' yazısını göreceksiniz. İşte şimdi olayı 
kaydetmeye başlamak için doğru yerdeyiz.

Adım 4: Fonksiyondan çık.
*************************

Şimdi 'GetSystemTime' fonksiyonunun başlangıcındayız. Bu fonksiyonu atlamalıyız 
ki tüm fonksiyon işlendikten hemen sonra yeralan asm komutuna varalım. 
(Not: '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 
herzaman aynı komutları işleyecektir bu yüzden bu komutları kaydetmemize gerek yok.- 
Fonksiyondan hemen sonraki asm komutuna atlamak için yapmamız gereken "F11" tuşuna 
BİR KERE basmak olacaktır. (birkere bastın di mi?, aferim...) İşte işler bu noktadan 
itibaren ilginç bir hal almaya başladı...

Adım 5: Nag ekranına kadar tüm komutları kaydet.
************************************************

Şimdi herşeyi kaydetmenin sırası geldi. Yapmanız gereken; `Programı kullanabilmek 
için % gününüz kaldı` txtini içeren Nag Ekranı çıkana kadar F10 tuşuna basarak 
kodun içinde adım adım ilerlemeniz. Dikkat ederseniz komut penceresinde işlenen 
tüm kodun belireceğini görürsünüz. Tüm bu bilgi Softice Buffer'ında kaydediliyor. 

Adım 6: Log dosyasını kaydedelim:
*********************************

Nag ekranı çıktığında, ilk log dosyamızı kaydetmenin zamanı geldi demektir. 
Yapmanız gereken hala yüklü olan Softice Symbol Loader a giderek File menüsünden 
`Save softice history as...` e tıklamak. Şimdi bu dosyayı asa1.txt diye kaydettik. 
Bu dosyayı bir text editörle açacak olursanız komut penceresindeki tüm olanların 
kaydedilmiş olduklarını göreceksiniz. Bu bizim "İlk Call Flow" dosyamız.
Olayı kaptın ha d;)=

Adım 7: Tairihi ileriye al ve herşeyi yeniden yap.
**************************************************

Şimdi yapmamız gereken 2. bir call flow logu hazırlamak, ama bu sefer 
sistemimizin tarihini ileriye almalıyız ki o mide bulandırıcı "Deneme Süreniz 
Sona Erdi, Bayılın Bakalım Parayı..." mesajını görebilelim. Bu, programımızın 
'GetSystemTime' fonksiyonundan sonra ama Nag ekranı çıkmadan önce farklı bir 
yol izlemesine neden olacaktır.

Adım 8: 2 Log dosyasını karşılaştır.
************************************

Tüm adımları tekrarladıktan ve 2. log dosyasını (örn:asa2.txt) kaydettikten 
sonra bunları karşılaştırma zamanı geldi demektir. Aşağıda, sıkı korunulduğu! 
söylenen bir Micro$oft programını kullanarak ortaya çıkan 2 örnek logu ekledim: 

1. LOG DOSYASI. ( Deneme için % gününüz kaldı )
***************

Break due to BPX KERNEL32!GetSystemTime (ET=33.15 milliseconds)
Break due to G (ET=383.02 microseconds)
015F:78026B90 663B0512870378 CMP AX,[78038712]
015F:78026B97 756B JNZ 78026C04 (JUMP )
015F:78026C04 8D8534FFFFFF LEA EAX,[EBP-00CC]
015F:78026C0A 50 PUSH EAX
015F:78026C0B FF1540D10278 CALL [KERNEL32!GetTimeZoneInformation]
015F:78026C11 83F8FF CMP EAX,-01
015F:78026C14 7430 JZ 78026C46 (NO JUMP)
015F:78026C16 83F802 CMP EAX,02
015F:78026C19 7527 JNZ 78026C42 (NO JUMP)
015F:78026C1B 66837DCE00 CMP WORD PTR [EBP-32],00
015F:78026C20 7420 JZ 78026C42 (NO JUMP)
015F:78026C22 837DDC00 CMP DWORD PTR [EBP-24],00
015F:78026C26 741A JZ 78026C42 (NO JUMP)
015F:78026C28 6A01 PUSH 01
015F:78026C2A 58 POP EAX
015F:78026C2B 56 PUSH ESI
015F:78026C2C 57 PUSH EDI
015F:78026C2D 8D75E0 LEA ESI,[EBP-20]
015F:78026C30 BF08870378 MOV EDI,78038708
015F:78026C35 A5 MOVSD
015F:78026C36 A5 MOVSD
015F:78026C37 A5 MOVSD
015F:78026C38 A5 MOVSD
015F:78026C39 5F POP EDI
015F:78026C3A A300870378 MOV [78038700],EAX
015F:78026C3F 5E POP ESI
015F:78026C40 EB90 JMP 78026CD2 (JUMP )
015F:78026BD2 50 PUSH EAX
015F:78026BD3 0FB745FC MOVZX EAX,WORD PTR [EBP-04]
015F:78026BD7 50 PUSH EAX
015F:78026BD8 0FB745FA MOVZX EAX,WORD PTR [EBP-06]
015F:78026BDC 50 PUSH EAX
015F:78026BDD 0FB745F8 MOVZX EAX,WORD PTR [EBP-08]
015F:78026BE1 50 PUSH EAX
015F:78026BE2 0FB745F6 MOVZX EAX,WORD PTR [EBP-0A]
015F:78026BE6 50 PUSH EAX
015F:78026BE7 0FB745F2 MOVZX EAX,WORD PTR [EBP-0E]
015F:78026BEB 50 PUSH EAX
015F:78026BEC 0FB745F0 MOVZX EAX,WORD PTR [EBP-10]
015F:78026BF0 50 PUSH EAX
015F:78026BF1 E8EE000000 CALL 78026CE4
015F:78026BF6 8B4D08 MOV ECX,[EBP+08]
015F:78026BF9 83C41C ADD ESP,1C
015F:78026BFC 85C9 TEST ECX,ECX
015F:78026BFE 7402 JZ 78026C02 (NO JUMP)
015F:78026C00 8901 MOV [ECX],EAX
015F:78026C02 C9 LEAVE
015F:78026C03 C3 RET
015F:300D2072 83C404 ADD ESP,04
015F:300D2075 8D4C2410 LEA ECX,[ESP+10]
015F:300D2079 51 PUSH ECX
015F:300D207A FF15B4841030 CALL [301084B4]
015F:300D2080 83C404 ADD ESP,04
015F:300D2083 8BF0 MOV ESI,EAX
015F:300D2085 8D54243C LEA EDX,[ESP+3C]
015F:300D2089 B909000000 MOV ECX,00000009
015F:300D208E 8D7C2418 LEA EDI,[ESP+18]
015F:300D2092 8D442418 LEA EAX,[ESP+18]
015F:300D2096 52 PUSH EDX
015F:300D2097 50 PUSH EAX
015F:300D2098 F3A5 REPZ MOVSD
015F:300D209A E8E1FDFFFF CALL 300D1E80
015F:300D209F 83C408 ADD ESP,08
015F:300D20A2 85C0 TEST EAX,EAX
015F:300D20A4 7E19 JLE 300D20BF (JUMP )
015F:300D20BF 8D442460 LEA EAX,[ESP+60]
015F:300D20C3 8D4C2418 LEA ECX,[ESP+18]
015F:300D20C7 50 PUSH EAX
015F:300D20C8 51 PUSH ECX
015F:300D20C9 E8B2FDFFFF CALL 300D1E80
015F:300D20CE 83C408 ADD ESP,08
015F:300D20D1 85C0 TEST EAX,EAX
015F:300D20D3 7E33 JLE 300D2108 (JUMP )
015F:300D2108 6820D91630 PUSH 3016D920
015F:300D210D E83EFCFFFF CALL 300D1D50
015F:300D2112 83C404 ADD ESP,04
015F:300D2115 85C0 TEST EAX,EAX
015F:300D2117 7410 JZ 300D2129 (JUMP )
015F:300D2129 391D20D91630 CMP [3016D920],EBX
015F:300D212F 0F85D6010000 JNZ 300D230B (JUMP )
015F:300D230B 6A4C PUSH 4C
015F:300D230D 6824D91630 PUSH 3016D924
015F:300D2312 E8E9F9FFFF CALL 300D1D00
015F:300D2317 8B0D20D91630 MOV ECX,[3016D920]
015F:300D231D 83C408 ADD ESP,08
015F:300D2320 3BC1 CMP EAX,ECX
015F:300D2322 0F841DFEFFFF JZ 300D2145 (JUMP )
015F:300D2145 8D542418 LEA EDX,[ESP+18]
015F:300D2149 6848D91630 PUSH 3016D948
015F:300D214E 52 PUSH EDX
015F:300D214F E82CFDFFFF CALL 300D1E80
015F:300D2154 83C408 ADD ESP,08
015F:300D2157 85C0 TEST EAX,EAX
015F:300D2159 7D26 JGE 300D2181 (JUMP )
015F:300D2181 803DA480163003 CMP BYTE PTR [301680A4],03
015F:300D2188 0F876D010000 JA 300D22FB (NO JUMP)
015F:300D218E 8BAC24D0000000 MOV EBP,[ESP+000000D0]
015F:300D2195 C745009F860100 MOV DWORD PTR [EBP+00],0001869F
015F:300D219C A0A4801630 MOV AL,[301680A4]
015F:300D21A1 A801 TEST AL,01
015F:300D21A3 744B JZ 300D21F0 (NO JUMP)
015F:300D21A5 33C0 XOR EAX,EAX
015F:300D21A7 8D4C2418 LEA ECX,[ESP+18]
015F:300D21AB A0A5801630 MOV AL,[301680A5]
015F:300D21B0 51 PUSH ECX
015F:300D21B1 6824D91630 PUSH 3016D924
015F:300D21B6 8D3440 LEA ESI,[EAX*2+EAX]
015F:300D21B9 C1E603 SHL ESI,03
015F:300D21BC E85FFDFFFF CALL 300D1F20
015F:300D21C1 83C408 ADD ESP,08
015F:300D21C4 3BC3 CMP EAX,EBX
015F:300D21C6 0F8C2F010000 JL 300D22FB (NO JUMP)
015F:300D21CC 3BC6 CMP EAX,ESI
015F:300D21CE 7C0A JL 300D21DA (NO JUMP)
015F:300D21D0 BB04000000 MOV EBX,00000004
015F:300D21D5 E9E6000000 JMP 300D22C0 (JUMP )
015F:300D22C0 8B4500 MOV EAX,[EBP+00]
015F:300D22C3 33C9 XOR ECX,ECX
015F:300D22C5 8A0DA9801630 MOV CL,[301680A9]
015F:300D22CB 3BC1 CMP EAX,ECX
015F:300D22CD 7F05 JG 300D22D4 (JUMP )
015F:300D22D4 6A4C PUSH 4C
015F:300D22D6 6824D91630 PUSH 3016D924
015F:300D22DB E820FAFFFF CALL 300D1D00
015F:300D22E0 83C408 ADD ESP,08
015F:300D22E3 A320D91630 MOV [3016D920],EAX
015F:300D22E8 6820D91630 PUSH 3016D920
015F:300D22ED E80EFBFFFF CALL 300D1E00
015F:300D22F2 83C404 ADD ESP,04
015F:300D22F5 85C0 TEST EAX,EAX
015F:300D22F7 8BC3 MOV EAX,EBX
015F:300D22F9 7505 JNZ 300D2300 (JUMP )
015F:300D2300 5F POP EDI
015F:300D2301 5E POP ESI
015F:300D2302 5D POP EBP
015F:300D2303 5B POP EBX
015F:300D2304 81C4BC000000 ADD ESP,000000BC
015F:300D230A C3 RET
015F:3000ADB6 8BF0 MOV ESI,EAX
015F:3000ADB8 83C404 ADD ESP,04
015F:3000ADBB 8D46FF LEA EAX,[ESI-01]
015F:3000ADBE 83F805 CMP EAX,05
015F:3000ADC1 773D JA 3000AE00 (NO JUMP)


2. Log Dosyası. ( Demo sona erdi )
***************

KERNEL32!GetSystemTime
Break due to G (ET=380.57 microseconds)
015F:78026B8C 668B45EA MOV AX,[EBP-16]
015F:78026B90 663B0512870378 CMP AX,[78038712]
015F:78026B97 756B JNZ 78026C04 (JUMP )
015F:78026C04 8D8534FFFFFF LEA EAX,[EBP-00CC]
015F:78026C0A 50 PUSH EAX
015F:78026C0B FF1540D10278 CALL [KERNEL32!GetTimeZoneInformation]
015F:78026C11 83F8FF CMP EAX,-01
015F:78026C14 7430 JZ 78026C46 (NO JUMP)
015F:78026C16 83F802 CMP EAX,02
015F:78026C19 7527 JNZ 78026C42 (NO JUMP)
015F:78026C1B 66837DCE00 CMP WORD PTR [EBP-32],00
015F:78026C20 7420 JZ 78026C42 (NO JUMP)
015F:78026C22 837DDC00 CMP DWORD PTR [EBP-24],00
015F:78026C26 741A JZ 78026C42 (NO JUMP)
015F:78026C28 6A01 PUSH 01
015F:78026C2A 58 POP EAX
015F:78026C2B 56 PUSH ESI
015F:78026C2C 57 PUSH EDI
015F:78026C2D 8D75E0 LEA ESI,[EBP-20]
015F:78026C30 BF08870378 MOV EDI,78038708
015F:78026C35 A5 MOVSD
015F:78026C36 A5 MOVSD
015F:78026C37 A5 MOVSD
015F:78026C38 A5 MOVSD
015F:78026C39 5F POP EDI
015F:78026C3A A300870378 MOV [78038700],EAX
015F:78026C3F 5E POP ESI
015F:78026C40 EB90 JMP 78026CD2 (JUMP )
015F:78026BD2 50 PUSH EAX
015F:78026BD3 0FB745FC MOVZX EAX,WORD PTR [EBP-04]
015F:78026BD7 50 PUSH EAX
015F:78026BD8 0FB745FA MOVZX EAX,WORD PTR [EBP-06]
015F:78026BDC 50 PUSH EAX
015F:78026BDD 0FB745F8 MOVZX EAX,WORD PTR [EBP-08]
015F:78026BE1 50 PUSH EAX
015F:78026BE2 0FB745F6 MOVZX EAX,WORD PTR [EBP-0A]
015F:78026BE6 50 PUSH EAX
015F:78026BE7 0FB745F2 MOVZX EAX,WORD PTR [EBP-0E]
015F:78026BEB 50 PUSH EAX
015F:78026BEC 0FB745F0 MOVZX EAX,WORD PTR [EBP-10]
015F:78026BF0 50 PUSH EAX
015F:78026BF1 E8EE000000 CALL 78026CE4
015F:78026BF6 8B4D08 MOV ECX,[EBP+08]
015F:78026BF9 83C41C ADD ESP,1C
015F:78026BFC 85C9 TEST ECX,ECX
015F:78026BFE 7402 JZ 78026C02 (NO JUMP)
015F:78026C00 8901 MOV [ECX],EAX
015F:78026C02 C9 LEAVE
015F:78026C03 C3 RET
015F:300D2072 83C404 ADD ESP,04
015F:300D2075 8D4C2410 LEA ECX,[ESP+10]
015F:300D2079 51 PUSH ECX
015F:300D207A FF15B4841030 CALL [301084B4]
015F:300D2080 83C404 ADD ESP,04
015F:300D2083 8BF0 MOV ESI,EAX
015F:300D2085 8D54243C LEA EDX,[ESP+3C]
015F:300D2089 B909000000 MOV ECX,00000009
015F:300D208E 8D7C2418 LEA EDI,[ESP+18]
015F:300D2092 8D442418 LEA EAX,[ESP+18]
015F:300D2096 52 PUSH EDX
015F:300D2097 50 PUSH EAX
015F:300D2098 F3A5 REPZ MOVSD
015F:300D209A E8E1FDFFFF CALL 300D1E80
015F:300D209F 83C408 ADD ESP,08
015F:300D20A2 85C0 TEST EAX,EAX
015F:300D20A4 7E19 JLE 300D20BF (JUMP )
015F:300D20BF 8D442460 LEA EAX,[ESP+60]
015F:300D20C3 8D4C2418 LEA ECX,[ESP+18]
015F:300D20C7 50 PUSH EAX
015F:300D20C8 51 PUSH ECX
015F:300D20C9 E8B2FDFFFF CALL 300D1E80
015F:300D20CE 83C408 ADD ESP,08
015F:300D20D1 85C0 TEST EAX,EAX
015F:300D20D3 7E33 JLE 300D2108 (JUMP )
015F:300D2108 6820D91630 PUSH 3016D920
015F:300D210D E83EFCFFFF CALL 300D1D50
015F:300D2112 83C404 ADD ESP,04
015F:300D2115 85C0 TEST EAX,EAX
015F:300D2117 7410 JZ 300D2129 (JUMP )
015F:300D2129 391D20D91630 CMP [3016D920],EBX
015F:300D212F 0F85D6010000 JNZ 300D230B (JUMP )
015F:300D230B 6A4C PUSH 4C
015F:300D230D 6824D91630 PUSH 3016D924
015F:300D2312 E8E9F9FFFF CALL 300D1D00
015F:300D2317 8B0D20D91630 MOV ECX,[3016D920]
015F:300D231D 83C408 ADD ESP,08
015F:300D2320 3BC1 CMP EAX,ECX
015F:300D2322 0F841DFEFFFF JZ 300D2145 (JUMP )
015F:300D2145 8D542418 LEA EDX,[ESP+18]
015F:300D2149 6848D91630 PUSH 3016D948
015F:300D214E 52 PUSH EDX
015F:300D214F E82CFDFFFF CALL 300D1E80
015F:300D2154 83C408 ADD ESP,08
015F:300D2157 85C0 TEST EAX,EAX
015F:300D2159 7D26 JGE 300D2181 (JUMP )
015F:300D2181 803DA480163003 CMP BYTE PTR [301680A4],03
015F:300D2188 0F876D010000 JA 300D22FB (NO JUMP)
015F:300D218E 8BAC24D0000000 MOV EBP,[ESP+000000D0]
015F:300D2195 C745009F860100 MOV DWORD PTR [EBP+00],0001869F
015F:300D219C A0A4801630 MOV AL,[301680A4]
015F:300D21A1 A801 TEST AL,01
015F:300D21A3 744B JZ 300D21F0 (NO JUMP)
015F:300D21A5 33C0 XOR EAX,EAX
015F:300D21A7 8D4C2418 LEA ECX,[ESP+18]
015F:300D21AB A0A5801630 MOV AL,[301680A5]
015F:300D21B0 51 PUSH ECX
015F:300D21B1 6824D91630 PUSH 3016D924
015F:300D21B6 8D3440 LEA ESI,[EAX*2+EAX]
015F:300D21B9 C1E603 SHL ESI,03
015F:300D21BC E85FFDFFFF CALL 300D1F20
015F:300D21C1 83C408 ADD ESP,08
015F:300D21C4 3BC3 CMP EAX,EBX
015F:300D21C6 0F8C2F010000 JL 300D22FB (NO JUMP)
015F:300D21CC 3BC6 CMP EAX,ESI
015F:300D21CE 7C0A JL 300D21DA (JUMP )
015F:300D21DA 2BF0 SUB ESI,EAX
015F:300D21DC B8ABAAAA2A MOV EAX,2AAAAAAB
015F:300D21E1 F7EE IMUL ESI
015F:300D21E3 C1FA02 SAR EDX,02
015F:300D21E6 8BC2 MOV EAX,EDX
015F:300D21E8 C1E81F SHR EAX,1F
015F:300D21EB 03D0 ADD EDX,EAX
015F:300D21ED 895500 MOV [EBP+00],EDX
015F:300D21F0 F605A480163002 TEST BYTE PTR [301680A4],02
015F:300D21F7 0F84B3000000 JZ 300D22B0 (JUMP )
015F:300D22B0 B909000000 MOV ECX,00000009
015F:300D22B5 8D742418 LEA ESI,[ESP+18]
015F:300D22B9 BF48D91630 MOV EDI,3016D948
015F:300D22BE F3A5 REPZ MOVSD
015F:300D22C0 8B4500 MOV EAX,[EBP+00]
015F:300D22C3 33C9 XOR ECX,ECX
015F:300D22C5 8A0DA9801630 MOV CL,[301680A9]
015F:300D22CB 3BC1 CMP EAX,ECX
015F:300D22CD 7F05 JG 300D22D4 (JUMP )
015F:300D22D4 6A4C PUSH 4C
015F:300D22D6 6824D91630 PUSH 3016D924
015F:300D22DB E820FAFFFF CALL 300D1D00
015F:300D22E0 83C408 ADD ESP,08
015F:300D22E3 A320D91630 MOV [3016D920],EAX
015F:300D22E8 6820D91630 PUSH 3016D920
015F:300D22ED E80EFBFFFF CALL 300D1E00
015F:300D22F2 83C404 ADD ESP,04
015F:300D22F5 85C0 TEST EAX,EAX
015F:300D22F7 8BC3 MOV EAX,EBX
015F:300D22F9 7505 JNZ 300D2300 (JUMP )
015F:300D2300 5F POP EDI
015F:300D2301 5E POP ESI
015F:300D2302 5D POP EBP
015F:300D2303 5B POP EBX
015F:300D2304 81C4BC000000 ADD ESP,000000BC
015F:300D230A C3 RET
015F:3000ADB6 8BF0 MOV ESI,EAX
015F:3000ADB8 83C404 ADD ESP,04
015F:3000ADBB 8D46FF LEA EAX,[ESI-01]
015F:3000ADBE 83F805 CMP EAX,05
015F:3000ADC1 773D JA 3000AE00 (JUMP )


Adım 9: 2 log dosyasının farklılaştığı ilk noktayı bul.
*******************************************************

Dikkat ettiyseniz her iki log dosyası da 015F:3000ADC1 adresine kadar aynı. 
İlk dosyada, bu adresteki komut atlama yapmıyor, ama ikinci dosyada ise 
aynı komut atlamayı yaptırıyor. Bu, o noktadaki EAX in değerinin sistem 
zamana bağlı olarak aldığı değişiklikten kaynaklanıyor. 
Şu üç satır kod a bi gözatın: 

LEA EAX,[ESI-01] Bu ESI-01 deki byte a bakıp değeri EAX e koyuyor.
CMP EAX,05 Bu 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.


Adım 10: Şimde ne yapılacak?
****************************

JA komutunun atlama yapmaması için dosyayı değiştirmeliyiz. Bunu bir çok yolla 
yapabiliriz. 
Basit ve ucuz olan yol; 015F:3000ADC1 adresindeki `77 3D` değerlerini `90 90` 
olarak değiştirerek "JA 3000AE00" komutunu noplamak (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'ı değiştirmiş olmanızı 
sağlayacaktır. 

Adım 11: Programı yamalamak. (Patchin' olayı)
*********************************************

Şimdi geriye kalan, sadece programı en sevdiğiniz Hex editörünüze yükleyip 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ştirin

B805000000 = MOV EAX,05
90 = NOP


Text Sonu Notları.
******************

"Call Flow Metodu" olarak anılan bu crackin' yönteminin, 2 ayrı yol izlenen bir çok olayda 
da kullanılabilme imkanı vardır.
Örnek olarak:
CRC rutinlerini kırmak için (Program modifiye edilmiş/edilmemiş)
Dongle koruması (Dongle plugged in/not plugged in)
Üç deneme ve password soru alanının dışındasın (Sizin bir fonksiyonu sadece belli bir 
sayıda kullanabilmenizi sağlayan programlar)

Umarım bu txt birilerine yardımcı olmamı sağlamıştır

Hiç yorum yok:

Yorum Gönder