Rabu, 08 April 2009

CaRA membuat KeyGen

Hi... akhirnya saYa nGeBLog Lagi Nih... Di sini anda dapat menemukan informasi tentang Musik. Kunci atau Chord Lagu, Profil, Plus info tentang IPTEK diantaranya Hacking, Cracking, Programmer, Virus maker, dan Lain-Lain deh Pokonya...

Nah,, Kali Ini saya akan ngebaHas tentang :

CaRA membuat KeyGen

Peringatan: A word from bulsara
Sebelum kita melangkah lebih jauh penulis hendak memberi peringatan bahwa materi yang terkandung dalam artikel ini ditujukan untuk kepentingan pendidikan semata (For Educational Purpose Only), penggunaan materi diluar dari kepentingan pendidikan merupakan tanggung jawab dari pengguna/pembaca dan bukan merupakan tanggung jawab penulis!!!.

He..he..he..jangan takut dengan peringatan diatas kalau memang tujuan kamu semata-mata untuk belajar, tetapi memang saya harus memberikan peringatan tersebut karena memang materi yang akan dibahas di dalam artikel ini merupakan materi yang ’sedikit’ ilegal. Didalam materi ini kita akan membahas materi keygen (merupakan singkatan dari Key Generator, kalau di dalam Bahasa Indonesia berarti Pembangkit Kunci, maksudnya adalah program dengan algoritma khusus yang bertujuan untuk membuat nomor seri yang unik berdasarkan nama pengguna yang di input) untuk program kompresi Winzip.

Artikel aslinya ditulis oleh seorang bernama Borna Janes, yang diterbitkan di situs tutorial cracking milik +Sandman, didalam artikel itu dia menjelaskan metode yang digunakannya untuk menelusuri proteksi program WinZip dengan menggunakan program debugger SoftICE dan program dissasembler W32Dasm.

Artikel aslinya sudah lama saya peroleh, sekitar tahun 1998 yang lalu. Jadi contoh yang digunakan adalah program WinZip yang ada saat itu yaitu WinZip versi 7. Namun jangan khawatir karena tampaknya pihak Nico Mak Komputing masih tetap menggunakan algoritma yang sama untuk proteksi nomor seri ini di WinZip versi yang baru.

Bagi anda yang yang belum pernah melakukan cracking mungkin akan sedikit bingung membaca artikel ini, baiklah saya jelaskan dahulu definisi cracking dan teknik-teknik yang digunakan disini. Cracking adalah istilah yang digunakan untuk mencari kelemahan suatu program dan mengeksploitasinya. Cracking yang dilakukan di artikel ini bertujuan untuk mencari nomor seri program. Cara yang digunakan adalah mencoba memahami algoritma proteksi yang digunakan dengan cara membaca dead listing program dan memahami jalannya program di dalam memori.

Untuk memperoleh dead listing ini kita menggunakan program disassembler, program ini membaca file program yang sudah dikompilasi (*.exe) dan lalu mendekompilenya (mengembalikan kedalam bentuk kode) dan menghasilkan kode program itu dalam bahasa Assembly. Disini kita menggunakan program bernama W32Dasm versi 8.9

Sedangkan untuk memahami jalannya program didalam memori kita menggunakan program debugger, yang kita gunakan disini adalah SoftICE dari NuMega. Dengan program ini kita dapat melihat isi suatu variabel yang disimpan didalam register memori dan juga merubah nilainya.

Setelah memahami alur logika algoritma proteksi yang digunakannya kita lalu dapat membuat kode tersebut dengan versi kita sendiri menggunakan bahasa pemrograman yang kita kuasai.

Nah, sekarang cobalah untuk memahami artikel ini ...

Berikut ini adalah artikelnya yang sudah saya terjemahkan kedalam Bahasa Indonesia, enjoy!

Sistem proteksi yang digunakan
Ketika WinZip belum diregistrasikan, maka setiap kali program ini dijalankan akam muncul tampilan pada layar monitor yang mengingatkat pengguna agar melakukan registrasi (tampilan layar ini sering disebut dengan istilah ’nagscreen’ -layar yang mengganggu -red). Untuk melakukan registrasi kita klik tombol Enter Registration Code. Lalu kita harus memasukkan data nama dan nomor registrasi.
Ketika registrasi berhasil dilakukan maka program akan menyimpan informasi registrasi itu didalam registri Windows pada subkey; HKEY_CURRENT_USER\Software\Nico Mak Computing\WinZip\WinIni yang berisi data sebagai berikut, contoh:


Name : bulsara
SN : "214008AA" atau "85122218"
Win32_version : "6.3 - 7.0"

Esai
Program menghasilkan 2 buah nomor seri yang valid. Nomor seri yang pertama terdiri dari angka dan huruf (format heksa) dan nomor seri yang kedua hanya terdiri dari angka (format desimal). Setiap nomor seri tersebut dihasilkan dari 2 rutin proses penghitungan. Rutin proses yang pertama menghasilkan 4 karakter pertama dan rutin proses yang kedua menghasilkan 4 karakter sisanya dari nomor seri. Artinya nomor seri yang valid terdiri dari 8 karakter.
Mari kita mulai…
Saat WinZip dijalankan anda akan melihat tampilan ’nagscreen’ yang muncul, yang menyarankan kita untuk melakukan registrasi program. Tekan tombol ’Enter Registration Code’ dan masukkan nama anda dan sembarang nomor seri, contoh:

Nama : bulsara
Registration # : 889988

Tekan tombol CTRL + D untuk menampilkan SoftICE dan ketikkan bpx GetDlgItemTextA untuk mengatur agar SoftICE menangkap perintah ini saat dijalankan, lalu tekan kembali CTRL + D untuk keluar dari SoftICE.
Tekan tombol OK pada jendela registrasi.SoftICE akan muncul pada saat eksekusi fungsi GetDlgItemTextA, tekan tombol F11 agar kembali agar kembali ke bagian kode WinZip yang melakukan pemanggilan fungsi itu dan ketikkan BD 0 untuk mematikan fungsi penangkapan ekseskusi (breakpoint execution). Sekarang anda dapat melihat bagian kode berikut:

Tampilkan

:00408014 FF150C844600 Call dword ptr [0046840C]
:0040801A 53 push ebx
;Kita ada disini
:0040801B E879160200 call 00429699
:00408020 59 pop ecx
;ECX = Nama
:00408021 53 push ebx
:00408022 E89B160200 call 004296C2
:00408027 59 pop ecx
:00408028 BE58D94700 mov esi, 0047D958
:0040802D 6A0B push 0000000B
:0040802F 56 push esi
:00408030 68810C0000 push 00000C81
:00408035 57 push edi
:00408036 FF150C844600 Call dword ptr [0046840C]
:0040803C 56 push esi
:0040803D E857160200 call 00429699
:00408042 59 pop ecx
;ECX = serial palsu
:00408043 56 push esi
:00408044 E879160200 call 004296C2
:00408049 803D28D9470000 cmp byte ptr [0047D928], 00
;Periksa panjang nama
:00408050 59 pop ecx
;ECX = serial palsu
:00408051 745F je 004080B2
;Jika 0 maka tampilkan pesan kesalahan
:00408053 803D58D9470000 cmp byte ptr [0047D958], 00
;Periksa panjang serial
:0040805A 7456 je 004080B2
;Jika 0 maka tampilkan pesan kesalahan
:0040805C E8EAFAFFFF call 00407B4B
;Ciptakan dan bandingkan nomor seri
:00408061 85C0 test eax, eax
;EAX 0 = Nomor seri salah, EAX 1 = Nomor seri benar
:00408063 744D je 004080B2
;Jika nomor seri salah tampilkan pesan kesalahan
:00408065 53 push ebx
:00408066 BBB80C4700 mov ebx, 00470CB8

Dari sini akan diketahui bahwa ada 2 kali pemanggilan terhadap fungsi GetDlgItemTextA. Pemanggilan pertama untuk mengambil nama dan yang kedua untuk mengambil nomor seri. Setelah pemanggilan fungsi tersebut program akan meletakkan pointer ke alamat memori yang berisi nama dan nomor seri tersebut didalam register ECX. Di bagian ini juga terdapat 2 fungsi perbandingan; pertama di 00408049 dan kedua di 00408053, kedua fungsi itu memeriksa panjang string nama dan nomor seri. Jika nama atau nomor seri kosong maka akan muncul pesan kesalahan. Bagi kita yang penting adalah pemanggilan fungsi pada alamat 0040805C yang merupakan fungsi yang membuat dan membandingkan nomor seri. Jika nomor serinya salah maka register EAX=0, sebaliknya jika nomor seri benar maka register EAX=1

Jika anda melihat pernyataan XOR EAX, EAX dimana saja didalam fungsi yang dipanggil di 40805C maka ini pertanda buruk, karena ini mengindikasikan nomor seri yang dimasukkan salah.

Sekarang tekan tombol F10 sampai anda tiba di 0040805C lalu tekan tombol T untuk masuk dan menelusuri kode didalam fungsi yang dipanggil ini.
Sekarang anda melihat potongan kode berikut:

Tampilkan

:00407B4B 55 push ebp
:00407B4C 8BEC mov ebp, esp
:00407B4E 81EC08020000 sub esp, 00000208
:00407B54 53 push ebx
:00407B55 56 push esi
:00407B56 33F6 xor esi, esi
;ESI = 0
:00407B58 803D28D9470000 cmp byte ptr [0047D928], 00
;Periksa panjang nama
:00407B5F 57 push edi
:00407B60 0F84A1000000 je 00407C07
;Jika 0 tampilkan pesan kesalahan
:00407B66 8D45EC lea eax, dword ptr [ebp-14]
;Lokasi memori untuk string berikut
:00407B69 50 push eax
:00407B6A 6860F44600 push 0046F460
:00407B6F E84F9CFFFF call 004017C3
;Simpan "MuradMeraly" kedalam EAX
:00407B74 59 pop ecx
:00407B75 8D85F8FDFFFF lea eax, dword ptr [ebp+FFFFFDF8]
;Lokasi memori untuk string berikut
:00407B7B 59 pop ecx
;ECX= "MuradMeraly"
:00407B7C BF28D94700 mov edi, 0047D928
;EDI = Nama
:00407B81 50 push eax
:00407B82 57 push edi
:00407B83 E8A9020000 call 00407E31
;Membuat salinan dari nama
:00407B88 59 pop ecx
:00407B89 8D85F8FDFFFF lea eax, dword ptr [ebp+FFFFFDF8]
:00407B8F 59 pop ecx
;ECX = Salinan dari nama
:00407B90 50 push eax
:00407B91 8D45EC lea eax, dword ptr [ebp-14]
;EAX = "MuradMeraly"
:00407B94 50 push eax
:00407B95 E866FD0400 call 00457900
;Membandingkan "MuradMeraly" dengan salinan nama
:00407B9A 59 pop ecx
;Jika sama maka EAX = 0, selain itu EAX = 1
:00407B9B 59 pop ecx
:00407B9C 6A01 push 00000001
:00407B9E 85C0 test eax, eax
;Periksa EAX
:00407BA0 5B pop ebx
:00407BA1 7502 jne 00407BA5
;Jika EAX= 0 maka ESI = 1
:00407BA3 8BF3 mov esi, ebx
:00407BA5 8D45EC lea eax, dword ptr [ebp-14]

Apa yang program lakukan disini?
Pertama program akan membuat salinan (copy) dari nama yang anda masukkan, namun tanpa spasi, angka …(hanya huruf). Anda dapat melihat salinan nama yang ada di register tersebut dengan mengetikkan D ECX ketika anda berada di 00407B91, disini juga anda dapat melihat bahwa register EAX berisi string MuradMeraly dengan mengetikkan D EAX. Bagi anda yang belum tahu perintah D berguna untu menampilkan isi dari lokasi memori (dump), dalam kasus kita sekarang adalah menampilkan isi lokasi memori yang terdapat di EAX dan ECX. Lalu program akan melakukan perbandingan string MuradMeraly dengan salinan nama kita yang sudah dibersihkan dari spasi dan karakter angka atau lainnya. Jika nama yang kita masukkan a dalah Murad Meraly maka register EAX akan berisi 0, sebaliknya jika bukan EAX = 1. Jika EAX=0 (jika anda adalah Murad Meraly) maka program menetapkan ESI=1 dan sebaliknya ESI=0.

Tampilkan

:00407BA8 50 push eax
:00407BA9 6870F44600 push 0046F470
:00407BAE E8109CFFFF call 004017C3
:00407BB3 59 pop ecx
:00407BB4 8D45EC lea eax, dword ptr [ebp-14]
:00407BB7 59 pop ecx
:00407BB8 50 push eax
:00407BB9 57 push edi
:00407BBA E841FD0400 call 00457900
:00407BBF 59 pop ecx
:00407BC0 85C0 test eax, eax
:00407BC2 59 pop ecx
:00407BC3 750C jne 00407BD1
:00407BC5 FF15C4814600 Call dword ptr [004681C4]
:00407BCB 84C3 test bl, al
:00407BCD 7402 je 00407BD1
:00407BCF 8BF3 mov esi, ebx
:00407BD1 6A14 push 00000014
:00407BD3 8D45EC lea eax, dword ptr [ebp-14]
:00407BD6 6A00 push 00000000
:00407BD8 50 push eax
:00407BD9 E872E50400 call 00456150
:00407BDE 83C40C add esp, 0000000C
:00407BE1 8D85F8FDFFFF lea eax, dword ptr [ebp+FFFFFDF8]
:00407BE7 68C8000000 push 000000C8
:00407BEC 6A00 push 00000000
:00407BEE 50 push eax
:00407BEF E85CE50400 call 00456150
:00407BF4 83C40C add esp, 0000000C
:00407BF7 85F6 test esi, esi
;Periksa ESI
:00407BF9 7413 je 00407C0E
;Jika ESI = 0 maka lewati beberapa baris berikut
:00407BFB E89C060000 call 0040829C
:00407C00 83257CB0470000 and dword ptr [0047B07C], 00000000
:00407C07 33C0 xor eax, eax
;EAX = 0
:00407C09 E9B3000000 jmp 00407CC1
;Melompat ke akhir rutin

Jika ESI=1 (jika anda adalah Murad Meraly) maka register EAX akan dikosongkan (..jika anda masih ingat ini artinya nomor seri salah), lalu melompat ke bagian akhir dari proses dan menampilkan pesan kesalahan!
Jika ESI=0 (jika anda bukan Murad Meraly) maka lewati beberapa baris berikut dan melompat ke 407C0E.

Kenapa Murad Meraly tidak dapat melakukan registrasi WinZip? Murad Meraly adalah cracker pertama yang berhasil memecahkan proteksi nomor seri WinZip ini maka namanya di ’black list’ oleh Nico Mak Computing.
Sekarang, inilah bagian kode yang terpenting
Di sini program menghasilkan dua nomor seri yang valid:

Tampilkan

:00407C0E 8D85C0FEFFFF lea eax, dword ptr [ebp+FFFFFEC0]
;Lokasi memori untuk nomor seri pertama
:00407C14 50 push eax
:00407C15 57 push edi
:00407C16 E8AB000000 call 00407CC6
;Menghasilkan nomor seri pertama
:00407C1B 59 pop ecx
:00407C1C BE58D94700 mov esi, 0047D958
:00407C21 59 pop ecx
;ECX = Nomor seri pertama

Ketikkan D ECX disini untuk melihat nomor seri pertama yang valid

Tampilkan

:00407C22 8D85C0FEFFFF lea eax, dword ptr [ebp+FFFFFEC0]
:00407C28 56 push esi
:00407C29 50 push eax
:00407C2A E8D1FC0400 call 00457900
;Bandingkan nomor seri pertama dengan nomor
seri yang kita masukkan
:00407C2F F7D8 neg eax
:00407C31 1BC0 sbb eax, eax
:00407C33 59 pop ecx
:00407C34 40 inc eax
:00407C35 59 pop ecx
:00407C36 A37CB04700 mov dword ptr [0047B07C], eax
;Simpan hasil registrasi 1 = Nomor seri benar
:00407C3B 7569 jne 00407CA6
;kedalam memori 2 = Nomor seri salah
:00407C3D 8D85C0FEFFFF lea eax, dword ptr [ebp+FFFFFEC0]
;Lokasi memori untuk nomor seri kedua
:00407C43 50 push eax
:00407C44 57 push edi
:00407C45 E820010000 call 00407D6A
;Menghasilkan nomor seri kedua
:00407C4A 59 pop ecx
:00407C4B 8D85C0FEFFFF lea eax, dword ptr [ebp+FFFFFEC0]
:00407C51 59 pop ecx
;ECX = Nomor seri kedua

Ketikkan D ECX disini untuk melihat nomor seri kedua yang valid

Tampilkan

:00407C52 56 push esi
:00407C53 50 push eax
:00407C54 E8A7FC0400 call 00457900
;Bandingkan nomor seri kedua dengan nomor
seri yang kita masukkan
:00407C59 F7D8 neg eax
:00407C5B 1BC0 sbb eax, eax
:00407C5D 59 pop ecx
:00407C5E 40 inc eax
:00407C5F 59 pop ecx
:00407C60 A37CB04700 mov dword ptr [0047B07C], eax
;Simpan hasil registrasi 1 = Nomor seri benar
:00407C65 753F jne 00407CA6
;kedalam memori 2 = Nomor seri salah


Sekarang kita dapat melihat bahwa program menghasilkan dua nomor seri yang valid dan lalu membandingkannya dengan nomor seri palsu yang kita masukkan! Nomor seri pertama yang valid terdiri dari huruf dan angka (format heksa) dan nomor seri kedua yang valid hanya terdiri dari angka (format desimal).

Jika nomor seri yang kita masukkan sama dengan salah satu dari kedua nomor seri yang valid maka program menetapkan EAX=1, sebaliknya jika tidak ada kesamaan dengan salah satunya maka EAX=0.

Program juga menyimpan hasil proses registrasi (EAX) kedalam memori.Setelah ini bagian yang penting hanyalah pemanggilan fungsi pada 407CB4 yang melakukan pembersihan memori tempat nomor seri yang valid disimpan.

Jika kita ingin membuat KeyGen, kita harus menelusuri kedalam fungsi yang menghasilkan nomor seri yang valid (tetapi jika tujuan anda hanyalah untuk mencari nomor seri yang valid untuk melakukan registrasi maka langkah yang anda lakukan sudah cukup, anda sudah mempunyai dua nomor seri yang valid yang dapat digunakan).
Tekan F10 sampai anda tiba di 407C16 Call 407CC6, disini letak kode program yang menghasilkan nomor seri yang pertama. Sekarang, tekan T untuk masuk menelusuri kedalam fungsi.

NOMOR SERI PERTAMA YANG VALID
Sekarang anda akan melihat bagian kode berikut:
Dengan melihat rutin kode berikut ini kita akan mengetahui bahwa ada 2 rutin proses penghitungan.

Tampilkan

:00407CC6 55 push ebp
:00407CC7 8BEC mov ebp, esp
:00407CC9 51 push ecx
:00407CCA 8B4D08 mov ecx, dword ptr [ebp+08]
;ECX = Nama
:00407CCD 8365FC00 and dword ptr [ebp-04], 00000000
;Bersihkan memori untuk 4 karakter pertama nomor seri
:00407CD1 53 push ebx
:00407CD2 56 push esi
:00407CD3 8A11 mov dl, byte ptr [ecx]
;EDX(DL) = Karakter pertama dari nama
:00407CD5 57 push edi
;EDI = Nama
:00407CD6 33C0 xor eax, eax
;EAX = 0
:00407CD8 8BF1 mov esi, ecx
;ESI = Nama
:00407CDA 33FF xor edi, edi
;EDI = 0
:00407CDC 84D2 test dl, dl
;Periksa EDX(DL)
:00407CDE 7413 je 00407CF3
;Jika di akhir nama maka keluar dari rutin penghitungan
:00407CE0 660FB6D2 movzx dx, dl
;EDX(DX) = EDX(DL)
:00407CE4 8BDF mov ebx, edi
;EBX = EDI
:00407CE6 0FAFDA imul ebx, edx
;EBX = EBX * EDI
:00407CE9 015DFC add dword ptr [ebp-04], ebx
;Tambahkan EBX ke [EBP-04]
:00407CEC 8A5601 mov dl, byte ptr [esi+01]
;Karakter selanjutnya ke EDX(DL)
:00407CEF 47 inc edi
;EDI = EDI + 1
:00407CF0 46 inc esi
;ESI = ESI + 1
:00407CF1 EBE9 jmp 00407CDC
;Ulangi sebanyak [panjang string nama] kali

Disini akhir dari rutin proses penghitungan yang pertama.
Kita lihat program mengambil karakter pertama dari string nama lalu mangalikannya dengan EBX yang bertambah dengan satu untuk setiap karakter berikutnya (dimulai dengan 0).

Setiap hasil dari perkalian ini ditambahkan ke [EBP-04]
Contohnya seperti ini:
Nama yang saya masukkan adalah bulsara; EBX = 0

Karakter pertama dari nama adalah b (62h) lalu program mengalikannya dengan EBX yang diawal berisi 0; EBX bertambah satu, sekarang EBX berisi 1, hasil perkaliannya adalah 0, ditambahkan ke [EBP-04]

Karakter pertama dari nama adalah u (75h) lalu program mengalikannya dengan EBX yang berisi 1; EBX bertambah satu, sekarang EBX berisi 2, hasil perkaliannya adalah 75h, ditambahkan ke [EBP-04]

Karakter pertama dari nama adalah l (6Ch) lalu program mengalikannya dengan EBX yang berisi 2; EBX bertambah satu, sekarang EBX berisi 3, hasil perkaliannya adalah 144h, ditambahkan ke [EBP-04]

…dan begitu seterusnya!

Ketika rutin proses penghitungan selesai, ketika sudah tidak ada lagi karakter pada nama string nama yang akan dikalikan, ketikkan D EBP-04 dan anda akan melihat jumlah keseluruhan hasil perkalian tadi pada jendela data. Inilah 4 karakter kedua dari nomor seri kita dalam bentuk terbalik!!! Dalam perhitungan yang saya lakukan hasilnya adalah AA 08 tetapi serial saya (…yang kita peroleh dari proses sebelumnya, masih ingat kan?) diakhiri dengan 08AA.

Sekarang kita lihat bagaimana program menghasilkan 4 karakter pertamanya. Berikut adalah rutin proses penghitungan yang kedua:

Tampilkan

:00407CF3 C705ECD3470001000000 mov dword ptr [0047D3EC], 00000001
:00407CFD 8BF1 mov esi, ecx
;ESI = Nama
:00407CFF 8A09 mov cl, byte ptr [ecx]
;ECX(CL) = Karakter pertama dari nama
:00407D01 84C9 test cl, cl
;Periksa ECDX(CL)
:00407D03 7419 je 00407D1E
;Jika sudah diakhir nama maka keluar
dari rutin proses penghitungan
:00407D05 660FB6C9 movzx cx, cl
;ECX(CX) = ECX(CL)
:00407D09 6821100000 push 00001021
;Simpan "1021" kedalam stack
:00407D0E 51 push ecx
;Simpan ECX
:00407D0F 50 push eax
;Simpan EAX
:00407D10 E82A000000 call 00407D3F
;panggil subrutin penghitungan
:00407D15 8A4E01 mov cl, byte ptr [esi+01]
;Karakter selanjutnya ke ECX(CL)
:00407D18 83C40C add esp, 0000000C
;ESP = ESP - 0C
:00407D1B 46 inc esi
;ESI = ESI + 1
:00407D1C EBE3 jmp 00407D01
;Ulangi sebanyak [panjang string nama] kali

Disini akhir rutin proses penghitungan yang kedua.

Apa yang kita peroleh disini?
1. Program mengambil sebuah karakter dari string nama dan lalu menaruhnya kedalam stack (ECX)
2. Program menaruh '1021' kedalam stack
3. Program memanggil subrutin proses penghitungan dan hasil proses penghitungan disimpan di EAX

Program beulang-ulang melakukan rutin proses perhitungan ini terhadap setiap karakter pada string nama. Ketika rutin proses berakhir, jumlah keseluruhan penghitungan disimpan didalam EAX. Angka yang dihasilkan sangat mirip dengan empat karakter kedua dari nomor seri kita. Berikutnya kita akan melihat bagian programyang membuat bagian kedua dari nomor seri ini.

Sekarang kita lihat apa yang program lakukan di rutin proses penghitungan yang dipanggil di 407D10 call 407D3F.

Berikut ini kodenya:

Tampilkan

:00407D3F 55 push ebp
;Simpan EBP
:00407D40 8BEC mov ebp, esp
;EBP = ESP
:00407D42 8B4508 mov eax, dword ptr [ebp+08]
;Ambil EAX dari stack (EAX tetap sama)
:00407D45 56 push esi
;ESI = Nama
:00407D46 33C9 xor ecx, ecx
;ECX = 0
:00407D48 6A08 push 00000008
;Simpan "00000008" kedalam stack
:00407D4A 8A6D0C mov ch, byte ptr [ebp+0C]
;CH = Karakter nama selanjutnya
;ECX = Char + "00"
:00407D4D 5A pop edx
;Ambil "8" dari stack dan
letakkan kedalam EDX
:00407D4E 8BF1 mov esi, ecx
;ESI = ECX
:00407D50 33F0 xor esi, eax
;ESI = ESI XOR EAX
:00407D52 66F7C60080 test si, 8000
;Periksa SI (empat karakter
pertama dari ESI)
:00407D57 7407 je 00407D60
;Jika kurang dari 8000 maka
melompat ke 407D60
:00407D59 03C0 add eax, eax
;EAX = EAX + EAX
:00407D5B 334510 xor eax, dword ptr [ebp+10]
;EAX = EAX XOR "1021"
:00407D5E EB02 jmp 00407D62
;Melompat ke 407D62
:00407D60 D1E0 shl eax, 1
;EAX di Shifting Left sebanyak 1 bit
:00407D62 D1E1 shl ecx, 1
;ECX di Shifting Left sebanyak 1 bit
:00407D64 4A dec edx
;EDX = EDX - 1
:00407D65 75E7 jne 00407D4E
;Lakukan berulang sampai
EDX = 0 (delapan kali)
:00407D67 5E pop esi
:00407D68 5D pop ebp
:00407D69 C3 ret

Apa yang program lakukan disini?

Program mengambil karakter dari string nama dan meletakkannya kedalam register CH (ECX = char + "00") lalu meletakkan angka delapan kedalam EDX, lalu melakukan perulangan sebanyak delapan kali untuk proses berikut:
1. ESI=ECX (saat pertama kali berisi karakter dari string nama + "00")
2. ESI di xor dengan EAX
3. Periksa apakah SI (4 karakter pertama dari ESI) lebih kecil dari 8000
4. Jika ya, lompat kelangkah delapan
5. Tambahkan EAX dengan isi EAX itu sendiri (EAX=EAX*2)
6. EAX di xor dengan 1021
7. Lompat kelangkah sembilan
8. EAX di shifting left sebanyak 1 bit, atau sama dengan EAX=EAX*2
9. ECX di shifting left sebanyak 1 bit, atau sama dengan ECX=ECX*2

Hasil dari proses subrutin ini disimpan di EAX!

Ok, itu adalah subrutin proses perhitungan yang dipanggil di 407D10 call 407D3F!

Seperti yang sudah saya sebutkan bahwa hasil dari proses penghitungan itu disimpan didalam EAX, mungkin anda sudah langsung menebak bahwa bagian kedua dari nomor seri kita adalah EAX, ok..hampir betul tetapi bukan! Lalu dimana bagian keduanya? Mari kita lihat…

Berikut ini lanjutan dari bagian kode yang terpotong di 407D1C:

Tampilkan

:00407D1E 0FB74DFC movzx ecx, word ptr [ebp-04]
;ECX = Bagian pertama dari nomor seri kita
:00407D22 83C063 add eax, 00000063
;EAX = EAX + 63
:00407D25 51 push ecx
;Simpan ECX
:00407D26 0FB7C0 movzx eax, ax
;EAX = AX
;EAX = Empat karakter pertama dari EAX
:00407D29 50 push eax
;Simpan EAX

Ok, berhenti sejenak disini!
Coba sekarang lihat isi register EAX setelah proses penambahan dengan 63, ITU BAGIAN KEDUA DARI NOMOR SERI KITA! Juga lihat isi register ECX, ITU BAGIAN PERTAMA NOMOR SERI! Jika anda sambungkan kedua bagian ini, apa yang anda dapatkan? NOMOR SERI YANG BENAR!


Tampilkan

:00407D2A 6884F44600 push 0046F484
:00407D2F FF750C push [ebp+0C]
;Lokasi memori untuk menyimpan nomor seri
:00407D32 E869E20400 call 00455FA0
;Simpan nomor seri ke memori
:00407D37 83C410 add esp, 00000010
:00407D3A 5F pop edi
:00407D3B 5E pop esi
:00407D3C 5B pop ebx
:00407D3D C9 leave
:00407D3E C3 ret

Kita sudah sampai di akhir rutin proses penghitungan yang menghasilkan nomor seri pertama yang valid. Sekarang kita lihat bagaimana program menghasilkan noor seri kedua yang valid…

NOMOR SERI KEDUA YANG VALID
Program menghasilkan nomor seri yang kedua dengan cara yang hampir sama. Saya tidak menuliskan semua kodenya disini karena hampir serupa, saya hanya akan menjelaskan bagaimana program melakukannya! Pertama program menghasilkan nomor seri yang kedua ini berdasarkan dari salinan (copy) nama kita dalam huruf kecil semua! Jika anda tidak ingat salinan kedua dari nama kita ini adalah string yang hanya terdiri dari huruf, tanpa spasi dan angka atau lainnya!

Rutin proses penghitungan untuk nomor seri kedua sama dengan yang pertama!

Perbedaannya disini:
Empat karakter kedua nomor seri kita adalah bentuk desimal dari hasil rutin proses perhitungan yang pertama.

Contohnya begini:
Nama yang saya masukkan Bul Sara
Program menghasilkan nomor seri yang kedua berdasarkan salinan nama kita dalam huruf kecil dan tanpa karakter spasi atau lainnya, yang artinya salinan nama itu akan berbentuk bulsara! Hasil dari rutin proses penghitungan yang pertama adalah 08AA yang jika diubah kedalam bentuk desimal adalah 2218.
2218 adalah empat karakter kedua dari nomor seri kedua yang valid. Hasil dari rutin proses perhitungan yang kedua adalah 2140 yang bentuk desimalnya adalah 8512.
8512 adalah empat karakter pertama dari nomor seri kita kedua yang valid.

End Of Essay.
http://bulsara.host.sk/index.php?p=2008

Load disqus comments

0 komentar