Kamis, 26 Januari 2012

Rahasia Pembuatan KeyGen(erator).

Sori judulnya terlalu mengada-ada, karena sebenarnya sudah jadi rahasia umum, bagaimana sang cracker mampu memecahkan untaian kode untuk menembus sistem proteksi/keamanan pada sebuah software, jadi artikel ini hanya ditujukan untuk yang belum pada ngerti aja. 



Ini berawal ketika saya membaca salah satu majalah komputer yang baru saya beli, pada majalah ini saya temukan tulisan kurang lebih seperti berikut : “Bagaimana bisa (mungkin), kode dan algoritma yang notabene sangat rahasia bagi sebuah produsen aplikasi mampu dipecahkan oleh sipembuat keygen (cracker)?” (PCMedia edisi 06/2006) , mungkin sebagian orang akan kebingungan menemukan jawabannya,  disini ada 3  kemungkinan mengapa kita bingung dalam menjawab pertanyaan diatas:
1.      Algoritma yang diciptakan oleh sang produsen software bersifat rahasia, dan tidak mungkin sang produsen menemui sang cracker dirumahnya untuk memberitahukan algoritma yang baru dia ciptakan.
2.      Aplikasi yang dibuat oleh sang produsen sangatlah berharga, pastilah sang produsen akan memproteksi aplikasinya agar tidak mudah dibajak.
3.      Sang penanya tidak pernah menengok dunia bawah tanah (komunitas underground) seperti Jasakom ini, :-P
Baiklah pertanyaan tersebut akan saya jawab lewat artikel ini.

Apa itu Key Generator (keygen)?
Sebenarnya pertanyaan ini nggak perlu saya jawab, karena saya yakin 98% pengguna komputer Indonesia yang masuk peringkat 5 besar pembajakan software terbanyak di Asia atau mungkin malah di dunia, pasti pernah melihat, memakai atau merasakan yang namanya keygen!.

Baiklah daripada kebanyakan ngomong lebih baik kita mulai tutorial cracking kita.

Cracking Start
Sebelum kita mulai saya harus minta ma’af dulu pada Khaled Mardam-Bey, karena saya akan menggunakan aplikasi beliau untuk eksperimen kita kali ini. Untuk contoh saya hanya akan menjadikan aplikasi mIRC sebagai korban.

Alat-alat yang perlu kita gunakan untuk cracking kita adalah :
1.      W32dasm (Wind*ws 32 Disassembly).
2.      Kalkulator Wind*ws.
3.      Cheat Engine (penulis pake versi 4.4),  aku gak pake softice karena softice ku gak bisa jalan   
di XP. Untuk download Cheat Engine: http://www.heijnen1.demon.nl/
4.      Aplikasi target : mIRC terbaru saat ini yaitu versi 6.16. <- Khaled I’m sory for this.
5.      UltraEdit (kalo perlu)
6.      Wafer coklat (aku suka sekali coklat) :-)

Sebenarnya Cheat Engine itu aplikasi untuk mencurangi game dibuat oleh dark_byte, tapi malah saya salah gunakan untuk cracking.. he.he. karena aplikasi ini sendiri memiliki bebrapa kelebihan  yang tidak dimiliki oleh program debuger lain, seperti stealth untuk mengatasi sistem proteksi anti debug. Dan yang lebih asik lagi tool ini bisa untuk bypass password pada beberapa aplikasi securtiy (penulis udah pernah bobol beberapa komputer temen yang di kunci pake password menggunakan  tool ini :-P )

Oke kita mulai aja

Instal dulu mIRC v6.16, W32Dasm dan Cheat Engine (semua kecuali kalkulator).
Setelah proses instal selesai jalankan mIRC, kamu bakalan ngeliat jendela nag (nag screen) yang menandakan bahwa aplikasinya masih versi trial 30 hari, dan mengharapkan anda untuk membelinya.
Klik “Continue”,
Pada jendela “mIRC Options” klik “Cancel”.
Klik menu “Help>Register”.
Nah kamu bisa liat jendela berisi 2 Textbox, satu untuk username dan yang satu untuk serial number.
Masukkan nama “4NVIe” pada “Full Name” dan masukkan “12345” pada “Registration Code”.
Klik OK atau tekan Enter, apa yang terjadi ?
“The registration name and number you have entered are not valid. Please make sure you are entering…bla..bla..bla..”

Tulisan inilah yang muncul, didukung oleh lambang X berwarna merah. Hiks, Tenang jangan kawatir.
Sekarang jalankan Cheat Engine nya. Maka akan tampak jendela seperti ini :
Klik tombol bergambar komputer di pojok kiri atas,  setelah jendela process list terlihat cari proses bernama “mirc.exe”

Setelah Cheat Engine meng-attach proses ‘mirc.exe’ langkah kita selanjutnya adalah mendebugnya dengan cara mengklik tombol “Memory view” pada Cheat Engine. tampaklah jendela berikut
Klik menu View>Enumerate Dll’s and symbol, disitu akan terlihat beberapa symbol dari â€œDynamic Link Library” milik Wind*ws (DLL).  Klik pada “USER32” dan carilah fungsi “GetWindowTextA”, he..he.. pasti sulit karena gak urut pake abjad (itulah kekurangan Cheat Engine) setelah ketemu dobel klik pada fungsi tsb dan klik “Close”.
Memory Viewer akan menunjukan alamat fungsi tsb. Tekan F5 untuk membuat breakpoin, klik OK pada jendela registrasi di mIRC, gagal!. Kita coba lagi dengan fungsi lain “GetDlgItemTextA”, lepaskan dulu breakpoin pada fungsi pertama dengan cara menekan tombol F5, ngulang cari lagi deh”, setelah membuat breakpoin pada fungsi kedua, isi nama dan nomor serialnya lagi pada mIRC dan tekan tombol OK. Gagal Lagi!!!, Sial!. Karena berkali-kali gagal, kita jalankan W32Dasm, Klik menu Disassembly>Open file to disassembly… cari file mirc.exe  pada direktori anda menginstal mIRC. Setelah proses loading selesai Klik menu “Search>Find text” pada jendela Find, isi teks dengan “Register…” gak pake tanda kutip (string ini aku temukan pada tubuh exenya yang aku buka pake ultraedit), Klik “Find Next” 3 kali, tekan “Page Up” 8 kali, hingga tampak :

:004C764C 8D94240C010000   lea edx, dword ptr [esp+0000010C]
:004C7653 8D4C2408        lea ecx, dword ptr [esp+08]
:004C7657 E8A4FDFFFF      call 004C7400
:004C765C 85C0            test eax, eax
:004C765E 740E            je 004C766E

lea edx, dword ptr [esp+0000010C] kode assembly ini akan memasukkan alamat nomor serial yang kita masukan tadi ke register EDX.
lea ecx, dword ptr [esp+08] kalo yang ini akan memasukkan alamat nama kita ke register ECX.
call 004C7400 nah! pemanggilan inilah yang akan mengkalkulasi nama dan nomor yang kita masukkan dan akan menghasilkan nilai pengembalian pada register EAX, jika nama/nomor serial valid maka register EAX akan bernilai 1, tapi kalo gak valid maka register EAX akan bernilai 0 (zero).
test eax, eax cek apakah EAX 0/1.
je 004C766E jika EAX = 0 maka lompat. Kita bisa saja melewati lompatan ini dengan cara me-NOPnya, tapi dengan cara ini akan merubah CRC dari file eksekutebelnya (crack kasar), jadi gak bagus, apalagi jika aplikasi yang akan kita crack dilengkapi sistem proteksi CRC, yang mana program gak akan jalan jika terjadi perubahan CRC!, atau mungkin kita gak bisa update karena gak pake nomor serial!, jadi kita pake cara kelemubutan aja dengan buat keygennya.

Lanjut!
Lihat pada alamat 004C7657, karena kita sudah tahu dimana alamat pengecekan nama dan serial berada, sekarang kita berpindah ke Cheat Engine, pada jendela “Memory Viewer” klik kanan pada kolom pertama,
Pada popup menu klik “Go to address”, pada jendela “Go to address” masukkan alamat yang kita dapatkan tadi yaitu “004C7657” tanpa tanda kutip, klik “OK”, maka akan tampak  :
Sekarang buat breakpoin pada alamat 004C7657 dengan menekan tombol F5, pindah ke mIRC, masukkan nama dan nomor serial, klik “OK”, proses berhenti, balik lagi ke Cheat Engine, trace masuk ke prosedur call 004c7400 dengan cara menekan tombol F7, setelah masuk coba  trace over dengan menekan tombol F8 sampai terlihat

Lea esi, [eax+10] ;masukkan alamat efektif dari nomor serial yang kita masukkan ke ESI
Mov dl, [eax] ;masukkan 1 karakter dari nomor serial ke dl
Inc eax Â Â Â Â Â  ;eax = eax+1
Test dl, dl    Â Â Â Â Â  ;apakah karakter udah habis?
Jne 004c7518 Â  ;kalo belum lompat ke 004c7518 (looping)
Sub eax, esi   ;eax kurangi esi hasilnya eax berisi jumlah karakter dari serial number yang kita masukkan atau sama dengan perintah VB len(esi)
Cmp eax, ecx   ;apakah jumlah karakter
Jae 004c7532   ;lebih dari 4? Jika ya lompat ke 004c7532

Setelah kita trace over sampai sini masuklah ke alamat 004c7532 dengan menekan tombol F7, setelah masuk kita akan melihat kode berikut :
Mov ebx,[esp+10] ;masukkan alamat efektif tempat nomor serial berada ke EBX, kalo gak percaya coba trace dulu supaya kode dieksekusi trus klik kanan pada kolom sebelah bawah dan pada menu popup klik “Goto address”, ketik “ebx” (gak pake kutip) tekan enter, maka akan terlihat nomor serial yang kita masukin tadi.
Push 2d  ;masukkan dalam stack nilai 2D (heksadesimal dari 45=karakter “-“)
Push ebx ;masukkan nilai EBX ke stack
Call 00570260 ;rutin untuk mengecek apakah terdapat karakter “-“ pada nomor serial kita?
Ups! Ternyata harus ada tanda “-“ pada nomor serialnya, mungkinkah format serialnya begini? : “12345-12345”.
Oke karena harus ada tanda “-“ pada nomor serialnya maka kita harus ulangi memasukan nomor serial dengan format seperti diatas, buat breakpoin pada alamat 004C7539 biar gak trace ulang (tekan F5), tekan F9 dua kali sampai kotak dialog penolakan muncul, isi “Full Name” dengan “4Nvie” (gak pake kutip) dan “Registration Code” dengan “12345-12345” (gak pake kutip), tekan Enter, proses berhenti, kembali ke Cheat Engine, tekan F9
Mov esi,eax
Add esp, 08
Test esi,esi
Je 004c7525
Setelah kode ini dieksekusi register ESI akan berisi alamat karakter “-“ pada nomor serial yang kita masukkan tadi.
Push ebx ;masukkan nilai ebx ke stack
Mov byte ptr [esi],00 ;ganti karakter “-“ dengan null byte
Call 00570543 ;rutin ini akan menyimpan serial pertama kita
Add esp,04
Mov byte ptr [esi],2d ;kembalikan karakter “-“
Inc esi ;esi+1
Mov ebp,eax
Cmp byte ptr [esi],00 ;apakah ESI sudah menunjuk pada akhir serial?
Je 004c7525 ;jika ya lompat ke 004c7525
Psuh esi ;masukkan nilai ESI ke stack
Call 00570543 ; gak penting
Mov ecx, edi ;EDI berisi nama kita
Add esp,04
Mov [esp+10],eax
Lea edx,[ecx+01]
Mov al,[ecx] ;masukkan 1 karakter dari nama kita ke AL
Inc ecx  ; ecx=ecx+1
Test al,al     ;apakah al = 0
Jne 004c7570 ;jika tidak loop!
Sub ecx, edx ;ECX kurangi EDX, hasilnya ECX berisi jumlah karakter dari nama kita
Mov esi,00000003 ;esi=3
Xor edx,edx    ;kosongkan EDX
Xor ebx,ebx ;kosongkan EBX
Cmp ecx,esi ;apakah jumlah karakter nama kita -
Jle 004c75a8 ;kurang atau sama dengan 3 ? (len(nama) <= 3) jika ya lompat!
Karena jumlah karakter nama kita lebih dari 3 maka nggak akan terjadi lompatan ini.
Trace terus (ingat pake F7 jangan pake F8), pada jmp  004c7590 kita akan melompat pendek, Setelah lompat kita mendarat pada kode berikut:
Movzx eax,byte ptr [esi+edi] ;masukkan 1 karakter pada EAX
Imul eax, [esp+edx*4+14] ;kalikan EAX dengan.... (mungkinkah array?), coba kita tengok alamat ESP, apakah ada nilai ajaib disitu?, caranya klik kanan pada kolom sebelah bawah dan pilih “Goto address”, ketik “esp+edx*4+14” (gak pake kutip) tekan enter.
JRENG!!!
He..he..he..., ternyata dugaanku benar lihat pada gambar diatas, itu adalah array! Yang berisi nomor ajaib, nah!, sekarang kita butuh kalkulatornya Bill untuk meng-convert nilai heksadesimal ke nilai desimal, (Bill pinjem kalulatornya dong!), pada kalkulator klik Menu “View>Scientific”, pilih radio button “Hex”, masukkan nilai ajaib dan pindah radio button-nya ke “Dec” maka kita dapat mengetahui nilai desimalnya:
Konvertasi nilai hex ke dec pada array diatas adalah:

              1   2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
HEXADECIMAL : 0B 06 11 0C 0C 0E 05 0C 10 0A 0B 06 0E 0E 04 0B 06 0E 0E 04
DECIMAL     : 11  6 17 12 12 14  5 12 16 10 11  6 14 14  4 11  6 14 14  4
              21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
HEXADECIMAL : 0B 09 0C 0B 0A 08 0A 0A 10 08 04 06 0A 0C 10 08 0A 04 10
DECIMAL     : 11  9 12 11 10  8 10 10 16  8  4  6 10 12 16 08 10  4 16

Ternyata nomor ajaib itu ada 39 buah terangkum dalam tabel array.
Jadi perintah Imul eax, [esp+edx*4+14] sama dengan perintah pada VB :

Asc(Mid$(ESI,X,1)) * NomorAjaib(EDX)

He..he..he.. Algoritma yang sederhana bukan?, oke, makan dulu coklatnya ah...
Sampai sini saya sudah melihat titik terang. Lanjut!
Add ebx,eax ;tambah EBX dengan nilai hasil pengalian pada EAX
Inc edx Â Â ;EDX ini adalah counter
cmp edx,26 ;apakah sudah berputar sebanyak 38 kali? (kok 38 bukan 39?, ya karena array pertama dibaca mulai dari 0)
jle 004c75a3 ;jika kurang atau sama dengan 38 lompat!
Xor edx,edx  ;tapi jika udah lebih dari 38 set EDX jadi 0 (balik ke nomor ajaib pertama)
Inc esi  Â Â Â Â ;tambah esi dengan 1 (karakter selanjutnya)
Cmp esi,ecx Â ;apakah karakter udah habis?
Jnge 004c7590 ;jika belum balik lagi (loop! Sampe karakter habis)
Nah sampe sini pasti kita sudah paham maksud kode diatas, jadi ilustrasinya kira-kira begini:

Nama -> pisahkan serial jadi dua bagian dengan format 00000-00000 -> kalkulasikan bagian pertama -> kalkulasikan bagian kedua-> samakan nomor serial yang kita masukkan dengan hasil kalkulasi pada EBX -> kesimpulan (valid/invalid code).
 
nah sekarang kita buat key generatornya, mau dibuat pake apa? Tenang jangan panik dulu aku gak akan buat pake Assembly kok, kita buat pake VB aja yang mudah. Yup!, kita mulai aja.

Siapkan satu buah TextBox dan satu CommandButton lalu ketikan source code berikut :
-------------------[CUT HERE]-------------------------------------------------
Option Explicit

Private Sub Command1_Click()
Dim NomorAjaib(38) As Long
Dim EDX, EAX As Long
Dim Bagian1, Bagian2 As Long
Dim X As Long

‘nomor-nomor ajaib kita isikan kedalam array
NomorAjaib(0) = 11: NomorAjaib(1) = 6:
NomorAjaib(2) = 17: NomorAjaib(3) = 12
NomorAjaib(4) = 12: NomorAjaib(5) = 14:
NomorAjaib(6) = 5: NomorAjaib(7) = 12
NomorAjaib(8) = 16: NomorAjaib(9) = 10:
NomorAjaib(10) = 11: NomorAjaib(11) = 6
NomorAjaib(12) = 14: NomorAjaib(13) = 14:
NomorAjaib(14) = 4: NomorAjaib(15) = 11
NomorAjaib(16) = 6: NomorAjaib(17) = 14:
NomorAjaib(18) = 14: NomorAjaib(19) = 4
NomorAjaib(20) = 11: NomorAjaib(21) = 9:
NomorAjaib(22) = 12: NomorAjaib(23) = 11
NomorAjaib(24) = 10: NomorAjaib(25) = 8:
NomorAjaib(26) = 10: NomorAjaib(27) = 10
NomorAjaib(28) = 16: NomorAjaib(29) = 8:
NomorAjaib(30) = 4: NomorAjaib(31) = 6
NomorAjaib(32) = 10: NomorAjaib(33) = 12:
NomorAjaib(34) = 16: NomorAjaib(35) = 8
NomorAjaib(36) = 10: NomorAjaib(37) = 4:
NomorAjaib(38) = 16
'jumlah karakter nama minimal 4 karakter
If Len(Text1.Text) < 4 Then
    MsgBox "Nama minimal 4 karakter!"
    Text1.SetFocus
    Exit Sub
End If
EDX = 0 'xor edx,edx
'buat nomor serial untuk bagian pertama dulu
For X = 4 To Len(Text1.Text)
    EAX = Asc(Mid$(Text1.Text, X, 1)) * NomorAjaib(EDX)
    Bagian1 = Bagian1 + EAX
    EDX = EDX + 1
    If EDX > 38 Then EDX = 0
Next X
EDX = 0
EAX = 0
'buat nomor serial bagian kedua
For X = 4 To Len(Text1.Text)
    EAX = Asc(Mid$(Text1.Text, X - 1, 1)) * Asc(Mid$(Text1.Text, X, 1))
    Bagian2 = Bagian2 + EAX * NomorAjaib(EDX)
    EDX = EDX + 1
    If EDX > 38 Then EDX = 0
Next X
'hasil kalkulasi tampilkan pada msgbox
MsgBox "Nomor serial loe : " & Trim$(Str$(Bagian1)) & "-" & Trim$(Str$(Bagian2)), , "mIRC 6.16 KEYGEN"
End Sub
-------------------[EOF]-------------------------------------------------
Setelah dikompil coba jalankan dan masukkan nama, setelah itu masukkan nama dan nomor serial pada jendela “Registration” mIRC, Klik “OK” dan...
Huaaahm…. Jam sudah menunjukkan pukul 3.30, akhirnya selesai juga nih artikel.
Dengan cara beginilah saya bisa mengetahui algoritma sistem proteksi pada suatu aplikasi/software tanpa perlu mengintip/meminta source code pada sang developer!.

Last words
Tulisan ini hanya untuk tujuan pendidikan saja, oleh karena itu penulis tidak bertanggung jawab apabila ilmu ini disalahgunakan untuk hal-hal yang merugikan.
Semoga dengan adanya tulisan ini para developer software lebih berhati-hati dan lebih memperhatikan sisi keamanan pada aplikasinya.

Tidak ada komentar:

Posting Komentar