Monday, December 26, 2011

Pilih patch atau keygen

Lumayan lupa kode-kode assembly yang dulunya pernah saya pelajari khususnya untuk cracking software. Memang sih pada masa itu masih tenar-tenarnya software dari Numega yang bernama softIce sebagai senjata paling utama cracking. Sekarang mencoba kembali mengingat dengan software yang berbeda yaitu OllyDbg. Okelah sebagai pemula kembali saya mencoba untuk melakukan cracking terhadap software latihan "crackme" yang saya dapat dari googling :D. 

Sebelum memulai saya akan menjelaskan tentang bedanya patch dengan keygen. Jadi begini, patch merupakan cara yang dilakukan cracker untuk membypass suatu program dengan merubah  logika yang ada pada kode program. Perubahan kode ini dilakukan dengan mengedit secara langsung tubuh program dengan menggunakan Hexa editor maupun software yang dibuat khusus untuk melakukan editing tubuh program target. Keygen merupakan sebuah software yang dibuat untuk menghasilkan serial dari suatu program yang membutuhkan registrasi. Pembuatan keygen ini lebih sulit dibandingkan patch karena dibutuhkan pemahaman tentang alur dari perhitungan program terhadap input yang dimasukkan user. Berikut ini saya membuat contoh tentang patching  dan keygening pada suatu program. (sangat dasar)

- PATCH -

Pertama saya membuka program yang akan di patch ini menggunakan Olly dan singkat cerita saya telah menemukan bagian program yang membandingkan sesuatu dari register untuk kemudian hasilnya digunakan sebagai penentu apakah program akan menampilkan pesan "salah" atau pesan "benar" seperti berikut :


Program membandingkan isi dari EAX dengan EBX dan ketika sama maka program melompat ke pemanggil pesan "benar" pada alamat 0040124C atau dengan kata lain serial dan user telah benar, sedangkan jika isi dari EAX dan EBX tidak sesuai maka jump dilewati dan program  memanggil subroutine pada alamat 00401362 (pesan kesalahan).


Dari hasil analisa sebenarnya ada beberapa cara yang bisa dilakukan untuk melakukan patching software ini. Misal dengan mengubah jump bersyarat menjadi jump tanpa syarat (JE menjadi JMP), membalik logika jump (JE menjadi JNE) dan mengubah kode pembanding seperti pada gambar di atas yaitu dengan mengubah register sehingga ketika dibandingkan akan selalu sama dan jump akan selalu dieksekusi ;). Setelah dilakukan pengeditan program di dalam memori dan hasil sesuai yang diinginkan maka dilakukan proses editing program secara permanen dengan menggunakan hexa editor kesayangan.


Gambar di atas merupakan gambar sebelum pengeditan, dan gambar di bawah merupakan gambar setelah pengeditan.


Save program hasil edit dan dilakukan testing terhadap pemasukkan nama dan serial palsu :


Tekan OK dan hasilnya seperti berikut :


- KEYGEN -

Masih pada program yang sama, saya mencoba mencontohkan bagaimana keygen itu dibuat. Telah diketahui program akan menampilkan pesan kesalahan ketika dimasukkan sebuah serial yang salah seperti pada gambar berikut.


Dengan modal string tersebutlah saya mencari dimana letak pemanggil dari pesan ini. Melalui Olly saya bisa mencari dengan fasilitas search stringnya.


String dalam program ditampilkan seperti gambar berikut.


Double klik pada string dan saya dibawa menuju lokasi sebuah subroutine yang mengambil string dari memori.


Setelah saya berada pada subroutine yang mengambil string saya mencari kembali lokasi pemanggil dari subroutine ini.



Pada saat ini saya telah dibawa pada program utama yang melakukan pemanggilan terhadap subroutine-subroutine yang ada pada program.


Dari lokasi di atas kemungkinan bisa dilakukan pelacakan perhitungan string nama dan juga serial yang dimasukkan. Pertama saya mencoba menuju subroutine yang dipanggil setelah program mengambil string nama.


Setelah berada pada awal subroutine saya mencoba untuk memberikan breakpoint agar program berhenti ketika subroutine sedang dipanggil.


Kembali ke pemanggil untuk memberikan breakpoint tambahan pada subroutine di bawah serial.




Saya telah memasang dua buah jebakan dalam program, kemudian saya mencoba mengeksekusi program dengan memasukkan nama dan serial.


Setelah dimasukkan tekan tombol OK program berhenti pada breakpiont yang telah dibuat.


Program melakukan pengubahan string dari Lcase menjadi Ucase. Setelah string berubah menjadi huruf besar semua, program memanggil subroutine yang berada pada alamat 004013C2.


Huruf dari nama diolah satu-persatu dari Z,A dan M. Huruf-huruf ini ditampung oleh register BL dan kemudian ascii dari huruf-huruf ini ditambahkan dan ditampung oleh register EDI (5A+41+4D=E8). Setelah selesai sampai huruf terakhir program kembali ke pemanggil.


Isi dari register EDI di xor kan dengan 5678 hexa kemudian hasil xor tampung pada register EAX (5690) dan lompat ke lokasi 004013C1 yaitu return pada program utama.


Simpan EAX pada stack kemudian lanjutkan perhitungan serial :)), baru nama tok...pusing! Okelah langsung saja begini subroutine perhitungan pada serial.


Bisa dilihat AL di isi dengan 0A, BL menampung serial dari awal satu-satu. BL yang berisi ascii dari serial dikurangi dengan hexa 30. EDI berisi perkalian EAX dengan dirinya kemudian ditambah dengan isi dari EBX. Ulangi sampai string serial habis, kemudian hasil perhitungan di xorkan dengan 1234, pindah hasil xor ke register EBX dan kembali ke program utama.
"123" :
  • EDI = (asc(X) - 30) + (EDI*EAX)
  • EDI = (31-30)+(0*0A) = 1
  • EDI = (32-30)+(1*0A) = C
  • EDI = (33-30)+(C*0A) = 7B
  • EDI = 7B XOR 1234 = 124F
  • EBX = EDI
Setelah selesai perhitungan maka program kembali ke pemanggil.


Isi register EAX(5690) dibandingkan dengan EBX(124F), sehingga jump tidak akan dieksekusi. Oke biarpun jump tak dieksekusi, dengan mengetahui perhitungan dari angka yang dibandingkan tersebut saya  dapat membuat algoritma untuk menggenerate serial yaitu (asc(x) xor 5678h xor 1234h). Berikut ini program lengkap keygen yang saya buat dengan bahasa vbs.
Dim Nama, Hasil
Nama=Inputbox("Masukkan nama","Belajar Keygen")
Nama=Ucase(Nama)
    For i = 1 To Len(Nama)
        p = p + Asc(Mid(Nama, i, 1))
    Next
Hasil = p xor &h5678 xor &h1234
msgbox("Nama : " & Nama &""& vbcrlf & "Serial :" &  Hasil)

Download:
Selesai.. :)