Bagaimana backend permainan peretas tentang menghancurkan server dibuat



Kami terus memberi tahu Anda bagaimana pencarian laser kami dengan penghancuran server diatur. Dimulai dari artikel sebelumnya tentang menyelesaikan pencarian .



Secara total, backend game memiliki 6 unit arsitektur, yang akan kami analisis di artikel ini:



  1. Backend entitas game yang bertanggung jawab atas mekanisme game
  2. Bus pertukaran data backend dan situs di VPS
  3. Penerjemah dari permintaan backend (elemen permainan) ke arduino dan perangkat keras di situs
  4. Arduino, yang bertanggung jawab atas kendali relai, menerima perintah dari penerjemah dan melakukan pekerjaan sebenarnya
  5. Perangkat yang sebenarnya: kipas angin, karangan bunga, lampu lantai, dll.
  6. Frontend - situs Falcon itu sendiri, tempat pemain mengontrol perangkat


Mari kita bahas masing-masing.



Backend entitas game



Backend diimplementasikan sebagai aplikasi boot pegas: memiliki beberapa pengontrol istirahat, titik akhir websocket, dan layanan dengan logika game.



Hanya ada tiga pengontrol:



  • Megatron. Halaman Megatron saat ini dikirim melalui permintaan GET: sebelum dan sesudah power-on. Laser ditembakkan melalui permintaan POST.
  • , . , ID .
  • , - .


Titik akhir websocket digunakan untuk mengontrol gadget: lampu, karangan bunga, dan huruf. Itu dipilih untuk secara bersamaan menampilkan status perangkat saat ini ke semua pemain: apakah itu hidup atau mati, aktif atau tidak, warna huruf apa yang sekarang ada di dinding. Untuk sedikit mempersulit tugas menyalakan laser, kami memberikan otorisasi pada karangan bunga dan laser dengan login dan kata sandi admin / admin yang sama.



Pemain dapat mengujinya dengan menyalakan karangan bunga dan melakukan hal yang sama dengan laser.



Kami telah memilih pasangan kata sandi login yang sepele agar tidak menyiksa para pemain dengan pilihan yang tidak perlu.



Untuk membuat tugas sedikit lebih menarik, ID objek dari mongodb digunakan sebagai pengenal perangkat di ruangan itu.



ObjectId berisi stempel waktu: dua nilai acak, salah satunya diambil berdasarkan pengenal perangkat, dan yang kedua berdasarkan proses pid yang menghasilkannya dan nilai penghitung. Saya ingin membuat pengenal yang dihasilkan secara berkala dan dari proses pid yang berbeda, tetapi dengan penghitung yang sama, sehingga pemilihan pengenal perangkat laser menjadi lebih menarik. Namun, pada akhirnya, semua orang memulai dengan pengenal yang hanya berbeda dalam nilai penghitungnya. Mungkin ini membuat tahapan terlalu sederhana dan tidak memerlukan analisis struktur pengenal objectId.



Penerjemah dari permintaan backend



Skrip Python yang menangani pengatur waktu dan diterjemahkan dari abstraksi game ke dalam model fisik. Misalnya "nyalakan lampu lantai" → "nyalakan relai N2".



Skrip terhubung ke antrian RabbitMQ dan meneruskan permintaan dari antrian ke Arduino. Itu juga menerapkan logika penyalaan lampu secara paralel: bersama dengan beberapa perangkat, lampu dinyalakan pada mereka, misalnya, ketika Megatron awalnya dinyalakan, itu diterangi dengan lampu panggung. Desain pencahayaan untuk seluruh adegan sinematik adalah cerita terpisah tentang karya hebat co-produser dan desainer produksi proyek kami Ilya Serov, dan kami akan menceritakannya di pos terpisah.



Penerjemah juga bertanggung jawab atas logika memulai shredder dengan timer dan mentransmisikan gambar ke TV: timer untuk memulai shredder, capybara yang menjerit, iklan di akhir permainan.



Bagaimana logika menghasilkan token megatron diatur



Uji tembakan



Setiap 25 detik, token baru dihasilkan, yang dapat digunakan untuk menyalakan laser selama 10 detik dengan daya 10/255. Tautan ke github dengan kode Megatron .



Kemudian laser didinginkan selama 1 menit - selama waktu ini laser tidak tersedia dan tidak menerima permintaan bidikan baru.



Kekuatan ini tidak cukup untuk membakar tali, tetapi setiap pemain dapat menembak dari Megatron dan melihat sinar laser beraksi.



Algoritme hashing MD5 digunakan untuk menghasilkan token. Dan skemanya adalah MD5 dari MD5 + counter + secret untuk combat token dan tanpa rahasia untuk test.



MD5 adalah referensi untuk proyek komersial yang dibuat oleh Pavel, backender kami. Beberapa tahun yang lalu, proyek ini menggunakan MD5, dan ketika dia memberi tahu arsitek proyek bahwa itu adalah algoritma enkripsi lawas, mereka mulai menggunakan MD5 dari MD5. Karena kami memutuskan untuk membuat proyek Noob maksimal, dia mengingat semuanya dan memutuskan untuk membuat sedikit referensi.



Tembakan tempur



Mode pertempuran Megatron adalah 100% kekuatan laser 3W. Ini cukup selama 2 menit untuk membakar melalui tali yang menahan kettlebell untuk memecahkan akuarium dan mengisi server dengan air.



Kami meninggalkan beberapa petunjuk tentang github proyek: yaitu, kode pembuatan token, yang memungkinkan untuk memahami bahwa token uji dan tempur dihasilkan berdasarkan satu indikator penghitung. Dalam kasus token pertempuran, selain nilai penghitung, garam juga digunakan, yang hampir sepenuhnya tersisa dalam sejarah perubahan dalam inti ini, dengan pengecualian dua karakter terakhir.



Mengetahui data ini, dimungkinkan untuk mengulangi 2 simbol garam terakhir dan sebenarnya mengetahui bahwa angka dari Lost digunakan untuk itu, diterjemahkan ke dalam sistem 16 digit.



Kemudian pemain harus menangkap nilai penghitung (dengan menganalisis token tes) dan menghasilkan token pertempuran menggunakan nilai penghitung berikutnya dan garam yang dipilih di langkah terakhir.



Penghitung hanya bertambah dengan setiap tembakan percobaan dan setiap 25 detik. Kami belum menulis tentang ini di mana pun, ini seharusnya menjadi kejutan permainan kecil.



Layanan untuk interaksi dengan captcha



Dalam dunia game, ini adalah captcha yang sama yang harus dimuat untuk menyalakan kipas angin dan membuka flipchart dengan petunjuk. Ada laptop dengan pemantau beban di sebelah kamera.







Layanan menghitung apa yang akan ditampilkan dalam pemantauan sebagai beban saat ini: suhu dan Kipas CPU. Metrik diteruskan ke database timebase dan ditampilkan dalam grafana.



Jika dalam 5 detik terakhir lebih dari 50 permintaan untuk tampilan captcha diterima, maka beban bertambah dengan tetap + sejumlah langkah acak. Perhitungannya, beban 100% dapat diperoleh dalam dua menit.



Faktanya, ada lebih banyak logika dalam layanan daripada yang ditampilkan di game terakhir: kami menyetel monitor sedemikian rupa sehingga hanya putaran Kipas CPU yang terlihat.



Pada awal pencarian, mereka ingin membiarkan Grafana dapat diakses dari situs web Sokol. Tapi itu juga berisi metrik pegas untuk laporan aplikasi backend, yang tidak punya waktu untuk kami bersihkan, jadi kami memutuskan untuk menutup aksesnya. Dan memang demikian - di awal pencarian, beberapa pemain menebak bahwa aplikasi itu ditulis dalam kerangka springboot dan bahkan menggali nama beberapa layanan.



Hosting dan bus data



Alat untuk mentransfer informasi dari backend ke situs, server VPS tempat RabbitMQ diluncurkan.



Backend dan bus data disimpan di VPS kami . Kekuatannya sebanding dengan komputer yang Anda lihat di layar: VPS 2 inti dengan RAM 2 gigabita. Tarif diambil untuk sumber daya, karena beban puncak direncanakan hanya untuk beberapa hari - inilah yang dilakukan klien kami, yang berencana memuat VPS untuk waktu yang singkat. Kemudian ternyata bebannya lebih tinggi dari yang kami harapkan, dan tarif tetap akan lebih menguntungkan. Jika Anda akan melakukan pencarian, pilih tarif jalur turbo .



Untuk melindungi server dari DDoSa, kami menggunakan Cloudflare.



Harus dikatakan bahwa VPS bertahan dalam segala hal dengan warna-warni.



Arduino, yang bertanggung jawab atas kendali relai, menerima perintah dari penerjemah dan melakukan pekerjaan sebenarnya



Ini lebih merupakan topik untuk artikel berikutnya tentang bagian perangkat keras dari proyek: backend hanya mengirim permintaan untuk mengaktifkan relai tertentu. Kebetulan backend mengetahui hampir semua entitas dan permintaan darinya tampak seperti "aktifkan entitas ini". Kami melakukan ini untuk pengujian awal situs (kami belum mengumpulkan semua Arduino dan relai), pada akhirnya kami meninggalkan semuanya seperti itu.



Paling depan



Kami segera membuat situs di tilde, butuh satu hari kerja dan menghemat anggaran 30 ribu.



Awalnya, kami berpikir untuk hanya mengekspor situs dan memasukkan logika yang hilang, tetapi kami menemukan persyaratan penggunaan yang melarang kami melakukan ini.



Kami belum siap untuk melanggar lisensinya, jadi ada dua pilihan: membuat semuanya sendiri atau menghubungi Tilda secara langsung, memberi tahu tentang proyek dan meminta izin untuk mengubah kode.



Kami memilih opsi kedua dan mereka tidak hanya menemui kami di tengah jalan, tetapi bahkan memberi kami satu tahun akun bisnis gratis, yang sangat kami syukuri. Sangat memalukan untuk menunjukkan kepada mereka desain situs web Sokol.



Akibatnya, kami memasang logika js ke frontend untuk mengirim permintaan ke perangkat dasar, sedikit mengubah gaya tombol untuk mengaktifkan dan menonaktifkan elemen game.



Desain situs



Sejarah pencarian, yang bernilai bab terpisah.



Kami ingin membuat tidak hanya situs kuno, tetapi juga situs yang benar-benar memuakkan karena melanggar semua aturan desain dasar. Pada saat yang sama, penting untuk menjaga kepercayaan: dia tidak boleh merusak cerita THT, menunjukkan kepura-puraan penulisnya, dan para pemain harus percaya bahwa situs semacam itu bisa ada dan bahkan membawa klien. Dan dia membawa! Saat permainan berjalan, kami dua kali diminta untuk membuat situs web.



Awalnya, saya membuat desain sendiri, mencoba memasukkan lebih banyak GIF dan elemen berkilau. Tapi suami saya, seorang desainer dengan 10 tahun pengalaman, mengabaikannya dan menganggapnya "terlalu baik". Untuk melanggar aturan desain, Anda perlu mengetahuinya.







Ada beberapa kombinasi warna yang menyebabkan rasa jijik terus-menerus: hijau dan merah dengan kesegaran yang sama, abu-abu dan merah muda, biru ditambah coklat. Hasilnya, kami menetapkan kombinasi warna merah dan hijau sebagai warna dasar, menambahkan gif dengan kucing, dan memilih 3-4 foto Sokolov sendiri di stok foto. Saya hanya memiliki beberapa persyaratan: seorang pria paruh baya, dengan setelan yang tidak pas, beberapa ukuran lebih besar dan dalam pose "pemotretan profesional di studio." Untuk tes, mereka menunjukkannya kepada teman dan bertanya, "Bagaimana kamu menyukainya?"



Dalam proses mengembangkan desain, suami saya harus berbaring setiap setengah jam, dan mulai menerbangkan helikopter. Pasha mencoba membuka konsol pengembang ke sebagian besar layar, sementara dia menyelesaikan frontend - dia menjaga matanya.



Perangkat yang sebenarnya



Kipas dan lampu dipasang melalui relai solid-state sehingga tidak langsung menyala dengan daya penuh - sehingga peningkatan daya akan terjadi secara paralel dengan pemantauan.



Tapi kita akan membicarakan ini di posting berikutnya, tentang bagian perangkat keras dari permainan dan konstruksi sebenarnya dari situs tersebut.



Tetap disini!



Artikel lain tentang pencarian dengan penghancuran server








All Articles