AudioCart 2.21

http://www.zillenbiller.de/audiocart/home.html

SoftICE 3.24
Hex Editor

oleh

CHuPaCaBRa

 

Pengenalan Program

Berikut adalah penjelasan mengenai AudioCart ( dikutip dari Softseek ) :

"AudioCart is an audio file player that resembles an old-fashioned cart machine"

Program ini mendukung file - file WAV, ADPCM, MP3, MP2 dan MP1.

Tutorial ini terbagi dalam 2 tahap, yaitu Pencarian S/N yang tepat dan Patching pada tempat tertentu agar 'nag message' tidak muncul pada saat memulai dan mengakhiri program.

Essay

Nama dan Serial Number untuk Program ini, bisa kamu masukan melalui menu Options - Common. Di situ terdapat tempat untuk memasukan Nama dan Key Code. Seperti biasa, aku memasukan nama :

	Registered to 	: CHuPaCaBRa
	Key Code  	: 123454321

Seperti yang udah aku tulis di atas, tutorial ini aku bagi 2 karena ternyata s/n yang tepat saja masih belum cukup untuk "memuaskan" program ini :-)

1. Pencarian S/N

Untuk program ini, pasang BreakPoint pada Hmemcpy, setelah menekan tombol 'OK', kamu akan terlempar ke dalam SoftICE. Tekan F12 selama beberapa kali untuk kembali ke badan program. Setelah beberapa kali menekan F12, kamu akan menemukan perintah - perintah seperti ini :

:00498845 call 0041E0B8				;Hmemcpy
:0049884A mov edx, dword ptr [ebp+FFFFFE2C]	;Kamu di sini....
:00498850 mov eax, edi

Periksa isi EDX setelah kamu melewati Offset 0049884A dengan menekan F10. Ketikan perintah seperti di bawah ini :

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

Pasang BreakPoint pada lokasi memory di atas dengan mengetik BPM 017F:00C739C0 ( lokasi memory tersebut bisa berbeda di komputer kamu ), setelah itu lanjutkan tracing dengan menekan F10.

:00498852 call 00403B94
:00498857 lea edx, dword ptr [ebp+FFFFFE2C]
:0049885D mov eax, dword ptr [ebp-04]
:00498860 mov eax, dword ptr [eax+0000031C]
:00498866 call 0041E0B8				;Hmemcpy
:0049886B mov edx, dword ptr [ebp+FFFFFE2C]	;Cek isi EDX
:00498871 lea eax, dword ptr [edi+04]
:d edx
017F:00C77060 31 32 33 34 35 34 33 32-31 00 37 3A 6C 70 C7 00  123454321.7:lp..

Sama seperti tadi, pasang BreakPoint di lokasi memory di atas yang menyimpan s/n yang kita masukan.

:00498874 call 00403B94
:00498879 mov eax, dword ptr [edi+04]
:0049887C call 00407530                

Karena kamu telah memasang BreakPoint pada lokasi memory yang menyimpan S/N kita, pada saat kamu mencoba melewati Rutin Call pada Offset 0049887C, kamu akan terjebak ke dalam baris - baris perintah yang mengakses S/N kita :

:00402D0C sub bl, 30            	;BL = BL - 30
:00402D0F cmp bl, 09            	;Bandingkan BL dengan 09h
:00402D12 ja 00402D3E			;Jika BL > 09h, lompat ke 00402D3E
:00402D14 cmp eax, edi			;Bandingkan EAX dengan EDI
:00402D16 ja 00402D3E			;Jika EAX > EDI, lompat ke 00402D3E
:00402D18 lea eax, dword ptr [eax+4*eax];EAX = EAX + 4 * EAX
:00402D1B add eax, eax			;EAX = EAX + EAX
:00402D1D add eax, ebx			;EAX = EAX + EBX
:00402D1F mov bl, byte ptr [esi]	;BL  = [ESI]
:00402D21 inc esi			;ESI = ESI + 1
:00402D22 test bl, bl			;Apakah BL = 0 ???
:00402D24 jne 00402D0C			;Jika ya, lompat ke 00402D0C

Apa yang dilakukan perintah - perintah di atas ??? Pada dasarnya, perintah - perintah tersebut merubah S/N yang kita masukkan dari karakter ASCII ke bilangan Hexa dan Decimal. Perintah di atas akan dilakukan terus menerus sampai semua S/N yang kamu masukan sudah berubah menjadi Hexa dan Decimal. Setelah looping di atas selesai, coba periksa nilai EAX :

:? eax
075BC371 0123454321 "[Ãq"

Tampak di atas bahwa EAX = 75BC371 hexa = 123454321 decimal. Setelah itu tekan F10 beberapa kali hingga kamu menemukan baris - baris perintah berikut :

:00498881 dec eax		;EAX = EAX - 1 = 123454321 - 123454320
:00498882 mov ecx, 0000070C     ;ECX = 70Ch = 1804 decimal
:00498887 cdq                   ;Kosongkan EDX
:00498888 idiv ecx              ;EAX = EAX idiv ECX , EDX = Sisa Pembagian
:0049888A test edx, edx         ;Cek apa EDX = 0 ???
:0049888C je 004988A8           ;Jika ya, s/n tersebut valid

Terlihat bahwa s/n yang kita masukan akan dibagi dengan 70C hexa atau sama dengan 1804 decimal. Apabila hasil pembagian di antara kedua bilangan tersebut adalah 0 maka s/n yang dimasukan adalah s/n yang valid jika tidak maka program akan menampilkan sebuah MessageBox kecil bertuliskan "Key not valid!"

Kalau begitu s/n apayang sesuai dengan perhitungan di atas ??? Tentu saja s/n yang habis jika dibagi dengan 1804, s/n yang paling mudah tentu adalah 1804 itu sendiri. Tapi kamu harus ingat bahwa pada Offset 00498881, s/n kita akan dikurangi 1, karena itu kita harus memasukan 1805 ( 1804 + 1 ) sebagai s/n kita.

Ulangi langkah - langkah di atas dan ketika perhitungan di atas selesai, s/n tersebut akan diterima dengan "senang hati" oleh Program :-)

2. Patching

Pada awalnya, aku kira program ini hanya sebatas pemeriksaan s/n...tetapi ternyata setelah aku  melakukan restarting seperti yang diminta oleh program tersebut, akan keluar sebuah MessageBox yang mengatakan adanya kesalahan pada s/n kita tadi. Karena itu aku akan menunjukkan cara untuk mempatch program ini agar tidak lagi mengeluarkan pesan - pesan aneh yang menjengkelkan :-)

Kembali ke langkah perhitungan s/n di atas, setelah memastikan bahwa s/n yang kita masukan tadi benar, pada Offset 0049888C akan terjadi lompatan menuju Offset 004988A8.

:004988A8 push 00000000
:004988AA mov cx, word ptr [00498A10]
:004988B1 mov dl, 02
:004988B3 mov eax, 00498A34		;EAX = "Restart AudioCart."
:004988B8 call 0043A51C

Rutin Call di atas akan menampilkan pesan "Restart AudioCart" pada Windows. Sampai di sini, kamu jangan cepat - cepat puas dulu, telusuri terus perintah - perintah di bawahnya, perhatikan apa yang terjadi dengan nama dan s/n yang tadi kita masukan.

:004988BD mov eax, dword ptr [edi]
:004988BF call 00403DBC			;Menghitung Panjang Nama
:004988C4 mov esi, eax			;ESI = Panjang Nama User
:004988C6 test si, si			
:004988C9 jbe 004988F4			
:004988CB mov bx, 0001			;BX = 01 hexa
:004988CF mov eax, edi
:004988D1 call 00403F8C
:004988D6 movzx edx, bx
:004988D9 lea eax, dword ptr [eax+edx-01]
:004988DD push eax
:004988DE movzx eax, bx
:004988E1 mov edx, dword ptr [edi]
:004988E3 movzx eax, byte ptr [edx+eax-01];Karakter dari Nama User
:004988E8 add eax, 00000041		;EAX = EAX + 41h	
:004988EB pop edx
:004988EC mov byte ptr [edx], al	;[EDX] = AL
:004988EE inc ebx
:004988EF dec si
:004988F2 jne 004988CF

Potongan program di atas digunakan untuk mengkodekan Nama yang dimasukan User dengan menambah setiap karakternya dengan 41 hexa ( 41h = 'A' )

Hasil pengkodean :

Sebelum ==> 43 48 75 50 61 43 61 42-52 61 00 00 70 62 C5 00 CHuPaCaBRa..pb..
Setelah ==> 84 89 B6 91 A2 84 A2 83-93 A2 00 00 70 62 C5 00 ............pb..

Tampak bahwa sekarang Nama User telah berubah. Berikutnya adalah giliran s/n yang akan di-rubah dengan cara serupa hanya penambahnya sekarang adalah 49 hexa ( 49h = 'I' )

:00498907 lea eax, dword ptr [edi+04]
:0049890A call 00403F8C
:0049890F movzx edx, bx
:00498912 lea eax, dword ptr [eax+edx-01]
:00498916 push eax
:00498917 movzx eax, bx
:0049891A mov edx, dword ptr [edi+04]
:0049891D movzx eax, byte ptr [edx+eax-01];Karakter dari S/N
:00498922 add eax, 00000049		;EAX = EAX + 49h
:00498925 pop edx
:00498926 mov byte ptr [edx], al	;[EDX] = AL
:00498928 inc ebx
:00498929 dec si
:0049892C jne 00498907

Hasil pengkodean :

Sebelum ==> 31 38 30 35 00 65 6E 64-9C 7A C7 00 9C 7A C7 00 1805.end.z...z..
Sesudah ==> 7A 81 79 7E 00 65 6E 64-2A 00 00 00 01 00 00 00 z.y~.end*.......

Apa yang akan terjadi kemudian ??? Ternyata hasil pengkodean tersebut kemudian akan disimpan ke dalam sebuah file bernama Audiocart.Key yang diciptakan setelah s/n yang kita masukan dianggap valid. Pada saat loading program, program ini mengecek keberadaan file Audiocart.Key, jika file ini ada maka Nama dan S/N yang tersimpan di dalamnya akan di-kodekan kembali dan di-cek validasinya.

Berikut adalah perintah - perintah tersebut :

:00496F98 mov eax, edi
:00496F9A call 00403F8C
:00496F9F movzx edx, bx
:00496FA2 lea eax, dword ptr [eax+edx-01]
:00496FA6 push eax
:00496FA7 movzx eax, bx
:00496FAA mov edx, dword ptr [edi]		;EDX = Nama User
:00496FAC movzx eax, byte ptr [edx+eax-01]
:00496FB1 sub eax, 00000041			;EAX = EAX - 41h
:00496FB4 pop edx
:00496FB5 mov byte ptr [edx], al
:00496FB7 inc ebx
:00496FB8 dec si
:00496FBB jne 00496F98
:00496FBD mov eax, dword ptr [edi+04]
:00496FC0 call 00403DBC
:00496FC5 mov esi, eax
:00496FC7 test si, si
:00496FCA jbe 00496FF7
:00496FCC mov bx, 0001
:00496FD0 lea eax, dword ptr [edi+04]
:00496FD3 call 00403F8C
:00496FD8 movzx edx, bx
:00496FDB lea eax, dword ptr [eax+edx-01]
:00496FDF push eax
:00496FE0 movzx eax, bx
:00496FE3 mov edx, dword ptr [edi+04]	;EDX = S/N
:00496FE6 movzx eax, byte ptr [edx+eax-01]
:00496FEB sub eax, 00000049		;EAX = EAX - 49h
:00496FEE pop edx
:00496FEF mov byte ptr [edx], al
:00496FF1 inc ebx
:00496FF2 dec si
:00496FF5 jne 00496FD0

Setelah Nama dan S/N kita kembali normal, s/n tersebut akan di-cek kembali dengan perhitungan berikut :

:00496FFF dec eax			;EAX = EAX - 1
:00497000 mov ecx, 0000070C		;ECX = 70C hexa
:00497005 cdq				;Kosongkan EDX
:00497006 idiv ecx			;EAX = EAX idiv ECX, EDX = sisanya
:00497008 test edx, edx			;Apakah EDX = 0 ???
:0049700A jne 00497012			;Jika ya, lompat ke 00497012

Perhitungan di atas sebenarnya hampir sama dengan perhitungan s/n yang kita temui pada awal tutorial ini, tetapi ada perbedaan yang sangat penting. Pada perhitungan s/n yang kita temui sebelum ini, jika sisa pembagian yang ada di EDX sama dengan Nol maka berarti s/n tersebut valid......tetapi sekarang, yang terjadi adalah kebalikannya, jika EDX = 0 maka s/n tersebut dianggap memiliki kesalahan. Untuk memberi tanda bahwa s/n tersebut salah, pada perintah berikutnya :

:0049700C mov [ebp-01], 01		;[EBP-01] = 01

Kalo kamu telusuri terus dengan menekan F10, program akan menuju ke sini :

:0049B1D8 test al, al			;Nilai AL didapatkan dari [EBP-01]
:0049B1DA je 0049B1FB			

Jika AL = 1 maka akan keluar pesan "There is a problem with your key code. Send us an email". Kalau begitu kita harus merubah nilai AL tersebut dengan merubah perintah pada Offset 0049700C seperti ini :

:A 0049700C
0177:0049700C mov byte ptr [ebp-01],00
0177:00497010				==> Tekan Enter

Dengan begitu, nilai AL nantinya pasti 0 sehingga pesan yang menjengkelkan tadi tidak akan ditampilkan :-) Tapi ternyata masih ada kekurangannya......pada saat kita keluar dari program, akan tampil sebuah pesan bahwa program tersebut belum teregister :-(

Aku sempat bingung ngeliat proteksi aneh kaya' gini sampai aku meliat baris - baris perintah ini :

:0049B1CB mov eax, dword ptr [004A0104]	;EAX = [004A0104] 
:0049B1D0 mov byte ptr [eax], 01	;EAX = 01
:0049B1D3 call 00496EA4
:0049B1D8 test al, al			;Test AL
:0049B1DA je 0049B1FB

Yang menarik adalah 2 perintah di atas Rutin Call tersebut. Setelah aku teliti ternyata isi dari [004A0104] sangat berpengaruh, jika [004A0104] = 1 maka program dianggap belum teregister ( walaupun sudah ada file Audiocart.Key ) sedangkan sebaliknya, jika [004A0104] = 0 maka program dianggap telah teregister.

Oleh karena itu, perintah di Offset 0049B1D3 harus dirubah :

:A 0177:0049B1D0
0177:0049B1D0 mov byte ptr [EAX], 00
0177:0049B1D3				==> Tekan Enter

Dengan perubahan di atas, maka "pesan-pesan nista" yang mungkin muncul, tidak akan pernah ditampilkan kembali dan program sudah teregister. :-)

K R A K

Serial Number : ( Bilangan yang merupakan kelipatan 1804 ) + 1 = 1805, 3609, 5413 dan seterusnya.....

Patch :

Edit file Audiocart.Exe dengan Hex Editor yang biasa kamu pake dan rubah kode - kode hexa berwarna merah di bawah ini, dengan kode hexa yang berwarna hijau :

Patch 1

C6 45 FF 01 EB 0F 8B C7-E8 27 CB F6 FF 8D 47 04 
C6 45 FF 00 EB 0F 8B C7-E8 27 CB F6 FF 8D 47 04 

Patch 2

C6 00 01 E8 CC BC FF FF-84 C0 74 1F 68 FF FF 00  
C6 00 00 E8 CC BC FF FF-84 C0 74 1F 68 FF FF 00  

Catatan

Program ini termasuk aneh ( bagi aku :-P ), kalo langsung aku patch, supaya program ngak peduli ama s/n yang bener, nama user ngak akan muncul di Splas Window sebagai Registered User. Karena itu aku pake 2 cara untuk nge-krak program ini.....tapi kalo ada di antara kalian yang mampu mengKrak dengan cara yang lain....pliss let me know  :-)

chupacabra@softhome.net

© Mei1999