JP-Tips 2000 version 1.52 |
SoftICE
3.24 |
oleh
CHuPaCaBRa
Pengenalan Program |
Program ini adalah program yang dibuat khusus untuk orang - orang Swedia ato orang yang mengerti bahasa Swedia. Aku sendiri ngak pernah make, program ini adalah salah satu program yang di-request oleh Webmaster dari Reveals Serial Numbers. ( Site bagus, nyediain banyak banget Serial Number dari berbagai Shareware ).
Berikut adalah terjemahan dalam bahasa Inggris, mengenai kegunaan program ini :
"JP-Tips 2000 is a program for reduction of (soccer) big results pool systems to a few single lines with wanted minimum guarantee."
Sistem Proteksi yang dipake lumayan keren dan cukup membingungkan buat Newbie Kraker karena itu walaupun programnya pake bahasa Swedia, aku tertarik untuk bikin tutorial-nya ;-)
Essay |
Karena interface program ini semuanya dalam bahasa Swedia, kamu musti sedikit "meraba-raba" dimana tempat mengisikan Serial Number-nya :-). Klik pada menu paling kanan, Registrering. Sebuah window baru dengan 2 edit box akan tampil, edit box teratas harus diisi dengan Serial Number sementara bagian bawahnya digunakan untuk mengisi Nama.
Ange din personliga registreringskod : 123454321 Ditt namn : CHuPaCaBRa
Pasang Breakpoint pada GetWindowTextA, dan setelah kamu menekan tombol Registrering, kamu bakal masuk ke dalam SoftICE. Tekan F12 satu kali dan kamu akan menemukan baris - baris perintah ini :
:004D300C Call dword ptr [004E240C] ;Fungsi GetWindowTextA :004D3012 mov ecx, dword ptr [ebp+10] ;Kita di sini :004D3015 push FFFFFFFF
Seperti yang sudah kamu ketahui, fungsi GetWindowTextA berfungsi untuk mengambil inputan dari user, yang menjadi pertanyaan adalah dimana inputan tersebut diletakkan ??? Untuk itu setelah kamu lewati Offset 004D3012 dengan menekan F10 satu kali, periksa isi ECX :
:d ecx 017F:007AF97C 54 61 3E 01 00 44 2F 01-40 C8 3E 01 FC B6 3E 01 Ta>..D/.@.>...>.
Hmm...tidak ada yang menarik, tapi jangan menyerah dulu, gunakan perintah lain untuk memeriksa isi alamat yang ditunjuk oleh ECX, ketikan perintah D *ECX pada Command Window
:d *ecx 017F:013E6154 31 32 33 34 35 34 33 32-31 00 72 69 66 00 30 34 123454321.rif.04
Nah terlihat bukan dimana Serial Number kita disimpan, pasang Breakpoint di lokasi memory itu ( BPM 017F:013E6154 ). Setelah pembacaan Serial Number, program akan membaca beberapa informasi yang tidak kita perlukan, kamu akan terjebak di dalam fungsi GetWindowTextA sebanyak kira - kira 6 kali sebelum kamu menemukan lokasi tempat penyimpanan Nama yang sudah kamu masukan tadi. Baris perintahnya masih sama dan cara mencari lokasi memory juga sama dengan cara di atas:
:d *ecx 017F:013EC8E0 43 48 75 50 61 43 61 42-52 61 00 00 00 00 00 00 CHuPaCaBRa......
Pasang Breakpoint lagi di lokasi memory di atas ( BPM 017F:013EC8E0 ). Ingat lokasi memory kamu mungkin berbeda dengan lokasi memory-ku tapi itu ngak jadi soal karena cara yang dipakai tetap sama.
Kalo kamu melanjutkan tracing dengan menekan F10, bagi kamu yang masih pemula akan kebingungan menghadapi baris - baris perintah yang "tidak bersahabat" :-) Pada waktu pertama kali mencoba mengKrak program ini, aku juga mengalami nasib yang sama ( maklumlah masih newbie :-) ). Karena kebingungan dengan SoftICE, aku coba beralih dengan menggunakan W32Dasm, kali ini aku coba melewati "jalan belakang".
Maksudnya begini, setiap kali kita salah memasukan Serial Number, program akan menampilkan sebuah MessageBox kecil bertuliskan "Registreringen misslyckades!". Dengan W32Dasm, aku coba mencari kode - kode perintah yang mengeluarkan MessageBox tersebut dengan asumsi, rutin pengecekan Valid/Tidaknya Serial Number yang dimasukan, tentunya tidak jauh dari kode perintah tersebut.
Dengan menggunakan W32Dasm, aku menemukan lokasi perintah tersebut :
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00459919(C) ==> Lokasi pemanggil | :0045994A 3BC6 cmp eax, esi :0045994C 752B jne 00459979 :0045994E 6A10 push 00000010 * Possible StringData Ref from Data Obj ->"Fel kod" | :00459950 68F4BE4F00 push 004FBEF4 * Possible StringData Ref from Data Obj ->"Registreringen misslyckades!" | :00459955 68D4BE4F00 push 004FBED4
Perhatikan lokasi Unconditional Jump yang memanggil kode - kode perintah di atas, pergi ke lokasi tersebut dan perhatikan baris - beris perintahnya :
:004598C5 E88A510700 call 004CEA54 :004598CA A1804E5000 mov eax, dword ptr [00504E80] :004598CF 3BC6 cmp eax, esi :004598D1 7440 je 00459913 :004598D3 EB02 jmp 004598D7 * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00459892(C) | :004598D5 33F6 xor esi, esi
* Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004598D3(U) | :004598D7 8BCD mov ecx, ebp :004598D9 E892020000 call 00459B70 :004598DE 3BC6 cmp eax, esi :004598E0 A3804E5000 mov dword ptr [00504E80], eax :004598E5 742C je 00459913 :004598E7 8BCD mov ecx, ebp :004598E9 E892020000 call 00459B80 :004598EE 3BC6 cmp eax, esi :004598F0 A3804E5000 mov dword ptr [00504E80], eax :004598F5 741C je 00459913 :004598F7 8BCD mov ecx, ebp :004598F9 E8620E0000 call 0045A760 :004598FE 3BC6 cmp eax, esi :00459900 A3804E5000 mov dword ptr [00504E80], eax :00459905 740C je 00459913 :00459907 8BCD mov ecx, ebp :00459909 E8320F0000 call 0045A840 :0045990E A3804E5000 mov dword ptr [00504E80], eax * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:004598D1(C), :004598E5(C), :004598F5(C), :00459905(C) | :00459913 3935E8934F00 cmp dword ptr [004F93E8], esi :00459919 742F je 0045994A ;Lokasi pemanggil MessageBox
Perhatikan bahwa ternyata ada 4 Unconditional Jump yang dapat memicu munculnya MessageBox tersebut. Kita ngak akan bisa menentukan perintah Jump mana yang "bertanggung jawab" sebagai pemicu, oleh karena itu kita harus kembali menggunakan SoftICE untuk melakukan "live debuging". Ulangi langkah - langkah di awal tutorial ini dan telusuri kembali perintah - perintah tersebut sampai kamu menemukan Offset 004598C5. Dari sini, kamu sebaiknya mulai berhati - hati.
Pada Unconditional Jump yang pertama, program tidak melakukan lompatan tetapi pada Offset 004598E5, program melompat ke Offset 00459913 dan kemudian memicu munculnya MessageBox. Dari sini kamu bisa mengambil kesimpulan bahwa rutin pengecekan Serial Number, kemungkinan besar terletak pada rutin Call yang ada di Offset 004598D9.
Mari kita lihat apa isi rutin Call tersebut :
:00459B70 mov ecx, dword ptr [005043C0] :00459B76 xor eax, eax :00459B78 cmp dword ptr [ecx-08], 0000000F ;Panjang S/N = 0Fh ( 0Fh = 15 ) :00459B7C setg al ;Jika Panjang S/N > 0Fh maka AL = 01, jika tidak AL = 0 :00459B7F ret
Ternyata di dalam rutin call ini, panjang Serial Number yang kita masukan dibandingkan dengan panjang Serial Number yang valid ( 15 karakter ). Jika panjangnya lebih dari 15 karakter, maka AL di-set 01, jika tidak AL akan di-set 00. Setting AL inilah yang akan menentukan apakah Serial Number tersebut valid atau tidak berdasarkan panjangnya, jika AL = 00 berarti Serial Number tersebut tidak valid, sebaliknya, jika AL = 01 maka panjang Serial Number tersebut valid.
Karena itu kamu harus mengganti Serial Number palsu yang kamu masukan dengan Serial Number yang panjangnya sesuai, sebagai contoh, aku masukan Serial Number : '1234567890123456'
Ulangi lagi langkah - langkah di atas, pada pengecekan panjang Serial Number, Serial Number tersebut akan akan dianggap valid. Pada rutin call berikutnya, tekan F8 untuk masuk ke dalam rutin Call tersebut, mulai dari sinilah kesabaran kamu sebagai seorang Kraker akan diuji :-)
:00459B80 mov eax, dword ptr [005043C0] ;EAX = Serial Number palsu kita :00459B85 mov ecx, 00000063 :00459B8A mov dword ptr [00504DB4], ecx :00459B90 sub esp, 00000008 :00459B93 cmp byte ptr [eax], 30 :00459B96 jne 00459BA0 :00459B98 xor ecx, ecx :00459B9A mov dword ptr [00504DB4], ecx
.....dan seterusnya ;-)
Rutin Call ini cukup panjang, agar tutorial ini ngak terlalu panjang, aku akan cuman menuliskan kesimpulannya saja. Pada baris - baris perintah tersebut, setiap karakter akan diperiksa dan kemudian meletakannya pada lokasi memory yang sesuai :
[00504DB4] = Karakter 1 [00504DB0] = Karakter 2 [00504DAC] = Karakter 3 [00504DA8]= Karakter 4 [00504DA4] = Karakter 5 [00504DA0] = Karakter 6 Karakter ke 7 harus sama dengan 2Dh ( 2Dh = '-' ) [00504D9C] = Karakter 8 [00504D98] = Karakter 9 [00504D94] = Karakter 10 [00504D90] = EDI = Karakter 11 Karakter ke 12 harus sama dengan 2Dh ( 2Dh = '-' ) [00504D8C] = EBP = Karakter 13 [00504D88] = ESI = Karakter 14 [00504D84] = EDX = Karakter 15 [00504D80] = ECX = Karakter 16
Dari perintah - perintah tersebut, kita bisa mendapatkan gambaran format Serial Number yang valid yaitu ??????-????-???? Jadi sekarang, rubah serial number yang kamu masukan : 123456-8901-3456
Setelah penyimpanan karakter selesai, karakter - karakter tersebut akan diproses, :
:0045A64E lea eax, dword ptr [edi+4*edi] ;EAX = EDI + 4 * EDI :0045A651 lea eax, dword ptr [ebp+2*eax] ;EAX = EBP + 2 * EAX :0045A655 lea eax, dword ptr [eax+4*eax] ;EAX = EAX + 4 * EAX :0045A658 lea eax, dword ptr [esi+2*eax] ;ESI = ESI + 2 * EAX :0045A65B lea eax, dword ptr [eax+4*eax] ;EAX = EAX + 4 * EAX :0045A65E lea eax, dword ptr [edx+2*eax] ;EAX = EDX + 2 * EAX :0045A661 lea edx, dword ptr [eax+4*eax] ;EDX = EAX + 4 * EAX :0045A664 lea eax, dword ptr [ecx+2*edx] ;EAX = ECX + 2 * EDX :0045A667 mov edx, dword ptr [00504DB0] ;EDX = Karakter 2 :0045A66D mov dword ptr [00504D7C], eax ;[00504D7C] = '13456'
Apa maksud angka 13456 yang disimpan ke dalam [00504D7C] itu ??? Ingat, serial number yang terakhir kali kita masukan adalah 123456-8901-3456. Nah keliatan khan....ternyata angka 13456 itu adalah 4 angka terakhir dari serial number yang kita masukan. Lalu apa gunanya ???
Kalo kamu terus memperhatikan perintah - perintah selanjutnya, ternyata angka - angka yang lain dari serial number yang dimasukan oleh user ( terlepas dari valid ato tidaknya ) akan diolah melalui perhitungan tertentu dan akhirnya hasil perhitungan tersebut akan dibandingkan dengan 4 angka terakhir tersebut. Kedua barisan angka tersebut harus sama, jika tidak maka itu berarti serial number yang kita masukan salah. Berikut adalah perbandingan yang ada pada akhir proses perhitungan :
:0045A753 cmp ecx, edx
Untuk mengetahui isi ECX dan EDX, ketikkan '? ECX' dan '? EDX'
:? ecx00003490 0000013456 "4"
:? edx
0000DBEB 0000056299 "Ûë"
Dari perbandingan di atas, kamu bisa liat kalo ternyata berdasarkan perhitungan yang dilakukan program tersebut, 4 angka terakhir dari serial number kita harus sama dengan '56299'. Jadi serial number lengkapnya adalah : 123456-8905-6299
Coba masukan serial number tersebut....tapi serial number tersebut tetap ditolak, kenapa ??? Ternyata selain penghitungan yang telah dilakukan, program tersebut melakukan perhitungan lain berdasarkan nama yang dimasukan user.
:004598E9 call 00459B80 ;Perhitungan s/n yang sudah kita liat :004598EE cmp eax, esi :004598F0 mov dword ptr [00504E80], eax :004598F5 je 00459913 :004598F7 mov ecx, ebp :004598F9 call 0045A760 ;Perhitungan s/n berikutnya
Pada Offset 004598F9 di atas, tekan F8 untuk masuk ke dalam rutin Call tersebut. Di dalam rutin Call tersebut kamu bisa meliat perhitungan - perhitungan yang dilakukan dengan memakai karakter - karakter dari nama yang dimasukan oleh user. Pada akhir perhitungan tersebut, kamu akan meliat perintah Compare seperti di bawah ini :
:0045A831 cmp eax, edx
Seperti sebelumnya, periksa isi EAX dan EDX dengan perintah '?' :
:? eax
0000007B 0000000123 "{" ;3 angka pertama dari s/n kita
:? edx
0000037A 0000000890 "z" ;3 angka pertama yang seharusnya
Okeh...jadi serial number yang seharusnya adalah 890456-8905-6299 ??? Ternyata bukan....kenapa lagi nich ???
Ini karena, kita sudah mengganti 3 angka pertama, sedangkan pada perhitungan serial number yang pertama kali, hasil perhitungannya berdasarkan angka - angka pada serial number tersebut, jadi otomatis 4 angka terakhir, hasil perhitungan pertama, telah berubah. Telusuri kembali dan dapatkan 4 angka yang semestinya mengisi 4 angka terakhir dari serial number kamu.
K R A K |
Setelah melalui berkali - kali tracing yang melelahkan, akhirnya aku menemukan serial number yang tepat ( bagi aku ) :
Ange din personliga registreringskod : 890456-8901-3715 Ditt namn : CHuPaCaBRa
Catatan |
Sistem Proteksi seperti inilah yang cocok menjadi contoh bahwa seorang kraker harus memiliki kesabaran yang cukup untuk menelusuri setiap perintah - perintah yang ada.... ;-)
© Mei1999