KRaKiNG PRoDuK CAD-KAS |
SoftICE
3.24 |
oleh
CHuPaCaBRa
Pengenalan Program |
CAD-KAS adalah 'Shareware Maker' dari Jerman. Mereka memiliki beberapa koleksi shareware yang cukup bagus, cuma sayangnya, tidak dilengkapi dengan Sistem Proteksi yang baik. Sistem Proteksi tersebut diterapkan pada semua produk yang mereka keluarkan. Pada tutorial ini, aku akan mengambil contoh salah satu produk mereka yaitu CAD-KAS Poster-Printery 2.0 ( size : 414 KB ).
Program ini sangat membantu bagi anda yang ingin mencetak Poster dalam ukuran besar dan hanya memiliki printer biasa. Dengan program ini, anda bisa mencetak Poster tersebut dalam beberapa bagian dan kemudian menggabungkannya sendiri sehingga membentuk satu Poster berukuran besar.
Seperti umumnya produk CAD-KAS lainnya, program ini hanya valid dalam waktu 30 hari. Setelah melewati jangka waktu tersebut, program ini tak dapat berfungsi.
Essay |
Jika kita masih merupakan Uneregistered User, program akan menampilkan 'nag message'. Pada 'nag message' terdapat pilihan 'Activate Register Copy'. Klik pada tombol itu. Pada window baru yang muncul kemudian, kamu bisa memasukan Nama dan Serial Number yang tepat. Untuk tutorial ini, aku memasukan data :
First and last name : CHuPaCaBRa Number : 123454321
Sebelum meng-klik tombol 'Check the number', tekan CTRL-D untuk masuk ke dalam SoftICE dan pasang Breakpoint di Hmemcpy ( Ketikan : BPX Hmemcpy ). Setelah itu, tekan F5 untuk kembali ke Windows dan klik 'Check the number'. Kamu bakal "terlempar" ke dalam SoftICE, tepat di dalam fungsi Hmemcpy. Tekan F12 selama 12 kali sampai kamu masuk ke dalam badan program.
:00463714 call 0042A604 ;Hmemcpy :00463719 mov eax, dword ptr [ebp+FFFFFDB0]
Tekan F10 untuk melewati baris perintah di atas, setelah itu ketik D EAX untuk melihat isi dari Register EAX. Kamu akan melihat isi memory seperti ini di Data Window :
:d eax017F:02092E30 31 32 33 34 35 34 33 32-31 00 52 6F 1C 00 00 00 123454321.Ro....
Ternyata EAX berisi Serial Number yang tadi aku masukan. Serial Number ini nantinya akan diperiksa keabsahannya, oleh karena itu, pasang Breakpoint di lokasi memory tersebut. Ketik BPM 017F:02092E30 ( Lokasi memory di komputer kamu mungkin berbeda )
Setelah itu, lanjutkan tracing dengan menekan F10 lagi.
:0046371F push eax ;Masukan EAX ke Stack :00463720 lea edx, dword ptr [ebp+FFFFFDAC] :00463726 mov eax, dword ptr [ebx+000002C4] :0046372C call 0042A604 ;Hmemcpy :00463731 mov eax, dword ptr [ebp+FFFFFDAC]
Sama seperti langkah di atas, periksa apa isi register EAX sekarang :
:d eax017F:020BE1E4 43 48 75 50 61 43 61 42-52 61 00 6E F0 E1 0B 02 CHuPaCaBRa.n....
Kali ini register EAX berisi Nama yang aku masukan. Pasang Breakpoint di lokasi tersebut, BPM 017F:020BE1E4.
:00463737 pop edx :00463738 call 004635D4 ;Verifikasi Serial Number
Ketika kamu menekan F10 untuk melewati call di atas, kamu bakalan "terjebak" di dalam Rutin Call tersebut karena lokasi memory yang ditempati oleh Nama User, diakses oleh program.
:00402933 repz :00402934 movsd ;Kamu di sini :00402935 mov ecx, eax :00402937 and ecx, 00000003 :0040293A repz :0040293B movsb :0040293C pop edi :0040293D pop esi :0040293E ret
Perintah MOVSD dan MOVSB adalah perintah Assembler untuk meng-copy sebuah string dari lokasi ESI ( Sumber ) ke lokasi baru di EDI. Oleh karena itu cek lokasi memory yang ditempati oleh EDI - 0A. Harus dikurangi 0A karena panjang Nama yang aku masukan adalah 10 karakter ( 0A dalam Hexadecimal )
:d edi-a017F:0072F55D 43 48 75 50 61 43 61 42-52 61 01 8A 85 5A 9B AF CHuPaCaBRa...Z..
Pasang Breakpoint lagi di lokasi memory baru tersebut. BPM 017F:0072F55D. Lanjutkan tracing sampai kamu menemui baris - baris perintah seperti di bawah ini :
:00463678 mov [ebp-0C], 00000001 ;[EBP-0C] = 01 :0046367F lea eax, dword ptr [ebp+FFFFFDF5] ;EAX = CHUPACABRA
Perhatikan perubahan yang terjadi pada nama yang kita masukan. Karakter Nama yang tadi aku masukan telah diubah semuanya menjadi Huruf Besar. Sekedar catatan, hal ini sering sekali aku temui di Sistem Proteksi yang menggunakan karakter - karakter dari nama user untuk diolah menjadi Serial Number.
Pada baris - baris berikutnya, kamu akan melihat bagaimana Serial Number itu dibentuk :
:00463685 xor edx, edx ;EDX = 0 :00463687 mov dl, byte ptr [eax] ;DL = Karakter dari Nama :00463689 imul edx, dword ptr [ebp-0C] ;EDX = EDX imul [EBP-0C] :0046368D add edi, edx ;EDI = EDI + EDX :0046368F inc [ebp-0C] ;[EBP-0C] = [EBP-0C] + 1 :00463692 inc eax ;EAX = EAX + 1 :00463693 dec esi ;ESI = ESI - 1 :00463694 jne 00463685 ;Looping jika ESI <> 0
Perhitungan di atas akan dilakukan terus menerus sampai semua karakter dalam nama kita sudah diolah. Pada Offset 0046368D, register EDI aakn terus ditambahkan dengan nilai EDX, tapi berapakah nilai EDI pertama kali ??? Untuk mengetahuinya, kamu harus sedikit kembali baris - baris di atasnya. Cari perintah yang berfungsi untuk mengisi nilai EDI. Setelah kamu cari, kamu bakalan melihat perintah seperti ini :
:0046360B mov edi, 00001BE0 ;EDI = 1BE0 Hexa = 7136 Decimal
Keliatan bahwa, pada awalnya EDI diberi nilai 7136. Okeh, lanjutkan perhitungan Serial Number di atas sampai semua karakter selesai diolah.
:00463696 lea edx, dword ptr [ebp-0C] :00463699 mov eax, dword ptr [ebp-08] :0046369C call 00402BE8
Sebelum melewati Offset 0046369C, sebaiknya kamu melihat apa isi Register EAX :
:d eax017F:02092E30 31 32 33 34 35 34 33 32-31 00 52 6F 1C 00 00 00 123454321.Ro....
Register EAX ternyata berisi Serial Number kita. Lewati Rutin Call di Offset 0046369C dan kamu akan menemui Compare yang sangat penting :-)
:004636A1 cmp edi, eax ;Penting !!! :004636A3 jne 004636B0 ;Lompat ke 004636B0 jika EDI <> EAX
Kita telah melihat isi EAX sebelum Rutin Call tadi, tetapi apakah nilai EAX tersebut masih sama ???
:d eax017F:075BC371 ?? ?? ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ?? ................
Jika kamu menemukan isi Register seperti diatas, maka coba pakai cara lain untuk melihat isinya, yaitu dengan mengetikkan ? EAX
:? eax075BC371 0123454321 "[Ãq"
Di sini kamu bisa liat bahwa ternyata nilai EAX adalah 075BC371 ( dalam Hexadecimal ) dan 123454321 ( dalam Decimal ) yang merupakan Serial Number yang aku masukan tadi. Apa bedanya dengan nilai EAX sebelum Rutin Call tadi ???
Sebelum Rutin Call tadi, Serial Number yang disimpan tersebut masih berupa ASCII Text ( terletak di kolom paling kanan ) dan setelah keluar dari Rutin Call tersebut, Serial Number itu telah di-konvert ke nilai Hexadecimal dan Decimal. Lalu muncul pertanyaan, bagaimana dengan nilai EDI ???
Secara logika, perbandingan antara EDI dan EAX adalah perbandingan antara Serial Number yang Valid dan Serial Number yang kita masukan. Karena itu, dengan cara yang sama, periksa nilai EDI pada saat itu :
:? edi00002B0C 0000011020 "+
Dari 2 nilai pada register EDI dan EAX di atas kita bisa menarik kesimpulan bahwa :
Oke, tekan F5 untuk membiarkan program berjalan normal. Kamu akan kembali ke Windows dengan pesan yang sangat mengganggu muncul di sana ;-(
Rubah Serial Number kamu dengan Serial Number yang tadi telah kamu liat dan perhatikan perbedaannya :
First and last name : CHuPaCaBRa Number : 11020
Dan.....berhasil, program akan menampilkan pesan "Thank You bla bla" :-)
K R A K |
Setelah berhasil melakukan Debugging seperti di atas, kamu sekarang tentunya sudah mengerti bagaimana Program tersebut menciptakan Serial Number untuk setiap User berdasarkan nama mereka. Beberapa hal yang harus diingat :
Dari situ kamu bisa membuat sebuah KeyGenerator sederhana yang bisa menciptakan Serial Number untuk program ini dengan algoritma yang sama tentunya. Berikut adalah Source Program KeyGenerator yang aku buat dengan menggunakan Bahasa C ( harap maklum kalo programnya kurang bagus :-) ):
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
void main()
{
unsigned long EDX, Counter=1, ESI, EDI=7136;
int I, J=0;
char Name[20], UprName[20] = " \0" , SN[5];
clrscr();
textcolor(11);
cprintf("Masukan nama anda : ");
gets(Name);
for ( I = 0; I < strlen(Name);I++)
{
if ( Name[I] != ' ' )
{
if ( Name[I] >= 'a' && Name[I] <= 'z' )
UprName[J] = Name[I] - 0x20;
else
UprName[J] = Name[I];
J++;
}
}
for ( I = 0; I < J; I++ )
{
EDX = UprName[I];
EDX = EDX * Counter;
Counter = Counter + 1;
EDI = EDI + EDX;
}
cprintf ( "S/N Anda : %d",EDI);
}
Catatan |
Seperti yang sudah aku singgung di awal tutorial, produk - produk CAD-KAS memiliki kesamaan dalam Sistem Proteksinya. Yang sedikit berbeda adalah nilai awal EDI, untuk produk lainnya, nilai awal itu mereka rubah supaya untuk User yang sama tidak akan memiliki Serial Number yang sama untuk semua produk mereka.
copyright - Mei1999