Target : CPUIdle v5.1
Tool : SoftIce v4.05
Program ini hanya dapat digunakan dalam jangka waktu 30 hari, setelah itu, user harus
membeli s/w ini seharga $20. Cukup mahal dalam masa KrisMon :-) Selama masa percobaan 30
hari tersebut, s/w akan menampilkan berapa banyak waktu yang tersedia bgi user untuk dapat
tetap menggunakan s/w tersebut.
.Ada 2 hal yang harus kita lakukan pada s/w ini, pertama membuat s/w tersebut tidak
pernah kadaluarsa ( Never Expired ) dan kedua menghiilangkan pesan "days left for
evaluation" yang muncul.
1. Krak Time Trial Protection
Oke pertama - tama kita harus membuat s/w ini tidak pernah mencapai kadaluarsa. Caranya
tentu saja dengan menipu s/w bahwa kita masih ada dalam batas waktu yang diperbolehkan (
masih kurang dari 30 hari ).
Cara kerja Time Trial Protection secara umum adalah :
- Ambil Tanggal dimana User menjalankan Program tersebut.
- Ambil Tanggal ketika pertama kali User menginstall program tersebut.
- Bandingkan kedua tanggal tersebut.
- Apakah telah melebihi batas waktu penggunaan ?.
- Jika belum, jalankan program, jika sudah, tampilkan "pesan nista" yang meminta
User untuk membeli Program itu.
Untuk itu...mula - mula pasang Breakpoint di GetLocalTime dengan mengetik BPX
GetLocalTime di SoftICE. Setelah itu jalankan CPUIdle. Tak berapa lama kemudian kita akan
terlempar ke dalam SoftICE, pada saat itu kita berada di dalam fungsi GetLocalTime, tekan
F12 untuk keluar dari tempat itu.
:00407B2D 668B4C240E
mov cx, word ptr [esp+0E] ==> Kita ada di sini
:00407B32 668B54240A mov dx, word ptr [esp+0A]
:00407B37 668B442408 mov ax, word ptr [esp+08]
:00407B3C E86BFFFFFF call 00407AAC
Telusuri beris - baris perintah itu dengan menekan F10, dan setelah mencapai offset
00407B3C, ketikan ? CX, ? DX dan
? AX. Ternyata CX , DX dan AX menyimpan Tanggal, Bulan dan Tahun ketika User
mengaktifkan CPUIdle itu. Sebagai newbie, aku merasa yakin bahwa dengan menetapkan tanggal
yang pasti ( Fixed Date ), CPUIdle tak akan pernah Kadaluarsa. Oleh karena itu aku mencoba
menggunakan teknik itu dengan mengetik A 00407B2D dan mengisi baris - baris kosong yang
tersedia :
:00407B2D MOV CX, 14
===> CX = Tanggal 20
:00407B31 NOP
:00407B32 MOV DX, 0B
===> DX = Bulan 11
:00407B36 NOP
:00407B37 MOV AX, 07CE ===> AX
= Tahun 1998
:00407B3B NOP
:00407B3C
===> Tekan Enter untuk Selesai
Cat. : Tanggal 20 - 11 - 1998 adalah tanggal yang
sama dengan tanggal ketika aku menginstall CPUIdle untuk pertama kali.
Setelah itu aku bershikan semua breakpoint ( BX * ) dan melihat hasilnya...ternyata
sisa hari yang tampak malah berkurang satu hari. Jelas sistem "Fixed Date" ngak
bisa dipake buat meng-krak s/w ini. Tapi jangan takut.......masih banyak jalan ke Roma :-)
Untuk itu pasang breakpoint di GetLocalTime dan restart CPUIdle. Karena "Fixed
Date" tidak berhasil, cara berikutnya yang lewat di pikiranku adalah merubah
"sisa hari" yang akan dihasilkan oleh program ( Fixed Counter ).
Tapi dimanakah letak Counter tersebut ???
Ketika kembali terjebak di dalam SoftICE akibat Breakpoint di GetLocalTime, kita akan
kembali dihadapkan di offset 00407B2D. Kita tahu apa yang akan dimasukan di CX, DX dan AX,
tapi bagaimana isi register - register lain yang ada, oleh karena itu gunakan Register
Window ( Ketik WR untuk menampilkan / menyembunyikan Register WIndow ini
). Dalam Register Window ini, seluruh register yang ada akan ditampilkan dengan jelas
sehingga pada saat bersamaan kita dapat mengawasi perubahan yang terjadi di semua
Register.
Pada saat tracing dengan F10, register yang mengalami perubahan atau sedang diakses
oleh perintah yang ada di baris tersebut akan "menyala", perhatikan register
ECX, EDX dan EAX.
ECX = xxxx0014 EDX = xxxx000B EAX =
xxxx07CE
Catatan :
Penjelasan register, contohnya EAX :
- EAX = 12 34 56 78
- AX = 56 78
- AH = 56
- AL =
78
Isi dari Register - register itu sudah kita ketahui sebelumnya tapi coba perhatikan
register - register yang ada, ada salah satu register yang menarik yaitu register EBX.
EBX = xxxx001D
Kenapa menarik ??? Begini, tadi setelah
kita mencoba memakai "Fixed Date", Counter hari yang ada telah berkurang satu,
dari 30 hari menjadi 29 hari ( 29 = 1D dalam Hexa ). Terlihat bahwa Counter yang kita cari
berada di register EBX, lebih tepatnya BL karena hanya menempati byte yang paling
belakang. Langkah berikutnya adalah mencari dimana Counter ini diproses. Sebagai seorang
newbie, aku langsung mencurigai rutin Call yang berada di offset 00407B3C, untuk itu aku
masuk ke dalamnya dengan menekan F8. Rutin Call ini cukup panjang kalo mo dii-trace satu
persatu dan ternyata itu adalah langkah yang percuma :-(.
Karena itu sebaiknya kamu lewati saja Call itu dengan menekan F10, akan terlihat bahwa
isi EBX tidak berubah, jadi pemroesesan Counter tentunya bukan di dalam Call tersebut.
Lanjutkan dengan menekan F10, lakukan perlahan - lahan dengan memperhatikan perubahan yang
mungkin terjadi pada register EBX.
:00407B32 668B54240A mov dx, word ptr
[esp+0A]
:00407B37 668B442408 mov ax, word
ptr [esp+08]
:00407B3C E86BFFFFFF call 00407AAC
:00407B41 DD1C24
fstp
qword ptr [esp]
:00407B44 9B
wait
:00407B45 DD0424
fld
qword ptr [esp]
:00407B48 83C418
add
esp, 00000018
:00407B4B C3
ret
:0043A731 DC5DD8
fcomp
qword ptr [ebp-28]
:0043A734 DFE0
fstsw ax
:0043A736 9E
sahf
:0043A737 7515
jne 0043A74E
==> Conditional Jump yang menarik
:0043A739 BA48A94300 mov edx, 0043A948
:0043A73E 8B45F4
mov eax, dword ptr [ebp-0C]
:0043A741 E85AC3FFFF call 00436AA0
:0043A746 DC5DEC
fcomp
qword ptr [ebp-14]
:0043A749 DFE0
fstsw ax
:0043A74B 9E
sahf
:0043A74C 7434
je 0043A782
==> Conditional Jump yang menarik
:0043A74E 4B
dec ebx
==> Proses EBX ???
:0043A74F 895DE0
mov dword ptr [ebp-20], ebx
:0043A752 DB45E0
fild dword ptr [ebp-20]
Perhatikan listing di atas dengan baik, ada 2 Conditional jump yang menarik, pada
offset 0043A737 ada Conditional Jump yang menuju ke offset 0043A74E dimana di situ, isi
EBX akan dikurangi dengan 1. Ini berarti Conditional Jump tersebut bertanggung jawab untuk
mengarahkan jalannya program ke Offset 0043A74E untuk kemudian mengurangi nilai EBX
sebanyak 1 ( mengurangi "sisa hari" yang tersedia ).Tetapi ketika program tidak
mendeteksi adanya perubahan hari, maka perintah JNE 0043A74E tidak dijalankan dan program
akan terus mengerjakan perintah di bawahnya. Ketika mencapai 0043A74C, kita akan melompat
ke 0043A782, tanpa melewati perintah pengurangan EBX ( "sisa hari" yang tersedia
tetap )
Agar supaya tidak pernah mencapai keadaaan dimana s/w tersebut sudah Expired maka kita
harus merubah Counter yang ada di dalam EBX itu sehingga menjadi sebuah nilai yang tetap.
Dimanakah kita harus merubah nilai EBX itu ???
Mula - mula kita harus membuat sebuah jalur yang pasti akan dilewati, karena dengan
adanya 2 Conditional Jump, akan ada 2 kemungkinan jalur yang akan dilewati. Agar supaya
jalur tersebut hanya ada satu, jalur yang sesuai dengan yang kita kehendaki, kita harus
menghapus Conditional Jump pertama dengan menggantinya dengan perintah NOP.
Ketik A 0043A737
0043A737 NOP
0043A738 NOP
0043A739
==> Tekan Enter untuk Selesai
Dengan demikian, program akan berjalan menuju perintah - perintah yang ada di bawahnya
Ketika mencapai 0043A74C, kita bisa merubah Conditional Jump itu dengan perintah tertentu
yang akan merubah nilai EBX dengan suatu nilai yang pasti, dalam hal ini adalah 30, agar
supaya CPUIdle menganggap kita masih mempunyai kesempatan 30 hari ( = IE dalam Hexa )
untuk menggunakannya.
Untuk itu kita bisa merubahnya dengan perintah MOV BL, 1E. Kenapa hanya merubah
isi BL ??? Ini karena seperti yang
telah kita ketahui sebelumnya, dalam register EBX, tempat menyimpan sisa hari tersebut
adalah di BL, dan untuk perintah DEC EBX, bisa diganti dengan NOP.
Ketik A :0043A74C
:0043A74C MOV BL, 1E
:0043A74E NOP
:0043A74F
==> Tekan Enter untuk Selesai
Sekarang bersihkan semua Breakpoint lalu liat hasilnya. Di bagian Option kita bisa liat
bahwa tertulis "30 days left for evaluation". Berhasil....untuk seterusnya
CPUIdle dapat dipergunakan tanpa khawatir akan expired. :-)
2. Menghilangkan Nag Message
Walaupun CPUIdle tidak akan pernah expired tetapi masih ada satu hal yang menggangu,
yaitu tulisan "30 days left for evaluation". Kalo kamu cek CPUIdle.EXE dengan
Hex Editor, kamu akan menemukan tulisan "days left for evaluation" yang telah
disiapkan. Rubah tulisan itu dengan tulisan lain yang kamu inginkan. Dalam tutorial ini
aku mengganti tulisan itu dengan "Kraked Version by [eKH]"
Setelah kamu menjalankan kembali CPUIdle, akan terlihat tulisan "30 Kraked Version
by [eKH]". Hehehe....pesan yang aneh. Dari sini bisa kita tarik kesimpulan bahwa
"sisa hari" yang ada di EBX akan dirubah menjadi Desimal dan kemudian
digabungkan dengan tulisan yang telah tersedia, "Kraked Version by [eKH]" (
sebelumnya "days left for evaluation" ). Kalo begitu kita harus mencegah
penggabungan kalimat itu untuk muncul, dan menggantinya hanya dengan tulisan "Kraked
Version by [eKH]"..
Kembali ke SoftICE, pasang Breakpoint lagi di GetLocalTime dan restart CPUIdle. Kita
akan kembali dihadapkan ke baris - baris perintah yang sudah kita liat tadi. Tekan F5 satu
kali, kita akan terjebak lagi di GetLocalTime. Tekan F12 dan kemudian telusuri perlahan -
lahan sambil mengamati nilai register yang berubah. Setelah beberapa saat menekan F10 (
kalo masuk ke dalam fungsi GetLocalTime, tekan F12 untuk keluar ), kita akan melihat baris
- baris perintah seperti ini :
:0043A80E 8B45F4
mov
eax, dword ptr [ebp-0C]
:0043A811 E832BFFFFF call 00436748
:0043A816 8D55E8
lea
edx, dword ptr [ebp-18]
:0043A819 8BC3
mov
eax, ebx
==>
Ketik ? EAX.
EAX
= 1E ( "sisa hari" dalam Hexa )
:0043A81B E8C4C5FCFF call 00406DE4
==>
Merubah Hexa menjadi Desimal
:0043A820 8D45E8
lea
eax, dword ptr [ebp-18] ==> EAX = Alamat Memory
yang diberikan [EBP-18]
Cek
isi yang ditunjuk oleh Alamat itu.
Contohnya
: Ketik D EAX.
EAX
= 123456
Ketik
D 563412
EAX
= 30 ( "sisa hari" dalam Desimal )
:0043A823 50
push
eax
:0043A824 8D55D4
lea
edx, dword ptr [ebp-2C]
:0043A827 8B45FC
mov
eax, dword ptr [ebp-04]
:0043A82A 8B8070020000 mov eax, dword ptr [eax+00000270]
:0043A830 E80715FEFF call 0041BD3C
:0043A835 8B55D4
mov
edx, dword ptr [ebp-2C] ==> Ketik D EDX.
EDX
= "Kraked Version by [eKH]"
[EBP-2C]
menunjuk pada tulisan tersebut..
:0043A838 58
pop eax
:0043A839 E85A93FCFF call 00403B98
==>
Menggabungkan antara "30" dengan Message
:0043A83E 8B55E8
mov
edx, dword ptr [ebp-18] ==> Ketik D EDX
EDX
= "30 Kraked Version by [eKH]"
:0043A841 8B45FC
mov eax, dword ptr [ebp-04]
:0043A844 8B8070020000 mov eax, dword ptr [eax+00000270]
:0043A84A E81D15FEFF call 0041BD6C
:0043A84F 33C0
xor eax, eax
Catatan : Instruksi yang berada di sebelah kanan anak panah, dilakukan setelah
melewati baris perintah yang bersangkutan.
Terlihat bahwa Call yang bertanggung jawab pada penggabungan antara "sisa
hari" dengan pesan yang sudah ada, terletak pada offset 0043A839. Berikutnya CPUIdle
akan menampilkan pesan yang ada di dalam EDX. Agar apa yang akan ditampilkan nanti
hanyalah pesan "Kraked by [eKH]" maka kita harus merubah perintah pada offset
0043A83E agar apa yang dimasukan ke dalam EDX bukan hasil penggabungan tersebut melainkan
pesan yang kita inginkan itu. Perhatikan offset 0043A835, tulisan "Kraked Version by
[eKH]" ditunjuk oleh [EBP - 2C].
Karena itu langkah selanjutnya adalah merubah perintah di Offset 0043A83E menjadi MOV
EDX, [EBP-2C] yang berarti mengcopy pesan "Kraked by [eKH]" ke dalam EDX.
Untuk merubahnya di dalam SoftICE, ketik A 0043A83E
:0043A83E MOV EDX, [EBP-2C]
:0043A841
==> Tekan Enter untuk Selesai
Perhatikan hasilnya, sekarang bukan saja s/w ini tidak akan pernah Kadaluarsa, pesan
yang mengingatkan bahwa s/w tersebut adalah Shareware juga telah lenyap digantikan oleh
tulisan yang kita kehendaki :-)
Cari pake Hex-Editor : 75 15 BA 48
A9 43 00
Ganti dengan
:
90 90 BA 48 A9 43 00
Cari pake Hex-Editor : 74 34 4B
89 5D E0
Ganti dengan
:
B3 1E 90 89 5D E0
Rubah tulisan "days left for evaluation" dengan tulisan lain, dengan
menggunakan Hex Editor.
Cari pake Hex-Editor : 8B 55 E8 8B
45 FC
Ganti dengan
:
8B 55 D4 8B 45 FC
Rangkuman singkat dari langkah - langkah di atas :
- Cari Register yang berisi "sisa hari" sebelum Kadaluarsa
- Temukan lokasi pemrosesan "sisa hari" tersebut.
- Karena ada 2 jalur pemrosesan Counter, buat sedemikian hingga jalur pemrosesan tersebut
hanya 1 dan sesuai dengan kehendak kita.
- Rubah "sisa hari" di dalam Register tadi sehingga jumlahnya tidak pernah
berubah.
- Cari lokasi dimana akan menampilkan "Nag Message"
- Rubah "Nag Message" menjadi "Kraked Message"
- Tampilkan "Kraked Message"
- Job Done :-)
|