WinU 4.3

www.bardon.com

SoftICE 3.24

oleh

CHuPaCaBRa

 

Pengenalan Program

Dalam tutorialku kali ini, aku akan menunjukkan sebuah Sistem Proteksi yang tidak menciptakan sebuah Serial Number tertentu, ia hanya menerima Serial Number apa saja yang kita masukan lalu memeriksa apakah sesuai dengan Algoritma S/N yang telah ditetapkan oleh programer sebelumnya.

Penjelasan singkat mengenai WinU :

"WinU is a Windows 95/98 security access control system with time-out and monitoring features, World Wide Web access tracking, three distinct levels of security control, and many flexible configuration options. It’s easy to set up, easy to use ... and virtually impossible to circumvent."

Program ini mempunyai batasan waktu penggunaan selama 30 hari dan menyediakan tempat untuk memasukan S/N apabila User telah membayar Program Shareware tersebut.

Bagi Register User, akan tercipta bagian WinU di dalam Win.ini seperti di bawah ini :

[WinU4]
userdata=6SF\*.;jihja4c7jh9dgjjihgfefdhidPJ5\FU=

 

Essay

Kita mulai...... :-)

Masukan S/N apa saja, dan tekan tombol OK dibawahnya. Untuk sementara jangan gunakan SoftICE, kita perhatikan saja dulu apa yang akan terjadi apabila kita memasukan S/N palsu. Ternyata WinU akan menampilkan sebuah Nag Screen yang tidak ada gunanya. Bila kita klik tombol OK maka kita bisa kembali memasukan S/N lain.

Oke...sekarang masukin kembali sembarang S/N, seperti biasa aku masukin angka "123454321". Sebelum menekan tombol OK, masuk ke dalam SoftICE dan siapkan Breakpoint yang penting. Karena tidak tahu apa yang akan digunakan oleh WinU, aku pasang 3 Breakpoint umum yang biasaya untuk menerima inputan yaitu "BPX GetWindowTextA", "BPX.GetDlgItemTextA" dan "BPX GetDlgItemInt".

Kembali ke Windows dan tekan tombol OK....kita akan terlempar ke dalam SoftICE ( ternyata kali ini yang beruntung adalah GetDlgItemTextA ). Tekan F12 untuk keluar dari fungsi API tersebut dan masuk ke dalam badan program.

:0042A376 Call dword ptr [00482C2C]
:0042A37C test eax, eax				;Kita ada di sini
:0042A37E je 0042AA16
:0042A384 mov dword ptr [ebp+FFFFFEAC], 00000001
:0042A38E mov dword ptr [ebp+FFFFFEA8], 00000000
:0042A398 cmp dword ptr [0047E580], 00000000
:0042A39F je 0042A3CD
:0042A3A5 push 0000000B

Tekan F10 selama beberapa kali sampai menemukan rutin berikut ini :

:0042A439 movsx eax, byte ptr [ebp+FFFFFEB0] ;karakter 1 dari S/N palsu kita.
:0042A440 push eax
:0042A441 call 00456E50
:0042A446 add esp, 00000004
:0042A449 cmp eax, 00000041                  ;Apakah EAX = 41h (41h='A')
:0042A44C jne 0042A61E                       ;Tidak sama ? Lompat

Karena karakter pertama dari S/N kita adalah "1" maka kita akan melompat menuju Offset 0042A61E.

:0042A61E movsx eax, byte ptr [ebp+FFFFFEB0] ;EAX = Karakter 1 S/N kita
:0042A625 push eax
:0042A626 call 00456E50
:0042A62B add esp, 00000004
:0042A62E mov dword ptr [ebp+FFFFFEA0], eax  ;[ebp+FFFFFEA0] = "1"
:0042A634 cmp dword ptr [ebp+FFFFFEA0], 4A   ;Bandingkan dengan 4Ah(='J')
:0042A63B jne 0042A650                       ;Tidak sama ? Lompat
:0042A641 mov dword ptr [ebp+FFFFFE9C], 00
:0042A64B jmp 0042A6CA
:0042A650 cmp dword ptr [ebp+FFFFFEA0], 4C   ;Bandingkan dengan 4Ch(='L')
:0042A657 jne 0042A66C                       ;Tidak sama ? Lompat.
:0042A65D mov dword ptr [ebp+FFFFFE9C], 02
:0042A667 jmp 0042A6CA
:0042A66C cmp dword ptr [ebp+FFFFFEA0], 4D   ;Bandingakn dengan 4Dh(='M')
:0042A673 jne 0042A688                       ;Tidak sama ? Lompat.
:0042A679 mov dword ptr [ebp+FFFFFE9C], 01
:0042A683 jmp 0042A6CA
:0042A688 cmp dword ptr [ebp+FFFFFEA0], 4B   ;Bandingkan dengan 4Bh(='K')
:0042A68F jne 0042A6A4                       ;Tidak sama ? Lompat
:0042A695 mov dword ptr [ebp+FFFFFE9C], 04
:0042A69F jmp 0042A6CA
:0042A6A4 cmp dword ptr [ebp+FFFFFEA0], 4E   ;Bandingkan dengan 4Eh(='N')
:0042A6AB jne 0042A6C0                       ;Tidak sama ? Lompat
:0042A6B1 mov dword ptr [ebp+FFFFFE9C], 03
:0042A6BB jmp 0042A6CA
:0042A6C0 mov dword ptr [ebp+FFFFFEAC], 00   ;[ebp+FFFFFEAC] = 0
:0042A6CA mov dword ptr [ebp+FFFFFEA4], 01
:0042A6D4 jmp 0042A6DF

Kalau kamu terus menekan F10, kamu akan meliat bahwa ternyata program akan menentukan bahwa S/N kita salah. Kenapa ??? 

Perhatikan kembali listing program di atas, program melakukan pengecekan terhadap karaketer pertama dari S/N kita. Karakter pertama dari S/N yang kita masukan, dibandingkan dengan karakter - karakter "J", "L", "M", "K", "N". Ini berarti karakter pertama dari S/N kita harus sama dengan salah satu karakter tersebut agar *untuk sementara* S/N yang kita masukan dianggap valid. Oke, kita rubah, kali ini isi S/N dengan 'J123454321'

Setelah menekan tombol OK, kita akan kembali masuk ke dalam baris - baris perintah di atas, telusuri sampai di Offset 0042A634, dimana karakter pertama dari s/n yang kita masukan dibandingkan dengan huruf  'J'. Karena kali ini sesuai, kita akan melompat ke 0042A6CA

:0042A6CA mov dword ptr [ebp+FFFFFEA4], 00000001
:0042A6D4 jmp 0042A6DF
:0042A6DF cmp dword ptr [ebp+FFFFFEAC], 00000000
:0042A6E6 je 0042A772
:0042A6EC mov eax, dword ptr [ebp+FFFFFEA4]
:0042A6F2 movsx eax, byte ptr [ebp+eax-00000150]   ;EAX = S/N palsu kita
:0042A6FA test eax, eax                            ;Apakah EAX ada isinya?
:0042A6FC je 0042A772                              ;Jika tidak ada, lompat
:0042A702 cmp dword ptr [004746AC], 00000001
:0042A709 jle 0042A733                             ;Lompat ke 0042A733
:0042A733 mov eax, dword ptr [ebp+FFFFFEA4]
:0042A739 movsx eax, byte ptr [ebp+eax-00000150]   ;EAX = S/N palsu kita
:0042A741 mov ecx, dword ptr [004744A0]            ;ECX = 004744AA
:0042A747 xor edx, edx                             ;Kosongkan register EDX
:0042A749 mov dx, word ptr [ecx+2*eax]             ;DX = ECX + 2 * EAX
:0042A74D and edx, 00000004                        ;EDX = EDX and 04
:0042A750 mov dword ptr [ebp+FFFFFD60], edx        ;[ebp+FFFFFD60] = EDX
:0042A756 cmp dword ptr [ebp+FFFFFD60], 00000000   ;[ebp+FFFFFD60] = 0 ?
:0042A75D jne 0042A76D                             ;Jika tidak, lompat !
:0042A763 mov dword ptr [ebp+FFFFFEAC], 00000000
:0042A76D jmp 0042A6D9                             ;Looping....

Apa yang dilakukan oleh baris - baris perintah di atas ( Offset 00442A6D9 - 0042A76D ) ???

Baris - baris perintah di atas berguna untuk mengecek apakah s/n yang dimasukan oleh User berupa huruf atau angka. Ternyata, s/n yang dimasukan tidak boleh berupa huruf, kecuali karakter pertama.

Oh iya ada satu hal lagi yang harus diketahui. Kalo kalian telah berusaha mencoba mengKrak s/w ini, kalian mungkin telah menyadari bahwa jika nilai di dalam [ EBP + FFFFFEAC ] ( dalam SoftICE adalah [ EBP - 0154 ] ) adalah 01 maka pengecekan masih dapat terus berlangsung ( So Far So Good ) tapi jika telah bernilai 00 maka s/w langsung melewati semua pengecekan dan langsung menyatakan "Invalid Serial Number". Jadi perhatikan perintah - perintah yang mengubah nilai [EBP - 0154].

Setelah selesai dengan pemeriksaan tahap pertama, berikutnya WinU akan memeriksa panjang s/n yang kita masukan. Perhatikan baris - baris perintah di bawah ini....

:0042A772 cmp dword ptr [ebp+FFFFFEAC], 00000000    ;So Far So Good ???
:0042A779 je 0042A79F                               ;Kalo tidak, lompat !
:0042A77F lea eax, dword ptr [ebp+FFFFFEB0]         ;EAX = 'J123454321'
:0042A785 push eax
:0042A786 Call dword ptr [00482954]                 ;Hitung panjang s/n
:0042A78C cmp eax, 0000000B                         ;Panjangnya = 0Bh(=11) ?
:0042A78F je 0042A79F                               ;Jika ya, lompat !
:0042A795 mov dword ptr [ebp+FFFFFEAC], 00000000    ;Tanda validasi s/n

Pada Offset 0042A78C terlihat bahwa ternyata panjang s/n yang kita masukan harus 11 karakter....s/n yang kita masukan tadi hanya 10 karakter panjangnya, karena itu, s/n kita akan langsung ditolak :-(

But it's okay, paling tidak sejauh ini yang sudah kita ketahui adalah :

Masih belon capek khan ? :-D Ulangi lagi dengan memasukan s/n yang sesaui dengan syarat s/n asli, yang sejauh ini sudah kita ketahui. Kali ini masukan 'J1234543211'

Setelah sampai di Offset 0042A78F, kita akan melompat ke Offset 0042A79F

:0042A79F cmp dword ptr [ebp+FFFFFEAC], 00000000 ;So Far So Good ???
:0042A7A6 je 0042A7C6                         ;Jika ngak valid,lompat!
:0042A7AC movsx eax, byte ptr [ebp+FFFFFEB1]  ;EAX = Karakter ke 2 dari s/n palsu kita
:0042A7B3 cmp eax, 00000036                   ;Apakah EAX = 36h (=06)?
:0042A7B6 je 0042A7C6                         ;Jika sama, lompat !
:0042A7BC mov dword ptr [ebp+FFFFFEAC], 00000000

Kita kembali menemukan salah satu syarat s/n asli, karakter kedua ternyata harus sama dengan 06. Kita harus kembali mengisi s/n, isi dengan 'J6123454321'. Setelah melalui langkah - langkah di atas kembali, kita akan "mendarat" di sini :

:0042A7C6 cmp dword ptr [ebp+FFFFFEAC], 00000000 ;So Far So Good ???
:0042A7CD je 0042A7F3                            ;Jika tidak valid, lompat !
:0042A7D3 movsx eax, byte ptr [ebp+FFFFFEB7]     ;EAX = Karakter ke 8
:0042A7DA sub eax, dword ptr [ebp+FFFFFE9C]      ;EAX = EAX - [ebp+FFFFFE9C]
:0042A7E0 cmp eax, 00000034                      ;Apakah EAX = 34h (=04)
:0042A7E3 je 0042A7F3
:0042A7E9 mov dword ptr [ebp+FFFFFEAC], 00000000

Hmm.....syarat lain lagi :-) Kali ini WinU memeriksa karakter ke 8 dari s/n kita, nilai dari karakter ke 8 itu apabila dikurangkan dengan isi dari [ebp+FFFFFE9C] harus sama dengan 34h atau 04.

Berapakah nilai [ebp+FFFFFE9C] ???

Lihat kembali ke Offset 0042A641 :

:0042A641 mov dword ptr [ebp+FFFFFE9C], 00000000

Apabila karakter pertama dari s/n kita adalah 'J' maka [ebp+FFFFFE9C] di-isi dengan nilai 0, dengan demikian sesuai dengan rumus di atas, perhitungannya menjadi :

Kita beruntung kali ini, kebetulan karakter ke 8 dalam s/n kita adalah 04 sehingga syarat ini dapat dilewati dengan mulus :-)

Tahap berikutnya cukup panjang, tapi secara umum WinU akan mengambil karakter - karakter tertentu dari s/n kita dan menghitungnya. Pada akhir perhitungan, hasil perhitungan itu harus sama dengan angka pada posisi ke 5 dalam s/n kita.

Berikut adalah proses penghitungannya ( Ingat S/N yang kita masukan adalah : 'J6123454321': )

:0042A7F3 cmp dword ptr [ebp+FFFFFEAC], 00000000   ;So Far So Good ???
:0042A7FA je 0042A9D0                              ;Jika tidak valid,lompat
:0042A800 mov dword ptr [ebp+FFFFFE94], 00000000   ;[ebp+FFFFFE94] = 00
:0042A80A movsx eax, byte ptr [ebp+FFFFFEB2]       ;EAX = Karakter ke 3
:0042A811 lea eax, dword ptr [2*eax+FFFFFFA0]      ;EAX = [2*eax+FFFFFFA0]
:0042A818 mov dword ptr [ebp+FFFFFE9C], eax        ;[ebp+FFFFFE9C] = EAX
:0042A81E mov eax, dword ptr [ebp+FFFFFE9C]        ;EAX = [ebp+FFFFFE9C]
:0042A824 add dword ptr [ebp+FFFFFE94], eax        ;EAX = EAX + [ebp+FFFFFE94]
:0042A82A cmp dword ptr [ebp+FFFFFE9C], 0000000A   ;[ebp+FFFFFE9C] = 0A ???
:0042A831 jl 0042A83E                              ;Lebih kecil, lompat !
:0042A837 sub dword ptr [ebp+FFFFFE94], 00000009   ;[ebp+FFFFFE94] = [ebp+FFFFFE94] - 09

Perhitungan berikutnya sama saja, kecuali karakter yang akan diambil.

:0042A83E movsx eax, byte ptr [ebp+FFFFFEB6]      ;EAX = Karakter ke 7
:0042A845 lea eax, dword ptr [2*eax+FFFFFFA0]
:0042A84C mov dword ptr [ebp+FFFFFE9C], eax
:0042A852 mov eax, dword ptr [ebp+FFFFFE9C]
:0042A858 add dword ptr [ebp+FFFFFE94], eax
:0042A85E cmp dword ptr [ebp+FFFFFE9C], 0000000A
:0042A865 jl 0042A872
:0042A86B sub dword ptr [ebp+FFFFFE94], 00000009
:0042A872 movsx eax, byte ptr [ebp+FFFFFEB9]      ;EAX = Karakter ke 10
:0042A879 lea eax, dword ptr [2*eax+FFFFFFA0]
:0042A880 mov dword ptr [ebp+FFFFFE9C], eax
:0042A886 mov eax, dword ptr [ebp+FFFFFE9C]
:0042A88C add dword ptr [ebp+FFFFFE94], eax
:0042A892 cmp dword ptr [ebp+FFFFFE9C], 0000000A
:0042A899 jl 0042A8A6
:0042A89F sub dword ptr [ebp+FFFFFE94], 00000009
:0042A8A6 movsx eax, byte ptr [ebp+FFFFFEBA]      ;EAX = Karakter ke 11
:0042A8AD lea eax, dword ptr [2*eax+FFFFFFA0]
:0042A8B4 mov dword ptr [ebp+FFFFFE9C], eax
:0042A8BA mov eax, dword ptr [ebp+FFFFFE9C]
:0042A8C0 add dword ptr [ebp+FFFFFE94], eax
:0042A8C6 cmp dword ptr [ebp+FFFFFE9C], 0000000A
:0042A8CD jl 0042A8DA
:0042A8D3 sub dword ptr [ebp+FFFFFE94], 00000009
:0042A8DA movsx eax, byte ptr [ebp+FFFFFEB1]      ;EAX = Karakter ke 2
:0042A8E1 sub eax, 00000030                       ;EAX = EAX - 30
:0042A8E4 add dword ptr [ebp+FFFFFE94], eax   	  ;[ebp+FFFFFE94] = [ebp+FFFFFE94] + EAX
:0042A8EA movsx eax, byte ptr [ebp+FFFFFEB5]      ;EAX = Karakter ke 6
:0042A8F1 sub eax, 00000030
:0042A8F4 add dword ptr [ebp+FFFFFE94], eax
:0042A8FA movsx eax, byte ptr [ebp+FFFFFEB7]      ;EAX = Karakter ke 8
:0042A901 sub eax, 00000030
:0042A904 add dword ptr [ebp+FFFFFE94], eax
:0042A90A movsx eax, byte ptr [ebp+FFFFFEB8]      ;EAX = Karakter ke 9
:0042A911 sub eax, 00000030
:0042A914 add dword ptr [ebp+FFFFFE94], eax
:0042A91A mov ecx, 0000000A                       ;ECX = 0Ah
:0042A91F mov eax, dword ptr [ebp+FFFFFE94]       ;EAX = [ebp+FFFFFE94]
:0042A925 cdq
:0042A926 idiv ecx                                ;EAX = EAX idiv ECX
:0042A928 mov dword ptr [ebp+FFFFFE94], edx       ;[ebp+FFFFFE94] = EDX
:0042A92E movsx eax, byte ptr [ebp+FFFFFEB4]      ;EAX = Karakter ke 5
:0042A935 mov ecx, dword ptr [ebp+FFFFFE94]       ;ECX = [ebp+FFFFFE94]
:0042A93B add ecx, 00000030                       ;ECX = ECX + 30
:0042A93E cmp eax, ecx                            ;Apakah EAX = ECX ???
:0042A940 je 0042A950                             ;Sama, lompat !
:0042A946 mov dword ptr [ebp+FFFFFEAC], 00000000
:0042A950 cmp dword ptr [ebp+FFFFFEA0], 0000004B  ;Apakah karakter 1 = 4Bh
:0042A957 jne 0042A9D0                            ;Tidak sama, lompat !

Dari langkah - langkah di atas, terlihat bahwa karakter ke 5 dari s/n yang kita masukan harus sesuai dengan perhtungan yang telah dilakukan oleh WinU. Dalam contoh s/n di atas, karakter ke 5 harus berupa angka 6 ( atau 36 dalam hexa )

Kalo begitu, masukan kembali s/n, 'J6126454321',dan lihat hasilnya ......KRAKED :-)

K R A K

Ngak perlu... ;-)

Catatan

Sistem Proteksi yang dipakai oleh WinU sebenarnya cukup mudah untuk ditembus, yang mungkin dibutuhkan bagi para newbie dalam mengKrak s/w ini adalah kesabaran karena kita harus berulang kali mencoba memasukan s/n dan melihat efeknya pada s/w tersebut :-)

Berikut adalah ketentuan dalam Algoritma WinU dalam Validasi Serial Number :

Tidak seperti Sistem Proteksi lainnya yang menuntut persamaan yang identik antara S/N yang kita masukin dengan S/N yang Valid, Sistem Proteksi ini hanya memeriksa apakah S/N yang dimasukan sesuai dengan algoritma S/N yang valid. Coba masukan s/n yang berbeda dengan contoh di atas dan perhatikan langkah-langkah dalam Validasi Serial Number-nya.....

 

chupacabra@softhome.net

© Mei1999