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