ClipCache 2.19

http://www.xrayz.demon.co.uk

SoftICE 3.24
W32Dasm 8.93

oleh

CHuPaCaBRa

 

Pengenalan Program

ClipCache adalah program yang dapat meningkatkan kemampuan Clipboard yang dimiliki oleh Windows dengan menyimpan isi Clipboard setiap kali terjadi perubahan. Dengan demikian user dapat menggunakan isi Clipboard berkali - kali tanpa perlu takut isi Clipboard tersebut berubah atau hilang.

Program ini adalah program Shareware yang berlaku legal selama 30 hari, dan selama waktu itu, setiap kali program dijalankan akan keluar sebuah "nag message" yang mengingatkan user untuk membeli program tersebut. Bagi user yang telah membeli serial number, dapat memasukan s/n yang dimilikinya ke dalam Registration Box yang terletak pada menu Help.

 

Essay

Karena aku ngak pernah membeli s/n untuk program ini, makanya aku ngak tau bentuk ato format s/n yang tepat, yang harus dimasukan. Karena itu, aku masukan sembarang s/n : '123454321'. Sebelum menekan tombol Register, pasang Breakpoint di GetWindowTextA.

Setelah menekan tombol Register, kamu akan "terperangkap" di dalam SoftICE, tepatnya pada fungsi GetWindowTextA. Keluar dari fungsi itu dengan menekan tombol F12 dan kamu akan meliat baris - baris perintah berikut :

:0043B555 Call dword ptr [00476E38]        ;GetWindowTextA
:0043B55B mov ecx, dword ptr [ebp+10]      ;ECX = S/N yang kita masukan
:0043B55E push FFFFFFFF
:0043B560 call 004308B6

Untuk meliat isi ECX, gunakan perintah D *ECX

:d *ecx
017F:00E059BC 31 32 33 34 35 34 33 32-31 00 72 67 65 74 00 00 123454321.rget..

Pasang Breakpoint pada lokasi memory tersebut : BPM 017F:00E059BC

Dari situ mulailah menekan tombol F10 untuk melakukan tracing pada baris - baris perintah berikutnya. Di sini aku ngak akan menceritakan apa yang akan kamu temui secara mendetail, lakukan tracing dengan hati - hati sambil coba memahami apa yang sedang dikerjakan oleh program tersebut.

Nantinya kamu akan menemukan baris perintah seperti ini :

:00415F45 8A18 mov bl, byte ptr [eax]
:00415F47 8AD3 mov dl, bl
:00415F49 3A1E cmp bl, byte ptr [esi]       
:00415F4B 751C jne 00415F69

Perhatikan perintah pada Offset 00415F49, perintah Compare tersebut cukup menarik, tapi apa yang sedang dibandingkan  saat itu ??? Untuk menjawabnya, kamu harus meliat isi EAX dan ESI dengan cara seperti di bawah ini :

:d esi
017F:00E059FC     31 32 33 34 35 34 33 32-31 00 00 00 32 00 00 00
   123454321...2...

:
d eax
017F:00E059D0     37 32 45 38 37 41 32 39-2D 44 44 36 39 31 31 39
   72E87A29-DD69119
017F:00E059E0     38 00 65 64 20 2D 20 5B-51 75 69 63 6B 20 50 61
   8.ed - [Quick Pa

Hmm......waktu pertama kali meliat isi EAX di atas, aku langsung merasa sudah selesai mengKrak program ini tetapi ternyata dugaanku meleset. Waktu aku mencoba s/n tersebut ( 72E87A29-DD691198 ) dengan "semangat 45" :-), ternyata langsung keluar sebuah Window kecil dengan tulisan "This code has been distributed without permission and is no bla bla bla.... ". Sialan ternyata s/n tersebut adalah s/n lama yang sebelumnya telah berhasil diKrak ( ngak tau ama siapa ) dan kemudian sang programer mencoba mencegah penggunaan s/n tersebut dengan cara meletakan fungsi pembanding di dalam pengecekan s/n-nya.

Karena sedikit stress ;-P, aku memutuskan untuk coba pake W32Dasm, untuk meliat kode perintah pemanggil "nag message" yang sangat mengganggu itu dan ini yang aku temui :

:00416121 8D4C240C lea ecx, dword ptr [esp+0C]
:00416125 E836FCFFFF call 00415D60        ;Call yang menentukan !!!
:0041612A 83E820 sub eax, 00000020
:0041612D 7447 je 00416176        
:0041612F 83E802 sub eax, 00000002
:00416132 7419 je 0041614D

* Possible Reference to Menu: MenuID_0090 
|
* Possible Reference to String Resource ID=00144: "Invalid code." 
|
:00416134 6890000000 push 00000090
:00416139 8D4C240C lea ecx, dword ptr [esp+0C]
:0041613D E8F7A80100 call 00430A39
:00416142 8B4C2408 mov ecx, dword ptr [esp+08]


Conditional Jump dari 0041612D :

* Possible Reference to String Resource ID=00150: "This code has been distributed without permission and is no "
|
:00416176 6896000000 push 00000096
:0041617B 8D4C240C lea ecx, dword ptr [esp+0C]
:0041617F E8B5A80100 call 00430A39
:00416184 8B442408 mov eax, dword ptr [esp+08]

Conditional Jump dari 00416132 :

* Possible Reference to String Resource ID=00145: "Thank you for registering."
|
:0041614D 6891000000 push 00000091
:00416152 8D4C240C lea ecx, dword ptr [esp+0C]
:00416156 E8DEA80100 call 00430A39
:0041615B 8B542408 mov edx, dword ptr [esp+08]

Nah dari perintah - perintah di atas, kamu bisa liat bahwa hasil dari rutin Call di Offset 00416125 tampaknya mempengaruhi "keputusan" program untuk menentukan apakah s/n yang kita masukan itu salah, sudah kadaluarsa atau benar.

Oke kalo gitu kita kembali ke SoftICE, ulangi langkah - langkah di atas dan pada rutin Call di Offset 00416125, tekan F8 untuk masuk ke dalamnya. Di dalamnya kamu bakal menemukan baris perintah seperti di bawah ini :

:00415D9C mov eax, dword ptr [edi+04]
:00415D9F cmp dword ptr [eax-08], 00000011  ;Panjang S/N harus 11h (=17 karakter )
:00415DA3 je 00415DA7
:00415DA5 xor ebx, ebx

Ooo...ternyata panjang s/n kita harus sama dengan 17 karakter. Rubah s/n yang kita masukan tadi dengan '12345678901234567' dan kemudian perhatikan kembali langkah - langkah pengecekan s/n yang dilakukan selanjutnya :

:00415DB6 mov ecx, dword ptr [edi+04]        ;ECX = S/N yang kita masukan

:00415DB9 mov esi, 00000009
:00415DBE cmp byte ptr [ecx+08], 2D	     ;Posisi ke-8 harus sama dengan 2Dh ( = '-') 
:00415DC2 je 00415E26
:00415DC4 xor ebx, ebx
:00415DC6 jmp 00415E26

:00415DC8 mov eax, dword ptr [edi+04]	     ;Ambil karakter pada posisi ganjil
:00415DCB mov ecx, esi
:00415DCD inc esi
:00415DCE mov dl, byte ptr [ecx+eax]	     ;Ambil karakter pada posisi genap
:00415DD1 mov ecx, esi
:00415DD3 mov byte ptr [esp+10], dl
:00415DD7 lea edx, dword ptr [esp+10]
:00415DDB mov al, byte ptr [ecx+eax]
:00415DDE lea ecx, dword ptr [esp+18]
:00415DE2 push ecx

:00415DE3 push 0046C868
:00415DE8 push edx
:00415DE9 inc esi
:00415DEA mov byte ptr [esp+1E], al
:00415DEE call 00418FD0
:00415DF3 add esp, 0000000C
:00415DF6 lea eax, dword ptr [esp+14]
:00415DFA lea ecx, dword ptr [esp+12]
:00415DFE push eax

:00415DFF push 0046C868
:00415E04 push ecx
:00415E05 call 00418FD0
:00415E0A mov eax, dword ptr [esp+20]        ;EAX = Karakter pada posisi genap
:00415E0E mov ecx, dword ptr [esp+24]        ;ECX = Karakter pada posisi ganjil
:00415E12 mov edx, eax            	     ;EDX = EAX
:00415E14 add esp, 0000000C
:00415E17 sub edx, ebp            	     ;EDX = EDX - EBP
:00415E19 and edx, 0000000F        	     ;EDX = EDX and 0Fh
:00415E1C cmp byte ptr [ecx+edi+10], dl      ;[ECX+EDI+10] = DL ???
:00415E20 je 00415E24                        
:00415E22 xor ebx, ebx                       ;EBX = 0 jika tidak sama
:00415E24 mov ebp, eax            	     ;EBP = EAX
:00415E26 cmp ebx, 00000022        	     ;Bandingkan EBX dengan 22h
:00415E29 je 00415DAC            	     ;Jika tidak sama berarti s/n salah.

Perintah - perintah di atas, adalah perintah - perintah untuk memverifikasi apakah s/n yang kita masukan sesuai dengan ketentuan yang ada. Perhatikan perintah Compare pada Offset 00415E1C, apa saja yang dibandingkan pada perintah tersebut ???

Seperti yang terlihat di atas, DL adalah karakter dari s/n yang kita masukan, tepatnya adalah karakter pada posisi genap.
Pada contoh s/n yang aku masukan pada program ini ( 12345678901234567 ) maka berarti karakter pada posisi genap adalah 2, 4, 6, 8, 0, 2, 4, 6 sementara karakter yang mengisi posisi ganjil adalah 1, 3,5, 7, 9, 1, 3, 5, 7

Pada pengecekan pertama, DL = 2, sementara ECX = 1. Pada perintah Compare di atas, nilai yang akan dibandingkan adalah nilai yang ditunjuk oleh [ECX+EDI+10]. Sebelum meliat nilai tersebut, aku mengecek terlebih dulu apa isi [EDI+10], karena nilai yang ditunjuk oleh [EDI+10] adalah nilai dasar, sementara ECX, sebagai penambah, nilainya akan berubah untuk pengecekan karakter - karakter berikutnya.

:d edi+10
017F:004714F8 05 08 0F 00 03 09 0C 02-0B 07 01 0A 0D 04 06 0E ................

Apa maksudnya ??? Kalo kamu perhatikan dengan teliti, ternyata nilai yang ditunjuk oleh [ECX+EDI+10] akan berubah sesuai dengan "variabel" ECX. Perhatikan data di bawah ini :

ECX = 0 ==> [0 + EDI + 10] = 05h
ECX = 1 ==> [1 + EDI + 10] = 08h
ECX = 2 ==> [2 + EDI + 10] = 0Fh
ECX = 3 ==> [3 + EDI + 10] = 00h
ECX = 4 ==> [4 + EDI + 10] = 03h
ECX = 5 ==> [5 + EDI + 10] = 09h
ECX = 6 ==> [6 + EDI + 10] = 0Ch
ECX = 7 ==> [7 + EDI + 10] = 02h
ECX = 8 ==> [8 + EDI + 10] = 0Bh
ECX = 9 ==> [9 + EDI + 10] = 07h

Dari sini kamu bisa liat bahwa kamu harus merubah s/n yang kamu masukan sedemikian hingga sehingga sama dengan nilai yang ditunjuk oleh [ECX + EDI + 10].

Pada pengecekan 2 karakter pertama, aku harus merubah karakter ke 2 ( karakter pada posisi genap ) sehingga ketika dikurangkan dengan EBP ( EDX = EDX - EBP ) dan di-AND-kan dengan 0Fh akan sama dengan 08h. Pada awalnya nilai EBP adalah 00h, tetapi pada pengecekan karakter - karakter berikutnya, nilai EBP akan sama dengan nilai s/n pada posisi genap.

K R A K

Setelah melakukan penghitungan akhirnya aku menemukan s/n yang tepat, yaitu : 18385173-08273763

Sesuai dengan "keinginan" program ( liat Offset 00415DC8 - 00415DE2 ) karakter pada posisi ke-9 harus sama dengan '-'

 

Catatan

Sistem Proteksi seperti ini - IMHO - sebenarnya cukup bagus, karena paling tidak, Kraker ngak bisa langsung menebak apa s/n yang valid hanya dengan meliat isi memory. Tapi aku rasa akan lebih bagus lagi kalo algoritma pengecekannya dibuat lebih panjang, dengan demikian akan bisa mempersulit para Kraker ;-P

 

chupacabra@softhome.net

© Mei1999