CPUIdle 5.5

http://cpuidle.home.pages.de

SoftICE 3.24
Hex Editor

oleh

CHuPaCaBRa

 

Pengenalan Program

Tutorial mengenai CPUIdle ini sebenarnya sudah pernah aku tulis dan di-"pajang" di site eKH, tapi tutorial ini aku tulis ulang karena adanya beberapa perubahan pada penanganan Sistem Proteksi yang digunakan.

CPUIdle sendiri adalah sebuah program yang berfungsi untuk menurunkan temperatur CPU jika CPU sedang dalam keadaan idle dengan demikian dapat memperpanjang umur CPU dan menghemat penggunaan listrik. Program ini berfungsi penuh tetapi hanya dalam jangka waktu 30 hari, lebih dari jangka waktu yang ditentukan tersebut, CPUIdle tak dapat digunakan :-(

Essay

CPUIdle tidak menyediakan tempat bagi User untuk memasukan Nama atau S/N sebagai tanda registrasi oleh karena itu untuk dapat menggunakan program ini tanpa memperdulikan batasan waktu yang ada maka satu-satunya jalan adalah dengan menghilangkan "Time Trial Protection" yang digunakannya. Selain itu, dalam tutorial ini, aku juga akan menunjukan cara untuk mengganti pesan 'shareware' yang sangat mengganggu.

Langkah Pertama - Menghilangkan "Time Trial Protection"

Karean program ini menggunakan sistem proteksi yang berhubungan dengan waktu maka sebelum mulai menjalankan program tersebut, kamu harus terlebih dulu masuk ke dalam SoftICE dan memasang BreakPoint pada GetLocalTime ( Ketik BPX GetLocalTime ). Fungsi API ini sangat umum digunakan dalam "Time Trial Protection". Setelah itu barulah kembali ke Windows dan jalankan CPUIdle dengan normal.

Tapi apa yang terjadi ??? Kamu bakal langsung terlempar ke dalam SoftICE, dimana fungsi GetLocalTime berada. Tekan F12 untuk keluar dari fungsi tersebut.

0177:00409084 CALL KERNEL32!GetLocalTime
0177:00409089 MOV  CX,[ESP+0E]
0177:0040908E MOV  DX,[ESP+0A]
0177:00409093 MOV  AX,[ESP+08]
0177:00409098 CALL 00408EBC

Sebelum melangkah lebih jauh, periksa apa isi CX, DX dan AX dengan mengetikan perintah seperti di bawah ini :

:? cx
00000014 0000000020 ""
:? dx
00000005 0000000005 ""
:? ax
000007CF 0000001999 "Ï"

Ternyata, CX, DX dan AX menyimpan Tanggal, Bulan dan Tahun, kapan program tersebut dijalankan. Ini sangat menarik. Tanggal, Bulan dan Tahun tersebut tampaknya sangat mudah diganti dengan Tanggal yang pasti, tapi ternyata cara itu tidak akan berhasil. CPUIdle tidak akan tertipu jika kita mencoba menetapkan fixed date untuk tanggal tersebut, program tersebut akan tetap menghitung mundur sisa hari yang tersisa untuk menggunakan CPUIdle. Berarti kkta harus mencari jalan lain......

Oke kita teruskan dengan tidak mengganti isi CX, DX maupun AX dan ini adalah baris - baris perintah yang aku temui :

0177:0040909D FSTP  REAL8 PTR [ESP]
0177:004090A0 WAIT
0177:004090A1 FLD   REAL8 PTR [ESP]
0177:004090A4 ADD   ESP,18
0177:004090A7 RET
0177:004550F2 FCOMP REAL8 PTR [EBP-34]
0177:004550F5 FSTSW AX
0177:004550F7 SAHF
0177:004550F8 JNZ   0045510F 			;NO JUMP
0177:004550FA MOV   EDX,004552C4
0177:004550FF MOV   EAX,[EBP-28]
0177:00455102 CALL  0044F934
0177:00455107 FCOMP REAL8 PTR [EBP-14]
0177:0045510A FSTSW AX
0177:0045510C SAHF
0177:0045510D JZ    00455142 			;JUMP
0177:00455142 XOR   EAX,EAX
0177:00455144 POP   EDX
0177:00455145 POP   ECX
0177:00455146 POP   ECX
0177:00455147 MOV   FS:[EAX],EDX
0177:0045514A JMP   0045518A 			;JUMP
0177:00409084 CALL  KERNEL32!GetLocalTime
0177:00409089 MOV   CX,[ESP+0E]
0177:0040908E MOV   DX,[ESP+0A]
0177:00409093 MOV   AX,[ESP+08]
0177:00409098 CALL  00408EBC
0177:0040909D FSTP  REAL8 PTR [ESP]
0177:004090A0 WAIT
0177:004090A1 FLD   REAL8 PTR [ESP]
0177:004090A4 ADD   ESP,18
0177:004090A7 RET
0177:0045518F FCOMP REAL4 PTR [004552C8]
0177:00455195 FSTSW AX
0177:00455197 SAHF
0177:00455198 JAE   004551A0			;NO JUMP
0177:0045519A CMP   DWORD PTR [EBP-0C],00	;Compare yang menarik

Kenapa aku perintah Compare di atas aku anggap menarik ??? Karena biasanya, 'Time Trial Protection' akan mengurangi atau menambah ( tergantung Sistem Proteksinya ) suatu angka tertentu hingga mencapai batas yang sudah ditentukan. Dalam contoh program ini, CPUIdle memberikan jangka waktu 30 hari untuk menggunakan program tersebut, dan setiap hari, jangka waktu itu akan dikurangi hingga pada akhirnya mencapai 0, yang berarti waktu yang diberikan sudah mencapai batasannya.

Karena itulah aku langsung meliat apa isi [EBP-0C] dengan perintah :

:d EBP-0C
017F:006CFC50 1E 00 00 00 00 00 00 01-5C 25 BF 00 84 FC 6C 00 ........\%....l.

Waktu pertama kali meliat isi [EBP-0C] mungkin tampaknya tidak ada yang istimewa...tapi perhatikan 1E hexa yang ada di dalam [EBP-0C] itu, apa maksudnya ??? Ingat, angka 30 dalam decimal sama dengan 1E dalam hexa. Ini berarti [EBP-0C] adalah tempat meletakan Counter hari yang tersisa. Lalu apa yang harus dilakukan selanjutnya ???

Sebelum melakukan apa - apa, ada baiknya kalo kamu mengecek apa yang akan terjadi jika CPUIdle dijalankan beberapa hari sesudah tanggal penginstallan. Untuk itu, keluar dari SoftICE dan rubah tanggal di Windows, satu hari ke depan.

Berikut adalah hasil tracing yang aku lakukan, perhatikan perubahan - perubahan yang terjadi :

0177:00409084 CALL  KERNEL32!GetLocalTime
0177:00409089 MOV   CX,[ESP+0E]
0177:0040908E MOV   DX,[ESP+0A]
0177:00409093 MOV   AX,[ESP+08]
0177:00409098 CALL  00408EBC
:? cx
00000015 0000000021 ""
:? dx
00000005 0000000005 ""
:? ax
000007CF 0000001999 "Ï"
0177:0040909D FSTP  REAL8 PTR [ESP]
0177:004090A0 WAIT
0177:004090A1 FLD   REAL8 PTR [ESP]
0177:004090A4 ADD   ESP,18
0177:004090A7 RET
0177:004550F2 FCOMP REAL8 PTR [EBP-34]
0177:004550F5 FSTSW AX
0177:004550F7 SAHF
0177:004550F8 JNZ   0045510F        		;JUMP

0177:0045510F DEC   DWORD PTR [EBP-0C]		;Pengurangan Counter
0177:00455112 FILD  DWORD PTR [EBP-0C]
0177:00455115 ADD   ESP,-08
0177:00455118 FSTP  REAL8 PTR [ESP]
0177:0045511B WAIT

Perhatikan perubahan yang ada pada langkah - langkah di atas. Sebelumnya, program tidak melompat dari Offset 004550F8 ke 0045510F tetapi setelah tanggal dimajukan satu hari, CPUIdle mendeteksi adanya penambahan hari sehingga Counter yang terletak pada [EBP-0C] harus dikurangi, untuk itu pada Offset 004550F8, program akan melompat ke 0045510F dan mengurangi Counter.

Agar dapat menghilangkan 'Time Trial Protection', kita harus merubah beberapa perintah agar pengurangan Counter tidak akan pernah dijalankan. Untuk itu, harus diperhatikan baris - baris perintah mana yang mempuinyai kemungkinan untuk mengakses perintah di Offset 0045510F. Tentu saja baris perintah tersebut adalah baris perintah yang terletak di Offset 004550F8, karena itu rubah perintah 'Conditional Jump' tersebut dengan 'No Operation' sehingga program tidak akan pernah melompat ke Offset 0045510F.

Pada SoftICE, perubahan tersebut dilakukan dengan menggunakan perintah :

:A 0177:004550F8
0177:004550F8 NOP
0177:004550F9 NOP
0177:004550FA		<== Tekan Enter

Tapi bukan itu saja perintah yang harus dirubah....pada Offset 0045510D terdapat sebuah Conditional Jump yang juga bisa memberikan akses pada pengurangan Counter di bawahnya, oleh karena itu perintah tersebut harus diganti dengan perintah Unconditional Jump seperti di bawah ini :

:A 0177:0045510D
0177:0045510D JMP 00455142
0177:0045510F		<== Tekan Enter

Dengan kedua perubahan di atas, Counter yang menandakan berakhirnya masa "uji coba" tersebut tidak akan pernah berkurang. Tapi apabila ternyata pada saat kamu hendak meng-Krak program tersebut, waktu berlakunya sudah melewati batas, kamu bisa merubah perintah pada Offset berikut :

0177:0045519A CMP DWORD PTR [EBP-0C],00
0177:0045519E JGE 004551E3		;Ganti dengan JMP 004551E3

Dengan demikian, walaupun telah melewati batas waktu, CPUIdle tetap dapat dijalankan :-)


Langkah Kedua - Menghilangkan "Nag Message"

Walaupun CPUIdle sekarang dapat digunakan terus menerus, tapi 'pesan nista' yang menunjukkan sisa hari penggunaan program itu, masih tampak :-(

Okeh....kita kembali ke SoftICE, setelah pengecekan hari pada Offset 0045519A, telusuri terus program tersebut, perhatikan perubahan isi register - register yang ada.

0177:004551E6 CALL 0044F5C4
0177:004551EB LEA EDX,[EBP-38]
0177:004551EE MOV EAX,[EBP-0C]		;Perhatikan isi EAX
0177:004551F1 CALL 00407F28
:? eax
0000001E  0000000030  ""		;EAX = 30 decimal
0177:004551F6 LEA EAX,[EBP-38]
0177:004551F9 PUSH EAX

:d *eax
017F:00BF8EE8 33 30 00 00 1E 00 00 00-01 00 00 00 0C 00 00 00 30..............

Ternyata Rutin Call pada Offset 004551F1 bertugas untuk merubah Counter yang masih merupakan bilangan desimal menjadi Karakter ASCII yang akan ditampilkan nantinya.

0177:004551FA LEA EDX,[EBP-2C]
0177:004551FD MOV EAX,[EBP-04]
0177:00455200 MOV EAX,[EAX+00000338]
0177:00455206 CALL 0042A5D4
0177:0045520B MOV EDX,[EBP-2C]		;Perhatikan isi EDX

:d edx
017F:00BFC71C 20 64 61 79 73 20 6C 65-66 74 20 66 6F 72 20 65 days left for e
017F:00BFC72C 76 61 6C 75 61 74 69 6F-6E 2E 00 00 26 00 00 00 valuation...&...

Oke sekarang tulisan 'days left for evaluation' telah disiapkan, seharusnya pada perintah - perintah berikutnya, kedua kalimat yang telah kita lihat sebelumnya ( '30' dan 'days left for evaluation' ) akan digabungkan menjadi satu kalimat.

0177:0045520F CALL 00403D48
0177:00455214 MOV EDX,[EBP-38]		;Perhatikan isi EDX

:d edx
017F:00C011EC 32 31 20 64 61 79 73 20-6C 65 66 74 20 66 6F 72 30 days left for
017F:00C011FC 20 65 76 61 6C 75 61 74-69 6F 6E 2E 00 72 72 65 evaluation..rre

Tepat seperti dugaanku, Rutin Call di Offset 00403D48 itu menggabungkan kedua kalimat tersebut :-) Agar supaya tulisan tersebut hilang atau berganti, kita harus merubahnya dengan tulisan lain. Untuk itu kita butuh Hex Editor, dengan Hex Editor yang kamu punya, cari kalimat 'days left for evaluation' pada file CPUIdle.EXE lalu ganti dengan kalimat yang kamu suka. Aku sendiri menggantinya dengan kalimat : 'Kraked by CHuPaCaBRa'

Secara logika, kamu pasti sudah menduga bahwa nantinya tulisan yang akan tampil adalah '30 Kraked by CHuPaCaBRa'. Ini karena rutin Call yang bertugas untuk menggabungkan kedua kalimat masih bekerja, karena itu kita butuh sedikit perubahan :

:A 0177:00455214
0177:00455214 MOV EDX,[EBP-2C]
0177:00455217			<== Tekan Enter

Dengan demikian, apa yang ditampilkan nantinya bukan hasil penggabungan antara 2 kalimat seperti di atas, tapi hanya satu kalimat saja yaitu 'Kraked by CHuPaCaBRa'

K R A K

Ada 4 buah tempat yang harus kita Patch :

1. Patch untuk Offset 004550F8

75 15 BA C4 52 45 00 8B-45 D8 E8 2D A8 FF FF DC 
90 90 BA C4 52 45 00 8B-45 D8 E8 2D A8 FF FF DC 

2. Patch untuk Offset 0045510D

74 33 FF 4D F4 DB 45 F4-83 C4 F8 DD 1C 24 9B BA 
EB 33 FF 4D F4 DB 45 F4-83 C4 F8 DD 1C 24 9B BA 

3. Patch untuk Offset 0045519E

7D 43 6A 10 B9 CC 52 45-00 BA D4 52 45 00 A1 BC 
EB 43 6A 10 B9 CC 52 45-00 BA D4 52 45 00 A1 BC 

4. Patch untuk Offset 00455214

8B 55 C8 8B 45 FC 8B 80-38 03 00 00 E8 DF 53 FD 
8B 55 D4 8B 45 FC 8B 80-38 03 00 00 E8 DF 53 FD 

Keterangan :

Gunakan Hex Editor pada CPUIdle.EXE untuk melakukan Patch - patch di atas, ganti kode hexa yang aku beri warna merah dengan kode Hexa yang berwarna Hijau.

Catatan

Langkah - langkah di atas, walaupun tidak dapat dilakukan secara serupa pada software lain dengan Sistem Proteksi serupa, tapi secara umum langkah - langkah tersebut masih dapat digunakan :-)

chupacabra@softhome.net

© Mei1999