Februari 1999

"Waste Whacker 3.2"

( KeyGen dengan Assembly )

Win '95 PROGRAM Win Code Reversing  

 

oleh

CHuPaCaBRa 

 

 

[eKH]

   

 

Program Target

Waste Whacker 3.2
1.13 MB
http://www.dbytes.com/

 
 

Tools Used:

SoftICE 3.24
Tasm & Tlink
SoftICE 2.80 or DOS ( optional )

 

Rating

Easy ( X )  Medium ( X )  Hard (    )  Pro (    ) 

There is a crack, a crack in everything. That's how the light gets in.

 


    "Waste Whacker 3.2"

( KeyGen dengan Assembly )

oleh

CHuPaCaBRa 
 

Intro

Mengikuti jejak flag eRRatum dengan tutorial - tutorial KeyGen-nya, di sini aku juga mencoba membuat tutorial pembuatan KeyGen. Sedikit perbedaan yang ada dengan tutorial - tutorial flag lainnya, aku menggunakan Assembly sebagai bahasa pemrograman untuk pembuatan KeyGen ini.

Pengenalan Program

Penjelasan singkat mengenai Waste Whacker :

"Waste Whacker automates the process of removing unwanted files from your hard drives. These files can be backup files created by many applications, temp files not removed by Windows or other programs, files with a zero-byte size, old Internet cache files, plus many others. All files types are customizable by the user. Files can be sent to the Recycle Bin, completely removed from the system, or archived for later retrieval. Additionally, Waste Whacker can be run during Windows bootup."

Program ini akan menampilkan tulisan "Trial Version...Purcahase it for $19.95" selama kita masih belum memasukan kode registrasi yang benar.

Essay 

Seperti biasa kita mmemulai dengan mengamati Progrtam Target kita. Waste Whacker menyediakan menu khusus untuk memasukan Nama dan S/N bagi User yang telah membeli s/w tersebut ( Option >> Register ). Jika kita memasukan Nama dan S/N yang salah, akan tampil sebuah MessageBox bertuliskan "Registration Failed" dan tetapi kita masih tetap diperbolehkan menggunakan Waste Whacker ( baik bukan ? ;-) )

Oke sekarang ulangi langkah di atas, masukan kembali Nama dan sembarang s/n, untuk tutorial ini, aku masukin :

    User Name                     : CHuPaCaBRa
    Registration Number     : 123454321

Sebelum menekan tombol OK, kita siapkan "Peralatan Perang" kita, masuk ke SoftICE dengan menekan Ctrl-D dan pasang Breakpoint di Hmemcpy ( BPX Hmemcpy ). Kenapa Hmemcpy ??? Aku pasang Hmemcpy karena Breakpoint ini secara umum diguanakan untuk mengambil inputan kita.

Tekan Ctrl-D kembali dan klik tombol OK. Kau akan "terlempar" masuk ke dalam SoftICE pada rutin Hmemcpy. Saat itu kau belum berada di badan program, karena itu tekan F12 beberapa kali sampai kau sudah masuk ke dalam program Waste Whacker.

Break due to BPX KERNEL!HMEMCPY
0177:00475545     MOV EDX,[EBP-0C]                     ==> Kita di sini

Ketik D EDX untuk melihat apa yang baru saja dibaca oleh Hmemcpy.

:d edx
017F:00C7DF60     31 32 33 34 35 34 33 32-31 00 C7 00 D8 DF C7 00     123454321.......

Hmmm....ternyata program target kita ini membaca s/n yang kita masukan terlebih dulu. Pasang Breakpoint di memory yang bersangkutan supaya SoftICE akan berhenti jika program mencoba mengakses s/n kita. Ketik BPM 017F:00C7DF60.

Sementara ini nama kita belum dibaca, tekan F5 satu kali, SoftICE kembali akan berhenti di dalam fungsi Hmemcpy. Tekan F12 beberapa kali sampai kamu kembali ke dalam badan program.

Break due to BPX KERNEL!HMEMCPY
0177:00475561     MOV EDX,[EBP-0C]                             ==> Kita di sini

Cek lagi apa yang tadi dibaca oleh Hmemcpy. Ketik D EDX kembali

:d edx
017F:00C7DF78     43 48 75 50 61 43 61 42-52 61 00 00 00 00 00 00     CHuPaCaBRa......

Pasang Breakpoint di memory tersebut, BPM 017F:00C7DF78

0177:00475564	LEA  EAX,[EBX+3C]
0177:00475567   CALL 00403BB0
0177:0047556C   LEA  ECX,[EBP-04]
0177:0047556F   MOV  EDX,[EBX+3C]
0177:00475572   MOV  EAX,[EBX+24]
0177:00475575   CALL 00474E9C
0177:0047557A   CMP  DWORD PTR [EBP-04],00    ==> Cek apa User sudah 
						  memasukan nama atau 
						  belum 

Buat menyingkat waktu, tekan F5, SoftICE akan berhenti jika Program mencoba mengakses Nama ataupun S/N yang kita masukan. Kamu bakal menemukan listing seperti ini :

0177:00474EF2  MOVZX ESI,BYTE PTR [EBP-09]   
0177:00474EF6  MOV   EAX,[EBP-08]
0177:00474EF9  MOV   AL,[ESI+EAX-01]         ==> AL = Karakter dari nama 
						      yang kita masukan
0177:00474EFD  CALL  00402980                ==> Rutin Call u/ merubah 
					         Huruf Kecil menjadi 
					         Huruf Besar
    0177:00402980  CMP AL,61                 ==> AL < 61h ( = "a" ) ???
    0177:00402983  JB  0040298D 	     ==> Lompat, jika YA !
    0177:00402985  CMP AL,7A                 ==> AL > 7Ah ( = "z" ) ???
    0177:00402988  JA  0040298D 	     ==> Lompat, jika YA !
    0177:0040298A  SUB AL,20                 ==> AL = AL - 20h
    0177:0040298D  RET
0177:00474F02  ADD  AL,D0
0177:00474F04  SUB  AL,0A
0177:00474F06  JB   00474F0E 
0177:00474F08  ADD  AL,F9
0177:00474F0A  SUB  AL,1A
0177:00474F0C  JAE  00474F2F 
0177:00474F0E  MOV  EAX,[EBP-08]
0177:00474F11  MOV  AL,[ESI+EAX-01]
0177:00474F15  CALL 00402980                ==> Perhatikan Rutin Call 
					        di atas      
0177:00474F1A  MOV  EDX,EAX		    
0177:00474F1C  LEA  EAX,[EBP-1C]	    
0177:00474F1F  CALL 00403D00		    
0177:00474F24  MOV  EDX,[EBP-1C]	    
0177:00474F27  LEA  EAX,[EBP-10]	    
0177:00474F2A  CALL 00403DE0	            
0177:00474F2F  INC  BYTE PTR [EBP-09]       ==> [EBP-09] = [EBP-09] + 1
0177:00474F32  DEC  BL
0177:00474F34  JNZ  00474EF2                ==> Looping sampai semua 
					        Karakter dari User Name 
					        telah dirubah menjadi 
					        Huruf Besar

Mungkin kamu rada bingung ngeliat ada baris perintah yang ngak aku beri komentar....ini aku sengaja, karena baris - baris perintah itu tidak terlalu dibutuhkan pada saat pembuatan KeyGen nantinya :-)

0177:00474F4B  CALL 00403DD8                    ==> Rutin Call untuk meng-
						    hitung Panjang Nama
0177:00474F50  MOV  [EBP-15],AL                 ==> [EBP-15] = Panjang Nama
0177:00474F53  MOV  BYTE PTR [EBP-09],0C        ==> Panjang S/N = 0Ch 
						    ( = 12 karakter )
0177:00474F57  XOR  EAX,EAX                     ==> Kosongkan register EAX
0177:00474F59  MOV  AL,[EBP-15]                 ==> AL = Panjang Nama
0177:00474F5C  CALL 00402BA4                    ==> Rutin Call untuk memi-
						    lih Karakter Nama yang 
						    akan "diolah".
    0177:00402BA4  IMUL EDX,[004BA040],08088405 ==> EDX=2ED03ED0h*08088405h
    0177:00402BAE  INC  EDX                     ==> EDX = EDX + 1
    0177:00402BAF  MOV  [004BA040],EDX          ==> [004BA040] = EDX
    0177:00402BB5  MUL  EDX                     ==> EAX = EAX mul EDX
    0177:00402BB7  MOV  EAX,EDX                 ==> EAX = EDX
    0177:00402BB9  RET                                           
0177:00474F61  INC  EAX                         ==> EAX = EAX + 01h
0177:00474F62  AND  EAX,000000FF                ==> EAX = EAX and 000000FFh
0177:00474F67  MOV  EDX,[EBP-10]                ==> EDX = User Name
0177:00474F6A  MOV  BL,[EAX+EDX-01]             ==> BL  = Karakter Name pada
						    posisi [EAX + EDX + 01]
0177:00474F6E  TEST BL,BL
0177:00474F70  JBE  00474F83
0177:00474F72  MOV  EAX,0000000A                ==> EAX = 0000000Ah
0177:00474F77  CALL 00402BA4                    ==> Rutin Call ini sekarang
						    digunakan untuk
						    menghitung S/N.
0177:00474F7C  MOV  [EBP-0A],AL                 ==> Hasil Rutin Call di atas 
						    dimasukan ke [EBP-0A]
0177:00474F7F  DEC  BL                          ==> BL = BL - 1
0177:00474F81  JNZ  00474F72                    ==> Looping selama BL <> 0 
0177:00474F86  XOR  EAX,EAX 			  ==> Kosongkan Register EAX
0177:00474F88  MOV  AL,[EBP-0A]         	  ==> AL = [EBP-0A]
0177:00474F8B  CALL 0040875C            	 ==> Merubah nilai AL yang 
						    berbentuk Hexa menjadi 
						    angka Decimal
0177:00474F90  MOV  EDX,[EBP-1C]
0177:00474F93  LEA  EAX,[EBP-14]
0177:00474F96  CALL 00403DE0            	==> [EBP-14] = AL
0177:00474F9B  DEC  BYTE PTR [EBP-09]   	   ==> [EBP-09] = [EBP-09] - 1
0177:00474F9E  JNZ  00474F57            	==> Looping selama 12 kali.

Langkah di atas ( 00474F57 - 00474F9E ) akan diulang sebanyak 12 kali hingga mendapatkan sebuah serial number. Setelah keluar dari looping di atas, coba liat apa isi [EBP-14]. Ketik D *(EBP-14)

:d *(ebp-14)
017F:00C7A3E4     37 37 31 38 31 37 33 32-38 31 32 35 00 A4 4B 00     771817328125..K.

Itu dia serial number-nya :-) Disable semua Breakpoint ( BD * ) dan kembali ke Waste Whacker, register menurut nama dan serial number yang sudah tampak tadi dan hasilnya......SUKSES :-)

K e y G e n Z 

.Ok....now is the hard part :-) Berikut adalah listing Assembly untuk pembuatan KeyGen :.

; Waste Whacker 3.2 Key Generator.
; CHuPaCaBRa - 140299
; eRRatum Krak House - http://all.at/ekh
;Gunakan Tasm dan Tlink untuk meng-compile file *.asm ini
;========================================================================
.MODEL SMALL
.STACK 100h
.386P					;Menggunakan register 32-bit
.DATA
input   DB 22h,0                   
Prompt  DB 'User Name : ','$'
Err1    DB 'U must enter a name !','$'
lf      DB 0ah,0dh,'$'
Tamp    DD 2ED03ED0h
Tamp2   DB ?
logo    DB 0ah,0dh, '>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<',0ah,0dh
	DB          '>>                                        <<',0ah,0dh
	DB          '>>    Waste Whacker 3.2 Key Generator     <<',0ah,0dh
        DB          '>>          Kraked by CHupaCaBRa          <<',0ah,0dh
	DB          '>>           eRRatum Krak House           <<',0ah,0dh
        DB          '>>        -= http://all.at/ekh =-         <<',0ah,0dh
        DB          '>>                                        <<',0ah,0dh
        DB          '>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<',0ah,0dh
	DB 0ah,0dh,'$'
        
.CODE
START:
	MOV	AX,@DATA
	MOV	DS,AX
	MOV	ES,AX	
	LEA	EDX,[logo]
	MOV	AH,09h
	INT	21h				;Tampilkan Logo	
	LEA	EDX,[prompt]
	MOV	AH,09h
	INT	21h				;Tampilkan Prompt	
	LEA	EDX,[input]		 
	MOV	AH,0Ah
	INT	21h				;Ambil Nama yang di-input	
	LEA	EDX,[lf]
	MOV	AH,09h
	INT	21h                     	;Turun Satu Baris	
	CMP	BYTE PTR [input+1],00
	JE	error				;Lompat jika nama koosng	
	LEA	EDI, input+1
	XOR	EAX, EAX
        MOVZX   ECX,BYTE PTR [EDI]           	;Ambil panjang Nama.
        PUSH    ECX				;Simpan di dalam Stack
	
Konvert:
        MOV     BL, BYTE PTR [EDI+EAX+01]	;BL = Karakter Nama
        TEST    BL, BL
        JZ      KeyGen
        CMP	BL, 61h				;BL > 61h ( = 'a' ) ???
	JB	Hrf_Besar
	CMP	BL, 7Ah				;BL < 7Ah ( = 'z' ) ???
	JA	Hrf_Besar
	SUB	BL, 20h				;BL = BL - 20h
        MOV     BYTE PTR [EDI+EAX+01],BL	;Ganti huruf kecil dengan 
                                                ;huruf besar 
Hrf_Besar:
	INC	EAX				;EAX = EAX + 1
        LOOP    Konvert				;Looping sebanyak Karakter 
                                                ;Nama        
	MOV     ECX, 0Ch                        ;"KeyGen" diulang 12 kali
KeyGen:
	XOR	EDX, EDX			;Kosongkan register EDX
        XOR     EAX, EAX			;Kosongkan register EAX
	POP	EBX				;Ambil panjang Nama dari 
                                                ;dalam Stack
	MOV	AL, BL				;AL = BL
	PUSH	EBX				;Simpan Panjang Nama 
                                                ;ke dalam Stack kembali
	CALL	@Proses				;Jalankan "Proses"
	INC	EAX				;EAX = EAX + 1
	AND	EAX, 000000FFh			;EAX = EAX and FFh
        MOV     BL, [EAX+EDI]			;BL=Karakter Nama pada 
                                                ;   posisi [EAX + EDX + 01]
Loop1:	
	MOV	EAX, 0Ah			;EAX = 0Ah
	CALL	@Proses				;Jalankan "Proses"
        MOV     Tamp2, AL			;Tamp2 = AL
	DEC	BL				;BL = BL - 1
	JNZ	Loop1				;Looping selama BL <> 0
        ADD     [Tamp2], 30h			;Rubah Tamp2 yang berbentuk 
                                                ;Hexa menjadi angka Decimal
        MOV     DL, [Tamp2]
        MOV     AH, 02h
        INT     21h				;Tampilkan nilai Decimal 
                                                ;tersebut
        DEC     ECX				;ECX = ECX - 1
        JNZ     KeyGen				
        JMP     Selesai
error:
        LEA     EDX,[Err1]
	MOV	AH,09h
	INT	21h				;Tampilkan Err1	
Selesai:
	MOV	AX,4C00h
	INT	21h				;Exit Program
@Proses:					;Procedure "Proses"
        IMUL    EDX, Tamp, 08088405h
	INC	EDX
        MOV     Tamp, EDX
	MUL	EDX
	MOV	EAX, EDX
	RET
END START

Catatan Singkat 

Untuk mendapatkan serial number Waste Whacker relatif mudah tetapi membuat KeyGen-nya ternyata lebih sulit dari yang aku duga :-) Semula aku mencoba membuat KeyGen dengan menggunakan Turbo C / C++, ternyata bahasa pemrograman ini ngak bisa mengatasi besarnya angka yang terlibat di dalam pembuatan s/n tersebut. Oleh karena itu, jalan satu - satunya adalah dengan menggunakan Assembly. Keuntungan dari program KeyGen yang menggunakan Assembly adalah ukuran file-nya yang jauh lebih kecil, tapi di lain pihak, tingkat kesulitannya lebih tinggi daripada membuat KeyGen dengan bahasa pemrograman tingkat tinggi seperti Pascal atau Turbo C /  C++. So...choose your language wisely :-)

Setelah mempelajari beberapa tutorial Kraking yang menggunakan Assembly sebagai bahasa pemrograman, aku mencoba membuat KeyGen Waste Whacker dan ternyata sukses....lumayanlah buat newbie kaya' aku ini :-)

Selain itu, untuk menyelesaikan KeyGen tersebut, aku juga mendapat bantuan dari SoftICE 2.80 ( DOS Version ),great tools to debug DOS program...... :-)

Kalo kamu pengen nyoba ngeKrak program lain dengan proteksi serupa, kamu bisa mencoba product DBytes lainnya di http://www.dbytes.com/

GreetZ 

GreetZ buat Kraker - Kraker Asia ;-)

<*~ MTFBWY ~*>

 

Copyright 021999 - CHuPaCaBRa [eKH]