
Mungkin salah satu dari Anda memperhatikan bahwa pada tanggal 1 April, Google menambahkan game interaktif "Snake" ke aplikasi Google Maps untuk Android dan iOS.
Spesialis Check Point biasanya sibuk meneliti ancaman dunia maya terbaru, tetapi mereka sangat tertarik dengan permainan ini, meskipun mereka sangat kecewa dengan kerugiannya ... karena itu, muncul pemikiran logis: mengapa tidak memecahkannya!
Dengan demikian, karyawan kami yang paling nakal mulai berpikir tentang pengembangan aplikasi secara terbalik menggunakan debugging jarak jauh. Secara umum, mereka melakukannya, dan segera kami berhasil menyelesaikan tugas untuk tidak pernah kalah - dan bahkan menambahkan AI sederhana yang memainkan permainan itu sendiri.
Dalam catatan ini, kami menjelaskan secara rinci peretasan.
Pertama, kami membuka aplikasi pada perangkat virtual melalui Genymotion dan meluncurkan "Snake", yang terletak di menu di sudut kanan atas.
Sepertinya game ditampilkan di WebView, jadi kami memulai debugging jarak jauh di alat pengembang Chrome:

Kemudian mereka pergi ke situs dan menemukan file v18.js pada tab sumber, dan berisi beberapa fungsi menarik.
Pertama, fungsi
fa () memulai bidang 20 × 20:
this.height = this.width = 20;
Tujuan utama kami adalah menemukan dan mengubah fungsi yang menentukan kapan ular menabrak tembok atau ke dalam dirinya sendiri untuk menonaktifkan kemungkinan kehilangan. Variabel
lebar dan
tinggi mewakili dimensi lapangan bermain, jadi kami mencari
lebar dan
tinggi di dalam kode sumber dan menemukan fungsi
F (a, b) :
Sepertinya
F (a, b) sedang memeriksa apakah koordinat tubuh ular berada di dalam lapangan. Salah satu pilihan adalah untuk sepenuhnya menghapus kondisi dalam fungsi sehingga selalu mengembalikan kebenaran, dengan demikian memindahkan kita ke "rezim Tuhan", di mana kita bisa melewati tembok tanpa sekarat.
Untuk melakukan ini, kami menekan tombol
Inspect di konsol jarak jauh dan mengubah fungsi
F (a, b) sebagai berikut:
Sekarang kita bisa melewati tembok:
Fig. 1. Mode DewaIni semua sangat bagus, tapi kami masih harus bermain, mengambil orang sendiri untuk mendapatkan poin. Peretasan berikutnya akan menyelesaikan masalah ini.
Ada banyak panggilan ke
wa (a) di tumpukan panggilan. Jika kita mempelajari fungsi ini, kita akan melihat bahwa itu adalah rekursif dan bertanggung jawab atas permintaan frame animasi.
wa (a) memanggil fungsi
xa (a, b) dan
ya (a) , yang masing-masing menampilkan permainan (kereta, orang) dan bidang.
Pertimbangkan fungsi
xa (a, b) :
Dibutuhkan dua argumen: 'a' dan 'b'. Yang pertama adalah bagian dari variabel global Q, yang berisi informasi menarik tentang permainan kami, termasuk array yang mewakili lapangan bermain (Gbr. 2), di mana kita melihat kereta (M), orang, dan benda (K). Fungsi ini juga menghitung skor dan menyimpannya dalam ci, yang juga setara dengan Qb
Fig. 2. Array bidang bermainArray ini sesuai dengan bidang ini:
Fig. 3. Lapangan bermainxa (a) juga mengacu pada fungsi
sa (a) pada Gambar. 4, yang menghasilkan koordinat acak setiap kali orang baru dibuat. Jika Anda memanggil fungsi lebih dari sekali, Anda dapat membuat orang sebanyak yang Anda inginkan (Gbr. 5).
Fig. 4. Fungsi panggilan sa (a)Seperti di sini:
Fig. 5. Panggilan fungsi dengan penciptaan sejumlah orang di petaHarap dicatat bahwa meskipun Anda memanggil
sa (a) lebih dari sekali dan mengambil orang tersebut, skornya tidak berubah. Saat memilih penumpang, fungsi
ka (a, b) pada Gambar. 6. Dengan demikian, perlu diubah sehingga dengan setiap panggilan dia menambahkan 10 poin dan memperbarui skor di layar.
Fig. 6. Fitur yang diperbaruiKoordinat masing-masing bagian kereta ditunjukkan dalam Qbob, di mana elemen pertama adalah trailer pertama di kereta.
Fig. 7. Array keretaIni akan diperlukan untuk membuat AI sederhana. Mari kita mulai dengan logikanya:
Fig. 8. AI logikaSeekor ular adalah mesin negara (state machine):
- Pada X = 19, kita turun sampai kita mencapai Y = 19.
- Di X = 19 dan Y = 19, ke kiri ke X = 0.
- Kami lolos ke mesin negara untuk zigzag:
- Naik satu sel dan ke kanan ke X = 18.
- Naik satu sel dan kiri ke X = 0.
- Kembali ke langkah A.
- Pada Y = 0, ke kanan ke X = 19.
- Kembali ke langkah 1.
Kode lengkap diterbitkan
di GitHub .
Video: