Wednesday, November 7, 2007

Hacking Microsoft Game: Pinball

Bang Zack dan Juki sedang bersaing untuk memperebutkan Khalila. Yah, namanya juga bersaing, apa aja dijadiin alasan supaya yang saingannya ga ngedeketin target. Kali ini bang Zack ngajak Juki maen Pinball, sebuah permainan standar dari M$ Windows XP. Mereka sepakat, siapa yang paling tinggi nilainya, maka dia berhak mendekati Khalila tanpa diganggu selama sehari.

Udah bisa ditebak, Juki yang mantan pencopet selalu saja kalah kalau bersaing dengan bang Zack, si penjagal kebo. Walaupun mereka berdua ga terlalu bisa maen komputer, tetep aja ada salah satu yang lebih unggul. Orang itu adalah bang Zack.


Juki meratapi nasibnya yang tidak akan bertemu dengan Khalila, pujaan hatinya, hari ini. Tapi Juki ga kehilangan akal. Setelah mencari informasi ke seluruh dunia (Internet), Juki akhirnya mengetahui bahwa M$ Windows menyimpan konfigurasi software di registry. Nilai permainan pinball juga disimpan di registry. Lokasinya adalah di HKCU\Software\Microsoft\Plus!\Pinball\SpaceCadet.



Berbekal ilmu "trial and error", Juki mencoba mengutak-atik registry menggunakan software bawaan Microsoft, regedit. Juki terpaksa mengambil resiko aplikasi tidak akan berjalan dengan baik bila key registry yang diutak-atik salah. Di registry terlihat nama Bang Zack dan Juki, beserta nilai mereka. Key "0.Name" berisi nama Bang Zack dan "0.Score" berisi nilainya yaitu 810000. Dari strukturnya terlihat bahwa key "0.Name" dan "0.Score" merupakan key untuk menyimpan nama dan nilai pemain pinball yang berhasil menduduki peringkat pertama. Begitu seterusnya.

Berarti untuk mengubah nama dan nilai, kita hanya perlu mengubah key Name dan Score. Hmm... mungkin saja... Mengapa masih mungkin? Karena ada key verification, yang masih belum diketahui apa fungsinya. Nah, . Key 0.Name diganti dengan "Juki" dan key 0.Score diganti menjadi "11755400". Selesai. Si Juki pun membuka pinball dan mengecek high scores. Eh... ternyata kosong!!! Tidak ada nama Juki maupun Bang Zack. Wah celaka! Dimana salahnya???

Juki pun terduduk lemas. Apa kata bang Zack nanti kalau tahu namanya sudah tidak ada di deretan high scores. Bisa-bisa Juki dimarahi ama bang Zack. Kemudian dia teringat key verification. Mungkin itu key yang digunakan untuk verifikasi, apakah nama pemegang rekor dan nilainya valid.

Dengan semangat membara, Juki mempelajari bagaimana key verification dibuat. Untuk mengetahuinya, ia melakukan beberapa pengamatan sebagai berikut:

Pada kondisi default, atau tidak ada pemain yang memperoleh nilai tertinggi, data registry pinball adalah:

0.Name = ""
0.Score = -999
1 .Name = ""
1.Score = -999
2 .Name = ""
2.Score = -999
3 .Name = ""
3.Score = -999
4 .Name = ""
4.Score = -999

verification = -4995


Perkiraan:
verification = -999 + (-999) + (-999) + (-999) + (-999) = -4995

Hm... kemungkinan, verification diperoleh dari menjumlahkan seluruh key Score.

Untuk memastikannya, dilakukan percobaan dengan memainkan pinball. Syaratnya, belum ada satu pun pemain yang mengisi high scores. Setelah permainan pinball berakhir, pemain memasukkan nama untuk peringkat pertama high scores karena merupakan satu-satunya pemain. Nama yang dimasukkan adalah "a" (tanpa tanda kutip). Data registry pinball adalah:

0.Name = "a"
0.Score = 192750
1 .Name = ""
1.Score = -999
2 .Name = ""
2.Score = -999
3 .Name = ""
3.Score = -999
4 .Name = ""
4.Score = -999

verification = 188851

Perkiraan:
verification = 192750 + (-999) + (-999) + (-999) + (-999) = 188754

whoops... kok ga sama?

Sisa verification = 188851 - 188754 = 97

Kesimpulan sementara a = 97

Kemudian dilakukan percobaan kedua, dengan syarat tidak ada pemain yang mengisi high scores. Nama yang dimasukkan tetap "a". Hasil yang diperoleh:

0.Name = "a"
0.Score = 114000
1 .Name = ""
1.Score = -999
2 .Name = ""
2.Score = -999
3 .Name = ""
3.Score = -999
4 .Name = ""
4.Score = -999

verification = 110101

Perkiraan:
verification = 110101 + (-999) + (-999) + (-999) + (-999) = 110004

Sisa verification = 110101 - 110004 = 97

Berarti hampir dipastikan bahwa a = 97

Mengapa hampir pasti? Karena si Juki belum tau, darimana datangnya 97 untuk huruf "a"? Karena udah buntu, akhirnya si Juki browsing entah kemana. Eh... abis tu dia baca artikel tentang ASCII [Link]. Dari situ dia tahu kalo kode ASCII untuk huruf a adalah 97!!!

Kalau begitu, rumus untuk mencari nilai verification adalah

verification = jumlah seluruh nilai + jumlah kode ascii seluruh nama

Tapi... apa benar? Untuk memastikannya, kita harus mencobanya. Nama yang akan dijadikan top score adalah juki dengan nilai 11755400.

Menurut tabel ASCII [Link], j = 106, u = 118, k = 107, i = 105. Bila dimasukkan ke dalam rumus:

verification = (11755400 + (-999) + (-999) + (-999) + (-999)) + ((106 + 117 + 107 + 105) + 0 + 0 + 0 + 0)
verification = 11751404 + 435 = 11751839

OK, sekarang kita hanya perlu mengisi key 0.Name dengan juki, 0.Score dengan 11751404 dan verification dengan 11751839.

Kira-kira seperti yang terlihat di bawah ini:


Setelah selesai mengedit registry, buka pinball dan lihat highscores. Whuzzzz.... kini muncul nama "juki" dengan nilai 11755400.


Pada akhirnya Juki menyimpulkan bahwa rumus untuk nilai verification adalah

Verification = Jumlah Seluruh Nilai (key Score) + Jumlah Kode ASCII Seluruh Nama (key Name)

Nah, sekarang, berhasilkah si Juki mengalahkan bang Zack? Ternyata, selagi Juki mengutak-atik registry pinball, bang Zack ngalor-ngidul bersama Khalila. Ternyata kasus ini hanya akal-akalan bang Zack aja agar Juki sibuk dan lupa ama Khalila. Yah... namanya juga bang Zack, makin tua makin banyak akalnya!

NB:
Bila ada kesamaan nama tokoh pada cerita di atas dengan tokoh di sinetron PPT (Para Pencari Tuhan), hal tersebut memang disengaja. Maklum la, penulis suka nonton sinetron PPT seh... hehe... ni lagi nungguin PPT seri ke-2 (Kalo ada...)

No comments: