Kako sam stvorio najbolji hack Candy Crush ikad

Kako sam stvorio najbolji hack Candy Crush ikad

PO JOE LEVY


optad_b

Nakon što je dobio puno interesa za Prskalica kvizova , proširenje za Chrome koje vam omogućuje jednostavno varati u popularnoj igri Trivia Crack , Zaključio sam da bi moglo biti zanimljivo vidjeti postoje li iste vrste ranjivosti u drugim popularnim igrama. S obzirom na njegovu suludu popularnost, prva igra koju sam naravno mislio istražiti bila je Candy Crush .

Za one koji živite ispod kamena, Candy Crush Saga je puzzle igra tri meča za Facebook , iPhone i Android, objavljeni još 2012. Iako je u osnovi prerađen Bejeweled , Candy Crush uspio se voziti na 'najpopularnijim' ljestvicama trgovina aplikacija, za razliku od bilo koje igre prije toga. Čak i sada, tri godine nakon izlaska, to je i dalje ide snažno kao vrhunska aplikacija u trgovinama aplikacija za iOS i Google Play. A to je da ne spominjem lude 75 milijuna lajkova Candy Crush našao se na Facebooku.



S obzirom na njegovu popularnost, pomislili biste da bi programeri tako uglađene i uspješne igre možda trebali vremena da je implementiraju na način koji je siguran od varanja. Ali, kako se ispostavilo, pisanje nekog koda za varanje Candy Crush je zapravo prilično jednostavan. Baš kao i kod Trivia Crack , tijekom vikenda uspio sam napisati i objaviti proširenje za Chrome, Candy Crush Cracker , Koji me pretvorio iz osrednjeg u najboljem slučaju Candy Crush igrač do bogolike drobilice bombona. Candy Crush Cracker u akciji možete vidjeti u nastavku, gdje ga koristim da bih dobio dodatne živote i pobijedio razine sa bilo kojim rezultatom:

Pa, u čemu je pogreška Candy Crush Saga Implementacija koja mi je omogućila da tako lako izradim alat koji dopušta bilo kome da vara? Ukratko, pobijediti razinu u Candy Crush je jednostavno poput slanja zahtjeva na Candy Crush poslužitelj kaže da ste pobijedili razinu. Možete čak poslati i rezultat - bilo koji rezultat - da kažete da ste postigli razinu s tim rezultatom. Pojedinosti o ranjivosti, kako sam je pronašao i kako sam izgradio proširenje za Chrome kako bih ga iskoristio, nalaze se u nastavku.

Kako hakirati Candy Crush Saga

1) Pronalaženje ranjivosti

Mnogi moji prijatelji jesu Candy Crush fanatike, postizanje rezultata i dostizanje razine koje nikada ne bih mogao prirodno postići. Ali dok je moj Candy Crush sposobnosti su me neprestano zatajile, mislio sam da bi me možda moje obrnuto inženjersko umijeće moglo odvesti na nove visine drobljenja slatkiša. Sumnjao sam da bi moglo biti moguće poslati vlastite zahtjeve na Candy Crush Poslužitelja ili upotrijebite neke podatke u odgovorima poslanima klijentu Candy Crush Poslužitelja, kako bi stekli prednost u igri. Pa sam počeo istraživati ​​kakve podatke Candy Crush klijent i poslužitelj prolaze naprijed-natrag.



Da bih pregledao ove podatke, slijedio sam gotovo isti postupak kao i kod Trivia Crack . igrao sam Candy Crush u mom pregledniku Na Facebook-u , dok bilježi i pregledava zahtjeve i odgovore poslane između Candy Crush Klijenta i poslužitelja, pomoću alata koji sam prethodno kreirao Gargl . Da, znam da sam mogao koristiti Fiddler ili Charles ili Chromeove razvojne alate da učinim isto. Odlučio sam umjesto toga koristiti Gargl jer osim što vam omogućava pregled zahtjeva / odgovora klijenta / poslužitelja, Gargl vam također omogućuje izmjenu i parameterizaciju tih zahtjeva, a zatim automatski generira module u programskom jeziku po vašem izboru kako biste mogli podnijeti te iste zahtjeve bez pisanja retka koda. Ali o tome više kasnije.

Svejedno, nakon kazivanja Gargl za početak snimanja i odlazak na Candy Crush na Facebooku u mom pregledniku, prvi korak bio je shvatiti na koji su se od mnogih zahtjeva poslanih na ovoj Facebook stranici odnosili Candy Crush , naspram samog Facebooka. Pregledom HTML-a na stranici pokazalo se da Candy Crush Flash sadržaj ugrađen je u Facebook putem iframe-a. Element neposredno iznad ovog iframea bio je obrazac namijenjen objavljivanju na određenom URL-u - https://candycrush.king.com/FacebookServlet/ .

Joe Levy

Znao sam da je King tvrtka koja stvara Candy Crush Saga , pa sam sumnjao da je ovo domena gdje Candy Crush je domaćin. Sljedeći korak bio je samo početak igranja Candy Crush , i dok sam se igrao kako bih pogledao zahtjeve, Gargl utvrđuje da stranica upućuje na bilo koji URL koji sadrži 'king.com':



Joe Levy

Dok sam pobjeđivao nivoe Candy Crush , Primijetio sam da se čini da je izdan novi zahtjev za svaku razinu. Činilo se da su zahtjevi izdani odmah nakon što sam uspješno završio nivo:

Joe Levy

Pa, činilo se, možda klijent kaže Candy Crush poslužitelju kada je igra gotova. To me natjeralo da pomislim da možda klijent ne kaže samo da je igra gotova, nego također kaže je li korisnik pobijedio razinu ili nije, i je li razina pobijeđena, kojim je rezultatom korisnik pobijedio razinu.

Shvatio sam da imam prednost i istražio detalje ovog zahtjeva za „gameEnd“.

2) Ranjivost u pojedinostima

Koristeći Gargl pogledati “candycrush.king.com/api/gameEnd3? Zahtjev / odgovor detaljno, uspio sam potvrditi da zaista govori poslužitelju kada je igra gotova i rezultat kojim je korisnik pobijedio razinu:

Joe Levy

Kao što gore možete vidjeti, zahtjev poslan poslužitelju sadrži, kao parametar niza upita, JSON objekt koji sadrži ocjenu kojom je pobijeđena razina, ID razine koja je pretučena, kao i hrpu drugih informacija. Naziv parametra niza upita je ne baš opisni 'arg0?' - možda pokušaj kreatora igre da pokušaju sakriti činjenicu da je taj parametar tajna da svi vaši Candy Crush snovi se ostvaruju!

Puna vrijednost vrijednosti parametra “arg0?” Izgleda kao u nastavku:

Joe Levy

Nekim eksperimentiranjem i promatranjem ovog zahtjeva dok sam završavao više razina uspio sam razaznati što znači većina polja u arg0 i odakle dolaze. EpisodeId i levelId koriste se za identificiranje razine i mogu se naći u zahtjevu poslanom poslužitelju kad započnete igrati razinu - https: //candycrush.king.com/api/gameStart2.

Sjeme se također može naći u ovom zahtjevu 'gameStart' i čini se da predstavlja slučajno sjeme kako bi trebao izgledati raspored slatkiša u razini. Uz to, svaki zahtjev za API upućen na Candy Crush mora se poslati s parametrom niza upita '_session', kako bi se identificirala trenutna korisnička sesija. Ova vrijednost se također može naći u zahtjevu gameStart i stvarno u bilo kojem zahtjevu za Candy Crush , u tom slučaju.

Evo kako izgleda https://candycrush.king.com/api/gameStart2 zahtjev:

Joe Levy

Opet, izgleda Candy Crush Kreatori su ili jako loši u smišljanju naziva parametara oglasa ili pokušavaju prikriti ove podatke kako bi otežali manipulaciju svojim API-jem. EpisodeId šalje se putem parametra niza upita pod nazivom 'arg0', levelId se šalje kao 'arg1', a sjeme se šalje kao 'arg2'. Iz nekog su razloga ipak odlučili upotrijebiti prilično opisni naziv za token sesije - '_ session'.

Osim epizodeId, razineId, rezultata i sjemena, ostatak polja u parametru niza arg0 zahtjeva zahtjeva gameEnd nije važan i može se teško kodirati kao gore. Odnosno, osim cs. Cs u ovom slučaju vjerojatno znači kontrolni zbroj, jer ako za njega ne pošaljete pravu vrijednost, zahtjev neće uspjeti. Ispostavilo se da ni konstrukcija vrijednosti polja kontrolne sume nije tako teška. Da biste dobili ispravnu kontrolnu sumu, jednostavno MD5 raspršite određeni niz i upotrijebite prvih šest znakova tog niza kao kontrolnu sumu. Niz za raspršivanje odgovara formatu:

::: - 1 ::: BuFu6gBFv79BH9hk

UserId je jedina informacija koju još nemamo i koja je potrebna za izgradnju gornjeg niza. Šalje se u zahtjevu “gameInit” koji se događa svaki put kada učitate Candy Crush Saga —Https: //candycrush.king.com/api/gameInitLight. Ovaj zahtjev možete uputiti u bilo kojem trenutku (naravno, prosljeđujući _session kao parametar niza upita), a odgovor će sadržati vaš userId:

Joe Levy

Izvrsno, sada imamo sve što nam je potrebno za postavljanje zahtjeva za igrom!

Pokušajmo ubaciti ove podatke u Fiddlerov skladatelj, ciljajući prvu razinu igre, i vidjeti što će se dogoditi kada unesemo rezultat od 100 000, izračunamo kontrolnu sumu, podnesemo zahtjev gameEnd i zatim ponovo učitamo Candy Crush Saga :

Joe Levy

Pa, prijatelji moji, čini se da smo uspješno provalili Candy Crush !

Dok Candy Crush Saga je poduzeo neke obrambene mjere, dopuštajući da je jedan zahtjev za završetak razine, s bilo kojim rezultatom, u izravnom sukobu s ' Obrambeno programiranje 'Praksa programiranja - posebno' nikad ne vjerujte klijentu ”Načelo web programiranja. Budući da poslužitelj nema kontrolu nad postupkom klijenta, ne može pretpostaviti da klijent neće djelovati na zlonamjerni način, pa se stoga mora zaštititi. Bolji način primjene 'dovršavanja razina' bio bi natjerati klijenta da svaki potez koji korisnik izvrši u razini pošalje na poslužitelj i da poslužitelj utvrdi da li ti potezi uspješno donose ocjenu dovoljno visoku za završetak razine. Iako ova metoda također nije savršena, to barem znači da klijent, bilo ručnom radnjom korisnika ili nekom automatiziranom metodom, mora odigrati razinu umjesto da poslužitelju samo kaže 'Pobijedio sam'.

Međutim, Candy Crush nije to učinio, već vjeruje klijentu. Sad je trebalo samo stvoriti zlonamjernog klijenta kako bi iskoristili činjenicu da klijent može poslužitelju samo reći da je osvojio bilo koju proizvoljnu razinu. U idealnom slučaju, onu koju bi netehnički korisnici mogli lako instalirati i koristiti. Hm ... što kažete na proširenje za Chrome koje samo dodaje gumb na Candy Crush igra, kada se igra Na Facebook-u , Da kada se klikne automatski prelazi trenutnu razinu ??

3) Iskorištavanje ranjivosti

Kao što sam gore spomenuo, Gargl omogućuje vam da uzmete zahtjeve za koje ste ga snimili, modificirate i parameterizirate ih prema potrebi, a zatim automatski generirate module u programskom jeziku po vašem izboru kako biste uputili iste zahtjeve. Neću ulaziti u detalje tog postupka jer možete pogledati jedan od mojih Objave na blogu tvrtke Gargl kako bih pronašao te informacije, ali u osnovi sam generirao Gargl datoteka predloška za Candy Crush S različitim API zahtjevima, koristeći Proširenje za Gargl Chrome , a zatim je pomoću Gargl generatora pretvorio tu datoteku predloška u Candy Crush JavaScript knjižnica . Korištenje Gargla za ovo mi je omogućilo da stvorim JavaScript knjižnicu s kojom razgovaram Candy Crush Poslužitelja, bez pisanja retka koda za to, a također i za stvaranje datoteke predloška za budućnost u slučaju da to želim kasnije učiniti s drugim programskim jezikom.

Jednom kad sam ovo imao Candy Crush JavaScript biblioteka, bila je jednostavna stvar izrade Chromeovog proširenja u JavaScriptu koje se izvodi na domeni učitanoj u Candy Crush Iframe stranice Facebook igre (candycrush.king.com) dodaje gumb HTML-u za igru, a kada se klikne na taj gumb, traži se od korisnika rezultat, izvršava gornje korake za pronalaženje episodeId, levelId, seed, _session i userId, a zatim izdaje zahtjev gameEnd kako bi nadmašio trenutnu razinu.

Joe Levy

I tek tako, Candy Crush Cracker je rođen! Znatiželjni o točnim detaljima kako Candy Crush Cracker djeluje? Provjerite izvorni kod na GitHub .

Fotografija putem m01229 / Flickr (CC BY 2.0)