My Personal Diary 6.50

http://www.camdevelopment.com

SoftICE 3.24

oleh

CHuPaCaBRa

 

Pengenalan Program

Program ini di-request ama salah satu temenku, dan ternyata Sistem Proteksi yang mereka gunakan sangat bagus untuk dijadikan latihan bagi para Kraker pemula :-)

My Personal Diary adalah sebuah program diary dimana user dapat menyimpan kenangan - kenangan pribadinya. Untuk dapat menggunakan program ini dengan sempurna, seorang user harus membeli Serial Numbernya dan mengisikannya pada tempat yang telah disediakan.

Essay

Proses Registrasi membutuhkan pemasukan Nama, Company dan Serial Number dari User, untuk tutorial ini aku masukan namaku :

	Name    : CHuPaCaBRa
	Company : eKH
	Serial  : 123454321

Sebelum menekan tombol OK, masuk dulu ke SoftICE dan pasang Breakpoint pada fungsi - fungsi API yang dicurigai seperti GetWindowTextA, GetDlgItemTextA, GetDlgItemInt. Apabila fungsi - fungsi tersebut tidak digunakan, kamu bisa pasang Breakpoint pada Hmemcpy.

Okeh...setelah semuanya siap, kembali ke Windows dan klik OK. Kamu bakalan terlempar ke dalam fungsi GetDlgItemTextA, ternyata fungsi inilah yang beruntung sekarang :-) Tapi kita ngak akan berkutat di dalam fungsi ini, karena itu tekan F12 sekali untuk keluar ke badan program My Personal Diary.

:00466359 Call 0047DE62        		;Fungsi GetDlgItemTextA
:0046635E mov ecx, dword ptr [ebx+19]   ;Kamu di sini
:00466361 push ecx			;Masukan ECX ke Stack

Kalo kamu cek apa isi ECX, kamu ngak akan menemukan lokasi Serial Number kamu di Memory, oleh karena itu kamu harsu mencarinya secara manual. Untuk itu, ketikkan perintah :

:s 0 l ffffffff '123454321'
Pattern found at 017F:0073F478 (0073F478)

Oke, itu berarti Serial Number kamu diletakkan pada 017F:0073F478 di Memory ( alamat tersebut mungkin berbeda di komputer kamu ). Pasang Breakpoint di lokasi memory itu dengan perintah BPM 017F:0073F478

Tekan F10 untuk tracing, pada saat kamu menekan F10 di atas rutin call di Offset 00465068, kamu akan terlempar ke dalam fungsi LStrLenA. Fungsi ini berguna untuk menghitung panjang Serial Number yang dimasukan User. Seperti fungsi GetDlgItemTextA, kita ngak butuh lama - lama di dalam fungsi ini. Tekan F12 lagi sampai kamu masuk kembali ke badan program :

:004650E2 mov ebx, eax        		;EBX = Panjang S/N Palsu kita
:004650E4 lea eax, dword ptr [ebp-4C] 	
:004650E7 push eax            		;Ketik D EAX untuk melihat isi EAX
:d eax
017F:0073E25C 4D 50 44 36 2D 40 3F 3F-3F 3F 3F 3F 2D 43 41 4D MPD6-@??????-CAM1

Hmm.....apa MPD6-@??????-CAM1 ini Serial Number yang valid ??? Tekan F10 lagi untuk melanjutkan tracing ke baris perintah berikutnya :

:004650E8 Call 0047DBBC
:004650ED cmp ebx, eax        		;Ketik ? EBX and ? EAX
:? ebx
00000009 0000000009 "    " 		;Panjang S/N Palsu yang kita masukan
:? eax
00000011 0000000017 "" 		;Panjang S/N yang valid

Nah dari sini kamu bisa ngambil kesimpulan kalo panjang Serial Number yang seharusnya dimasukan adalah 17 karakter dan dengan format MPD6-*******-CAM1 ( ******* : bisa kamu isi apa aja ).

Kita coba lagi, masukan Serial Number yang sesuai, sebagai contoh, aku masukan MPD6-1234567-CAM1 sebagai Serial Number yang baru. Ulangi langkah - langkah di atas. Pada saat pengecekan panjang Serial Number, Serial Number yang aku masukan dianggap valid karena panjangnya sesuai, pada baris - baris berikutnya kamu bakal ngeliat seperti ini :

:00465104 mov al, byte ptr [ebx]    	;AL  = Karakter dari S/N yang valid
:00465106 movsx edx, al        		;EDX = AL
:00465109 cmp edx, 0000003F        	;Apakah EDX = 3F hexa (3Fh = '?' )
:0046510C je 0046511E            	;Jika ya, lompat ke 0046511E
:0046510E cmp edx, 00000040        	;Apakah EDX = 40 hexa (40h = '@' )
:00465111 je 0046511E            	;Jika ya, lompat ke 0046511E
:00465113 mov ecx, dword ptr [ebp-04]   ;ECX = Karakter dari S/N Palsu
:00465116 cmp al, byte ptr [ecx]    	;Bandingkan AL dengan ECX
:00465118 je 0046511E            	;Jika sama, lompat ke 0046511E
:0046511A xor edi, edi            	;Jika tidak, EDI = 0
:0046511C jmp 00465134            	;Lompat ke 00465134
:0046511E inc esi            		;ESI = ESI + 1
:0046511F inc [ebp-04]            	;[EBP-04] = [EBP-04] + 1
:00465122 inc ebx            		;EBX = EBX + 1
:00465123 lea eax, dword ptr [ebp-4C]   ;EAX = S/N Palsu
:00465126 push eax            		;Push EAX ke dalam Stack
:00465127 Call 0047DBBC        		;Periksa panjang S/N Palsu
:0046512C cmp esi, eax            	;Apakah ESI = EAX ?
:0046512E jl 00465104            	;Jika ESI < EAX, looping ke atas

Potongan program di atas berfungsi untuk mengecek apakah Serial Number yang kita masukan, memiliki format yang sama dengan Serial Number yang valid, yaitu MPD6-@??????-CAM1. Khusus untuk bagian '@??????', tidak akan dicek karena seperti yang udah aku tulis di atas, bagian itu bisa diisi dengan apa aja.

Pada baris perintah berikutnya :

:0046514C mov edx, dword ptr [ebp-08]	;EDX = Format S/N yang valid
:0046514F movsx ecx, byte ptr [edx]    	;ECX = Karakter dari S/N yang valid
:00465152 cmp ecx, 00000040        	;Apakah ECX = 40 hexa (40h = '@')
:00465155 jne 00465199            	;Jika tidak, lompat ke 00465199
:00465157 movsx ecx, byte ptr [ebx]    	;ECX = '2' ( '2' = 32 hexa )
:0046515A movsx eax, byte ptr [ebx+01] 	;EAX = '3' ( '3' = 33 hexa )
:0046515E add ecx, eax            	;ECX = ECX + EAX = 32h + 33h = 65h
:00465160 movsx edx, byte ptr [ebx+02] 	;EDX = '4' ( '4' = 34 hexa )
:00465164 add ecx, edx            	;ECX = ECX + EDX = 65h + 34h = 99h
:00465166 movsx eax, byte ptr [ebx+03] 	;EAX = '5' ( '5' = 35 hexa )
:0046516A add ecx, eax            	;ECX = ECX + EDX = 99h + 35h = CEh
:0046516C movsx edx, byte ptr [ebx+04] 	;EDX = '6' ( '6' = 36 hexa )
:00465170 add ecx, edx            	;ECX = ECX + EDX = CEh + 36h = 104h
:00465172 movsx eax, byte ptr [ebx+05] 	;EAX = '7' ( '7' = 37 hexa )
:00465176 add ecx, eax            	;ECX = ECX + EAX = 104h + 37h = 13Bh
:00465178 mov eax, ecx            	;EAX = ECX = 13B hexa
:0046517A mov ecx, 0000001A        	;ECX = 1A hexa
:0046517F cdq                		;Bersihkan EDX
:00465180 idiv ecx            		;EAX = EAX idiv ECX,EDX = sisa = 03h
:00465182 add edx, 00000041        	;EDX = EDX + 41h = 03h + 41h
:00465185 mov ecx, edx            	;ECX = EDX = 44 hexa
:00465187 mov al, byte ptr [ebx-01]    	;AL = '1' ( dari S/N palsu )
:0046518A test al, al        
:0046518C je 00465195
:0046518E movsx edx, al        		;EDX = AL = 44h ( 44h = 'D' )
:00465191 cmp ecx, edx            	;Apakah ECX = EDX ?
:00465193 je 00465199            	;Jika tidak, maka S/N kita salah !

Baris - baris perintah di atas bertugas untuk mengecek apakah Serial Number yang kita masukan sesuai dengan "rumus" Serial Number yang valid. Potongan Serial Number yang diperiksa adalah '1234567'.

Pada Offset 00465157 sampai  00465176, potongan Serial Number kita dijumlahkan ( kecuali karakter pertama dari potongan tersebut). Angka yang dijumlahkan bukan angka decimal-nya tapi angka dalam Hexadecimal. Pada Offset 00465180, hasil penjumlahan itu dibagi dengan 1A hexa. Dengan perintah IDIV, hasil pembagian dimasukan ke dalam EAX sementara sisa pembagian dimasukan ke dalam register EDX. Sisa pembagian itu ditambahkan dengan 41 hexa. Hasil penjumlahan inilah yang kemudian dibandingkan dengan karakter pertama dari potongan Serial Number kita.

Pada contoh Serial Number yang aku masukan ( MPD6-1234567-CAM1 ), Serial Number yang seharusnya adalah MPD6-D234567-CAM1. Masukan Serial Number itu dan....sukses :-)

 

K R A K

Program ini tidak membutuhkan KeyGen khusus karena nama user tidak dibutuhkan dalam pembuatan Serial Number, yang penting Serial Number yang dimasukan sesuai dengan "rumus" yang telah ditentukan :

	Name 	: < apa aja >
	Company : < apa aja >
	Serial 	: MPD6-D234567-CAM1

Catatan

Sistem Proteksi seperti ini cukup menarik karena mengandalkan pada "rumus" tertentu untuk menentukan apakah Serial Number yang dimasukan oleh User adalah Serial Number yang valid atau tidak. Tetapi khusus untuk program ini, Sistem Proteksi mereka terlalu mudah untuk ditembus karena "rumus" yang mereka terapkan terlalu pendek dan sederhana.

 

chupacabra@softhome.net

© Mei1999