Kaip buvo sukurta įsilaužėlių žaidimo apie serverio sunaikinimą galinė dalis

Kaip buvo sukurta įsilaužėlių žaidimo apie serverio sunaikinimą galinė dalis
Mes ir toliau pasakojame, kaip buvo surengtas mūsų lazerinis ieškojimas su serverio sunaikinimu. Pradėkite nuo ankstesnio Straipsnis apie užduoties sprendimą.

Iš viso žaidimo backend turėjo 6 architektūrinius vienetus, kuriuos analizuosime šiame straipsnyje:

  1. Žaidimo objektų, atsakingų už žaidimo mechanizmus, užpakalinė dalis
  2. Backend ir svetainės duomenų mainų magistralė VPS
  3. Vertėjas iš užklausų (žaidimo elementų) į Arduino ir aparatinę įrangą vietoje
  4. Arduino, kuris buvo atsakingas už relių valdymą, gavo komandas iš vertėjo ir atliko tikrąjį darbą
  5. Faktiniai įrenginiai: ventiliatorius, girliandos, grindų lempos ir kt.
  6. Frontend – pati Falcon svetainė, iš kurios žaidėjai valdė įrenginius

Panagrinėkime kiekvieną iš jų.

Žaidimo objektų užpakalinė dalis

Užpakalinė programa buvo įdiegta kaip pavasario įkrovos programa: ji turėjo keletą poilsio valdiklių, žiniatinklio lizdo galinį tašką ir žaidimo logikos paslaugas.

Buvo tik trys valdikliai:

  • Megatronas. Dabartinis Megatron puslapis buvo išsiųstas per GET užklausas: prieš ir po maitinimo įjungimo. Lazeris paleido POST užklausą.
  • Tildės puslapių atvaizdavimas, kad jie būtų pateikiami pagal puslapio pavadinimą. Eksportui skirtus puslapius Tilde gamina ne originaliais pavadinimais, o su vidine ID ir atitikties informacija.
  • „Captcha“ valdiklis, skirtas aptarnauti pseudo-didelės apkrovos „captcha“ serverį.

„Websocket“ galutinis taškas buvo naudojamas valdyti programėles: lempas, girliandas ir raides. Pasirinkta visiems žaidėjams sinchroniškai rodyti esamą įrenginio būseną: įjungtas ar išjungtas, aktyvus ar ne, kokios spalvos raidė šiuo metu šviečia ant sienos. Norėdami šiek tiek apsunkinti lazerio įjungimo užduotį, prie girliandos ir lazerio pridėjome autorizaciją su tuo pačiu prisijungimo vardu ir slaptažodžiu admin/admin.

Žaidėjai galėjo tai išbandyti įjungę girliandą ir tą patį pakartoti su lazeriu.

Pasirinkome tokią banalią prisijungimo-slaptažodžio porą, kad nekankintume žaidėjų bereikalingu pasirinkimu.

Kad užduotis būtų šiek tiek įdomesnė, objektų ID iš mongodb buvo naudojami kaip įrenginio identifikatoriai kambaryje.

ObjectId yra laiko žyma: dvi atsitiktinės reikšmės, iš kurių viena paimama pagal įrenginio identifikatorių, o antroji pagal jį generuojančio proceso pid ir skaitiklio reikšmę. Norėjau padaryti identifikatorius generuojamus reguliariais intervalais ir skirtingais pid procesais, bet su bendru skaitikliu, kad būtų įdomiau pasirinkti lazerinio įrenginio identifikatorių. Tačiau galiausiai visi pradėjo nuo identifikatorių, kurie skyrėsi tik skaitiklio reikšme. Dėl to šis veiksmas galėjo būti per paprastas ir nereikėjo atlikti objekto ID struktūros analizės.

Vertėjas iš backend užklausų

Python scenarijus, kuris dirbo su laikmačiais ir pavertė juos iš žaidimų abstrakcijų į fizinį modelį. Pavyzdžiui, „įjungti toršerą“ → „įjungti relę N2“.

Scenarijus prisijungė prie RabbitMQ eilės ir perdavė užklausas iš eilės į Arduino. Taip pat buvo įgyvendinta lygiagretaus šviesų perjungimo logika: kartu su kai kuriais įrenginiais buvo įjungta šviesa ant jų, pavyzdžiui, iš pradžių „Megatron“ tiekiant maitinimą, ji buvo apšviesta scenos šviesa. Apšvietimas visos scenos kinematografijai – tai atskira istorija apie puikų mūsų projekto bendraprodiuserio ir gamybos dizainerio Iljos Serovo darbą, apie kurį papasakosime atskirame įraše.

Vertėjas taip pat buvo atsakingas už smulkintuvo paleidimo naudojant laikmatį ir vaizdo perdavimo į televizorių logiką: smulkintuvo paleidimo laikmatis, rėkianti kapibara, reklama žaidimo pabaigoje.

Kaip buvo sukurta Megatron žetono generavimo logika

Bandomasis šūvis

Kas 25 sekundes buvo generuojamas naujas prieigos raktas, kurį buvo galima naudoti lazeriui įjungti 10 sekundžių esant 10/255 galiai. Nuoroda į github su Megatron kodu.

Tada lazeris atvėso 1 minutę – per tą laiką jis buvo nepasiekiamas ir nepriėmė naujų šūvių užklausų.

Šios galios nepakako perdegti per virvę, tačiau bet kuris žaidėjas galėjo iššauti Megatroną ir pamatyti veikiantį lazerio spindulį.

Žetonui sugeneruoti buvo naudojamas MD5 maišos algoritmas. Ir schema pasiteisino MD5 iš MD5 + skaitiklis + paslaptis už kovos žetoną ir be paslapties už bandomąjį žetoną.

MD5 yra nuoroda į komercinį projektą, kurį padarė mūsų pagrindinis kūrėjas Pavelas. Vos prieš porą metų šiame projekte buvo naudojamas MD5, o kai jis projekto architektui pasakė, kad tai pasenęs šifravimo algoritmas, jie pradėjo naudoti MD5 nuo MD5. Kadangi nusprendėme sukurti kuo noobiškesnį projektą, jis viską prisiminė ir nusprendė pateikti nedidelę nuorodą.

Kovinis šūvis

Megatron kovos režimas yra 100% lazerio galia esant 3 vatams. To užtenka 2 min., kad perdegtų per svarmenį laikančią virvę, sulaužytų akvariumą ir užtvindytų serverį vandeniu.

Palikome keletą užuominų apie projekto Github: būtent žetonų generavimo kodą, iš kurio būtų galima suprasti, kad testavimo ir kovos žetonai generuojami pagal tą patį skaitiklio indikatorių. Kovos žetono atveju, be priešinės vertės, taip pat naudojama druska, kuri beveik visiškai paliekama šios esmės pokyčių istorijoje, išskyrus paskutinius du simbolius.

Žinant šiuos duomenis, buvo galima surūšiuoti paskutinius 2 druskos simbolius ir iš tikrųjų sužinoti, kad tam buvo naudojami skaičiai iš Lost, konvertuoti į šešioliktainę sistemą.

Tada žaidėjai turėjo pagauti skaitiklio vertę (analizuodami testo žetoną) ir sugeneruoti kovos žetoną naudodami kitą skaitiklio vertę ir druską, pasirinktą ankstesniame žingsnyje.

Skaitiklis tiesiog didėjo kiekvieną bandomąjį kadrą ir kas 25 sekundes. Niekur apie tai nerašėme, tai turėjo būti maža žaidimo staigmena.

„Captcha“ sąveikos paslauga

Žaidimų pasaulyje tai buvo ta pati „captcha“, kurią reikėjo įkelti, norint įjungti ventiliatorių ir su užuomina atidaryti atverčiamąją lentą. Šalia kameros buvo nešiojamas kompiuteris su apkrovos stebėjimu.

Kaip buvo sukurta įsilaužėlių žaidimo apie serverio sunaikinimą galinė dalis

Tarnyba Paskaičiavau, ką rodyti stebėjime kaip esamą apkrovą: temperatūrą ir procesoriaus ventiliatorių. Metrika buvo perkelta į laiko bazės duomenų bazę ir pateikė grafana.

Jei per paskutines 5 sekundes buvo daugiau nei 50 užklausų rodyti captcha, tada apkrova padidėjo fiksuotu + atsitiktiniu žingsnių skaičiumi. Skaičiuojama, kad 100 % apkrovą galima pasiekti per dvi minutes.

Tiesą sakant, paslaugoje buvo daugiau logikos, nei buvo parodyta galutiniame žaidime: monitorių pastatėme taip, kad matytųsi tik CPU ventiliatoriaus sukimasis.

Užduočių pradžioje jie norėjo, kad Grafanas būtų pasiekiamas iš Falcon svetainės. Tačiau joje taip pat buvo „spyruoklinės programos“ ataskaitos metrika, kurios neturėjome laiko išvalyti, todėl nusprendėme užblokuoti prieigą prie jos. Ir teisingai – net užduočių pradžioje kai kurie žaidėjai spėjo, kad paraiška buvo parašyta „springboot“ sistemoje ir netgi iškasė kai kurių paslaugų pavadinimus.

Hostingas ir duomenų magistralė

Įrankis informacijai perkelti iš užpakalinės sistemos į svetainę, VPS serverį, kuriame veikė RabbitMQ.

Backend ir duomenų magistralė buvo įjungti mūsų VPS. Jo galia buvo panaši į kompiuterio, kurį matėte ekrane: 2 branduolių VPS su dviem gigabaitais RAM. Tarifas buvo imamas už išteklius, kadangi didžiausias apkrovimas buvo suplanuotas vos kelioms dienoms – taip elgiasi mūsų klientai, kurie planuoja VPS krauti trumpam laikui. Tada paaiškėjo, kad apkrova didesnė nei tikėjomės, o fiksuotas tarifas būtų pelningesnis. Jei atliekate užduotį, pasirinkite linijos tarifus turbo.

Norėdami apsaugoti serverį nuo DDoSa, naudojome „Cloudflare“.

Verta pasakyti, kad VPS viską atlaikė garbingai.

Arduino, kuris buvo atsakingas už relių valdymą, gavo komandas iš vertėjo ir atliko tikrąjį darbą

Tai daugiau kito straipsnio apie aparatinę projekto dalį tema: užpakalinė programa tiesiog išsiuntė užklausas įjungti konkrečią relę. Taip atsitiko, kad užpakalinė programa žinojo beveik visus objektus, o jos užklausos atrodė kaip „įjungti šį objektą“. Tai padarėme dėl ankstyvo svetainės testavimo (dar nesurinkome visų Arduino ir relių), galiausiai viską taip ir palikome.

Frontend

Greitai sukūrėme svetainę tildėje, užtrukome vieną darbo dieną ir sutaupėme 30 tūkst.

Iš pradžių galvojome paprasčiausiai eksportuoti svetainę ir pridėti logikos, kurios mums trūksta, tačiau susidūrėme su naudojimo sąlygomis, kurios uždraudė tai daryti.

Licencijos pažeisti nebuvome pasiruošę, todėl buvo du variantai: viską įgyvendinti patiems arba susisiekti tiesiogiai su Tilda, pasikalbėti apie projektą ir paprašyti leidimo pakeisti kodą.

Pasirinkome antrąjį variantą ir mus ne tik pusiaukelėje pasitiko, bet net davė metams nemokamą verslo sąskaitą, už ką esame jiems labai dėkingi. Buvo labai nepatogu jiems parodyti Sokol svetainės dizainą.

Dėl to prie frontend prijungėme js logiką, skirtą užklausoms siųsti į elementarius įrenginius, ir šiek tiek pakeitėme žaidimo elementų įjungimo ir išjungimo mygtukų stilius.

Svetainių dizainas

Paieškų istorija, kuri verta atskiro skyriaus.

Norėjome sukurti ne šiaip senamadišką svetainę, bet ir absoliučiai bjaurią, kuri pažeidžia visas pagrindines dizaino taisykles. Tuo pačiu metu buvo svarbu išlaikyti patikimumą: ji turėjo nepertraukti ENT istorijos, parodyti autoriaus pretenzingumą, o žaidėjai turėjo patikėti, kad tokia svetainė gali egzistuoti ir netgi pritraukti klientų. Ir jis atnešė! Kol žaidimas vyko, su mumis du kartus buvo kreiptasi dėl interneto svetainių kūrimo.

Iš pradžių dizainą dariau pati, stengiausi įtraukti daugiau gifų ir blizgančių elementų. Tačiau mano 10 metų dizaineris vyras pažiūrėjo per petį ir atmetė tai kaip „per gerą“. Norėdami pažeisti dizaino taisykles, turite jas žinoti.

Kaip buvo sukurta įsilaužėlių žaidimo apie serverio sunaikinimą galinė dalis

Yra keletas spalvų derinių, sukeliančių ilgalaikį pasibjaurėjimą: žalia ir raudona vienodo sodrumo, pilka ir rožinė, mėlyna ir ruda. Galų gale apsistojome ties raudonos ir žalios spalvos deriniu, pridėjome gifus su katinu ir pasirinkome 3-4 paties Sokolovo nuotraukas iš bendros nuotraukos. Turėjau tik keletą reikalavimų: vidutinio amžiaus vyras, vilkintis pora dydžių per didelį kostiumą ir „profesionalios studijos fotosesijos“ poza. Testo metu jie parodė jį draugams ir paklausė „kaip tau patinka?

Kuriant dizainą mano vyras turėdavo kas pusvalandį gultis, sraigtasparnis pradėjo skristi. Pasha bandė atidaryti kūrėjo konsolę didžiojoje ekrano dalyje, kol baigė užbaigti priekinę dalį – kad apsaugotų savo akis.

Tikrieji įrenginiai

Ventiliatoriai ir šviestuvai buvo montuojami per kietojo kūno reles, kad jie iškart neįsijungtų visu galingumu – kad lygiagrečiai su stebėjimu galia didėtų.

Tačiau apie tai kalbėsime kitame įraše, apie žaidimo aparatinę dalį ir tikrąją svetainės konstrukciją.

Būkite suderinti!

Kiti straipsniai apie siekį sunaikinti serverį

Kaip buvo sukurta įsilaužėlių žaidimo apie serverio sunaikinimą galinė dalis

Šaltinis: www.habr.com

Добавить комментарий