DLL Demon 1.0

http://members.aol.com/progency

SoftICE 3.24
W32Dasm 8.93

oleh

CHuPaCaBRa

 

Pengenalan Program

DLL Demon adalah program Utillity yang akan menampilkan semua proses yang sedang berlangsung di komputer kita di dalam sebuah tabel, bersama dengan modul yang terlibat di dalamnya. Selain itu dengan DLL Demon, kita dapat memanipulasi proses yang sedang berjalan tersebut.

S/W ini hanya dapat dipakai dalam jangka waktu 30 hari. Dalam jangka waktu tersebut diharapkan User yang menggunakannya telah mendaftarkan diri. Setelah membayar sejumlah uang, user akan mendapatkan s/n-nya dan dapat diisikan di dalam Registration Box, yang dapat diakses melalui menu Help. Di sini User diminta untuk memasukan Nama dan s/n. Berdasarkan nama yang dimasukan tersebut, DLL Demon melakukan perhitungan tertentu, menghasilkan s/n yang unik bagi setiap user.

Essay

Oke kita mulai......

Langkah pertama, seperti biasa jalankan DLL Demon dalam keadaan normal dan catat hal - hal yang kamu anggap penting.DLL Demon akan menampilkan sebuah Message Box bertuliskan "Invalid" tiap kali s/n yang dimasukan tidak tepat, pesan inilah yang akan kita rubah.

Langkah berikutnya adalah mendisassembly DLL Demon ini. Gunakan W32Dasm 8.93 untuk mengkonvert file DLLDemon.exe menjadi listing assembly. Setelah selesai, carilah string "Invalid" dalam listing itu dengan menggunakan fasilitas String Data References yang tersedia di WDasm. Klik 2 kali pada tulisan "String" di dalam kotak String Data References dan kamu akan dibawa menuju perintah - perintah yang berhubungan dengan string tersebut :

:00461AF6 E839EBFBFF   call 00420634
:00461AFB 8B45F4       mov eax, dword ptr [ebp-0C]
:00461AFE 8D4DF8       lea ecx, dword ptr [ebp-08]
:00461B01 33D2         xor edx, edx
:00461B03 E8C45B0000   call 004676CC
:00461B08 8B55F8       mov edx, dword ptr [ebp-08]
:00461B0B 58           pop eax
:00461B0C E87F21FAFF   call 00403C90               ;Pengecekan S/N
:00461B11 7424         je 00461B37                 ;Lompat jika S/N cocok
:00461B13 6A10         push 00000010

* Possible StringData Ref from Code Obj ->"Error"
|
:00461B15 B9A41B4600   mov ecx, 00461BA4
* Possible StringData Ref from Code Obj ->"Invalid"
:00461B1A BAAC1B4600   mov edx, 00461BAC             ;Kita ada di sini
:00461B1F A100B04600   mov eax, dword ptr [0046B000]
:00461B24 8B00         mov eax, dword ptr [eax]
:00461B26 E821E8FCFF   call 0043034C
:00461B2B C7835001000002000000 mov dword ptr [ebx+00000150], 00000002
:00461B35 EB0F         jmp 00461B46

Perhatikan listing assembly di atas, Offset 00461B1A - 00461B35 adalah perintah - perintah yang akan menghasilkan Messagebox bertulisakn "Invalid". Telusuri perintah - perintah di atasnya, seharusnya rutin pengecekan serial numbernya ngak akan terlalu jauh dari Offset tersebut.

Pada Offset :00461B11 ada sebuah Conditional Jump yang menarik. Kenapa menarik ??? Ini karena perintah tersebut akan merubah alur program tersebut sehingga apa yang akan ditampilkan ke layar monitor kita bisa berbeda, MessageBox bertuliskan Invalid ataukah sebuah MessageBox yang berisi pesan - pesan "Thank you...bla bla bla ". Tapi mucul pertanyaan lain, bagaimana ia bisa menentukan MessageBox mana yang akan ditampilkan ???

Perintah JE ( Jump If  Equal ) ini akan dijalankan apabila Call di atasnya memberi isyarat bahwa s/n yang kta masukan adalah s/n yang tepat. Keliatannya jelas sekali apa yang harus aku lakukan, dengan mengganti JE menjadi JNE, masalah akan selesai.  Benarkah demikian ? Baiklah kita coba......

Ada beberapa cara untuk merubah JE menjadi JNE, untuk cara nomer 2 dan 3, kita harus terlebih dulu berada di dalam lingkungan SoftICE. Sebelum menekan tombol "Register Me", tekan CTRL-D dan pasang Breakpoint pada Hmemcpy ( BPX Hmemcpy ) lalu CTRL-D lagi untuk kembali ke Windows. Setelah menekan tombol "Register Me", kita akan terlempar ke dalam SoftICE, tekan F12 sebanyak 7 kali setelah itu bersihkan Breakpoint dengan BC *. Kemudian ketik G 0461B11 untuk langsung menuju lokasi yang dimaksudkan...baru setelah itu jalankan cara nomer 2 ato nomer 3.

Cara untuk merubah JE menjadi JNE ( pilih salah satu ) :

  1. Dengan Hex Editor dan rubah 7424 menjadi 7524
    * Catatan *
        74xx = JE ( Jump If Equal )
        75xx = JNE ( Jump If Not Equal )
  2. Dengan SoftICE, ada 2 cara :

Tapi ternyata tidak semudah itu, pesan "Invalid" memang tidak tampak lagi tetapi kita masih belum teregister :-( Ini terjadi karena nama dan s/n palsu kita tidak dimasukan ke dalam System Registry sehingga pada saat DLL Demon mengecek System Registry dan tidak menemukannya, kita akan tetap dianggap sebagai Unregistered User.

Kalo begitu kita harus menggunakan pendekatan lain, untuk itu kembali ke WDasm. Coba kita telusuri perintah - perintah sebelum Call 00403C90 dipanggil, perhatikan Offset :00461B08. Nilai apakah yang dimasukan ke dalam EDX ??? Untuk mengetahui jawabannya gunakan SoftICE.

Gunakan cara yang telah dijelaskan sebelumnya untuk masuk ke dalam SoftICE dan memasang BPX Hmemcpy. Setelah terperangkap kembali di dalam SoftICE dan menekan F12 sebanyak 7 kali, lompat ke Offset 00461B08 dengan perintah G 00461B08.

Setelah berhenti tepat pada posisi 00461B08, tekan F10 satu kali, setelah melewati baris perintah tersebut, periksa nilai EDX sekarang dengan perintah D EDX. Ternyata......EDX berisi s/n yang sesungguhnya, mudah sekali mendapatkan s/n aslinya :-)

Kalo kamu mau, kamu bisa langsung menggunakan s/n tersebut tapi itu bukan tujuan kita, kita ingin "meminta" DLL Demon menampilkan s/n asli tersebut sebagai pengganti pesan "Invalid" yang muncul apabila kita memasukan s/n yang salah. Bagaimana caranya ???

Oke....sekarang kita tahu dimana s/n asli kita di simpan di dalam memory, DLL Demon menyimpan s/n tersebut pada alamat memori yang ditunjuk oleh [EBP-08], sementara itu pada perintah di bawahnya POP EAX, program akan mengambil s/n palsu yang kita masukan tadi dari dalam stack. Lanjutkan kembali, tekan F10 sampai mencapai lokasi :00461B11, tempat penentuan pilihan antara Registered ato Unregistered User. Karena s/n yang kita masukan tadi salah, kita tentunya tidak akan melompat ke 00461B37, tapi terus ke baris berikutnya.

Dalam WDasm, lokasi :00461B15 adalah tempat untuk memasukan string "Error", ingin tahu apa yang terjadi dalam SoftICE ? Ketik D ECX, ternyata ECX berisi string "Error". Pada baris berikutnya, dengan cara yang sama, kita bisa melihat bahwa EDX berisi string "Invalid" .

Sampai di sini sebaiknya kita berhenti sebentar , dan liat kembali apa yang telah kita ketahui sebelumnya lalu coba menyusun langkah selanjutnya :

:00461B08 mov edx, dword ptr [ebp-08]      ;s/n asli
:00461B0B pop eax                          ;s/n palsu yang kita masukan
:00461B0C call 00403C90                    ;Rutin pembandingan s/n
:00461B11 je 00461B37                      ;Lompat jika s/n cocok
:00461B13 push 00000010
:00461B15 mov ecx, 00461BA4                ;menyimpan string "Error"
:00461B1A mov edx, 00461BAC                ;menyimpan string "Invalid"

Perintah - perintah selanjutnya akan menampilkan MessageBox dengan string yang ada di dalam EDX atau ECX, sementara kita tidak ingin "Invalid" atau "Error" yang muncul, tapi kita ingin melihat s/n asli kita sebagai gantinya. Untuk itu kita perlu mengganti pesan "Invalid" yang diisikan ke dalam EDX dengan alamat memori tempat s/n asli kita berada.

SoftICE memberikan fasilitas untuk merubah perintah assembly yang sedang ditelusuri, yaitu dengan perintah A :

Ketik A 00461B1A, lalu masukan perintah - perintah baru seperti di bawah ini :

:00461B1A MOV EDX,[EBP-08]
:00461B1D NOP
:00461B1E NOP
:00461B1F 		;tekan Enter untuk menghentikan perintah A

Catatan :

Perintah A ini tidak merubah file secara permanen, karena itu, apabila terjadi kesalahan, kamu hanya perlu me-restart program tersebut dan semuanya kembali ke keadaan semula.

Seperti yang terlihat, kita telah memasukan s/n asli kita ke dalam EDX agar ditampilkan di dalam Messagebox yang akan keluar. Dua perintah NOP berikutnya adalah perintah tambahan agar tidak terjadi kesalahan. Ini perlu dilakukan karena adanya  perbedaan ukuran antara perintah sebelumnya dengan perintah yang baru saja kita masukan. Perhatikan perbedaan kedua perintah tersebut :

:00461B1A BAAC1B4600    mov edx, 00461BAC 

dengan

:00461B1A 8B55F8        mov EDX,[EBP-08] 

Perhatikan bahasa mesin di atas ( kode hexa ), perintah pertama membutuhkan 5 byte (BAAC1B4600) sedangkan perintah baru yang kita isikan hanya sebesar 3 byte (8B55F8). Dalam merubah ( patching ) suatu program, perintah asli dan perintah baru harus memiliki ukuran yang sama, hal ini untuk menghindari error pada saat menjalankan program tersebut . Oleh karena itu kita harus menambah 2 byte tambahan yaitu NOP (90) sebanyak 2 kali sehingga sekarang perintah baru tersebut juga berukuran 5 byte (8B55F89090).

Catatan :

NOP ( No Operation ) adalah perintah Assembler dengan kode hexa 90h. Besarnya perintah ini adalah 1 byte dan tidak melakukan operasi apa - apa. Ini sangat tepat untuk ditambahkan ke dalam perintah baru kita yang tidak sesuai ukurannya.

Tekan Ctrl-D kembali dan lihat hasilnya. Pada MessageBox yang keluar, pesan "Invalid" sudah tidak terlihat lagi, sebagai gantinya, s/n asli kita ditampilkan. Gunakan nama dan s/n yang muncul tersebut dan kita akan dianggap sebagai Registered User

K R A K

Untuk mempatch program tersebut, edit DLLDemon.EXE dengan Hex Editor yang kamu punya dan cari :
BAAC1B4600.

00060F1A    BA AC 1B 46 00 A1 00 B0 46 00 8B 00 E8 21 

Rubah dengan :

00060F1A    8B 55 F8 90 90 A1 00 B0 46 00 8B 00 E8 21

 

Catatan

Metode ini cukup mudah untuk dilaksanakan tetapi sayangnya tidak semua sistem proteksi sejenis, dapat dikrak dengan cara ini. Sebelum kamu merubah perintah dalam program target, kamu harus terlebih dulu yakin kalo s/n asli tadi masih ada pada lokasi memori yang sama. Karena jika serial number tersebut telah hilang dari memory, kita ngak akan bisa menampilkan-nya.

Ini yang aku lakukan pada komputerku untuk mengecek posisi s/n pada program DLL Demon 1.0, ikuti langkah - langkah berikut ini, angka - angkanya mungkin akan berbeda dengan apa yang kamu liat di komputer kamu..

:00461B08  mov edx, dword ptr [ebp-08] 

Setelah mencapai lokasi di atas, ketik D [EBP-08], dan inilah hasilnya :

0030:006EF994 A4 B6 83 00 E4 BB 83 00 - 9C 67 83 00 67 10 42 00     .........g..g.B.
Maksud dari [EBP-08] adalah untuk mengarahkan pointer pada alamat yang ditunjuk oleh EBP-08, karena itu kamu harus menuju ke alamat yang ada di dalam EBP-08, dalam contoh ini adalah 0083B6A4 ( posisinya harus dibalik ).

Ketik D 0083B6A4, dan hasilnya adalah :

0030:0083B6A4    44 53 37 31 2D 31 33 39 - 34 2D 33 34 00 00 00 00  DS72-8422-210....

Yang berada di kolom paling kanan adalah s/n asli kita. Setelah sampai pada lokasi 00461B1F, cek kembali isi dari [EBP-08] dengan cara yang sama. Apabila s/n tersebut masih ada berarti kamu bisa menggunakan metode ini tapi jika s/n tersebut sudah tidak ada lagi ato sudah berubah maka metode ini tidak dapat dilaksanakan.

Gunakan langkah pengecekan seperti di atas untuk program - program target yang lainnya untuk memeriksa keberadaan s/n sebelum menggunakan metode kraking ini. Metode ini dapat digunakan pada sebagian besar produk  Progency.

 

chupacabra@softhome.net

© Mei1999