Hvordan jeg byggede det bedste Candy Crush-hack nogensinde

Hvordan jeg byggede det bedste Candy Crush-hack nogensinde

VED JOE LEVY


optad_b

Efter at have modtaget en masse interesse for Trivia Cracker , en Chrome-udvidelse, der gør det nemt for dig snyde i det populære spil Trivia Crack , Besluttede jeg, at det kunne være interessant at se, om de samme slags sårbarheder eksisterede i andre populære spil. I betragtning af sin vanvittige popularitet var det første spil, jeg tænkte at undersøge, selvfølgelig Slik ødelæggelse .

For de af jer, der bor under en klippe, Candy Crush Saga er et match-tre puslespil til Facebook , iPhone og Android, udgivet tilbage i 2012. Selvom det i det væsentlige er en reskinned Bejeweled , Slik ødelæggelse har formået at køre på de 'mest populære' App Store-diagrammer i modsætning til ethvert spil før det. Selv nu, tre år efter udgivelsen, er det går stadig stærkt som en topapp i både iOS- og Google Play-appbutikkerne. Og det er ikke at nævne de sindssyge 75 millioner likes Slik ødelæggelse har samlet op på Facebook.



I betragtning af dens popularitet vil du tro, at udviklerne af et så poleret og succesfuldt spil måske har taget sig tid til at implementere det på en måde, der er sikker mod snyd. Men som det viser sig, at skrive en kode til at snyde på Slik ødelæggelse er faktisk ret simpelt. Ligesom med Trivia Crack , i løbet af en weekend var jeg i stand til at skrive og frigive en Chrome-udvidelse, Candy Crush Cracker , Der konverterede mig fra et middelmådigt-i bedste fald Slik ødelæggelse spiller til en gudlignende slikknuser. Du kan se Candy Crush Cracker i aktion nedenfor, hvor jeg bruger den til at få ekstra liv og til at slå niveauer med den score, jeg vil:

Så hvad er der galt med Candy Crush Saga Implementering, der gjorde det muligt for mig så let at bygge et værktøj, der lader nogen snyde? Kort sagt, slå et niveau i Slik ødelæggelse er lige så let som at sende en anmodning til Slik ødelæggelse server siger du slå niveauet. Du kan endda sende en score med - hvilken som helst score - for at sige, at du slår niveauet med den score. Detaljerne om sårbarheden, hvordan jeg fandt den, og hvordan jeg byggede en Chrome-udvidelse for at drage fordel af den, er nedenfor.

Sådan hackes Candy Crush Saga

1) At finde sårbarheden

Mange af mine venner er det Slik ødelæggelse fanatikere, opnå scoringer og nå niveauer, ville jeg aldrig være i stand til naturligt. Men mens min Slik ødelæggelse evner har konstant svigtet mig, jeg regnede måske med, at mine reverse engineering-færdigheder kunne føre mig til nye slikknusende højder. Jeg formodede, at det kunne være muligt at sende mine egne anmodninger til Slik ødelæggelse Servere, eller brug nogle data i svarene, der sendes til klienten fra Slik ødelæggelse 'S servere for at få en fordel i spillet. Så jeg begyndte at undersøge, hvilke slags data Slik ødelæggelse klient og server passerer frem og tilbage.



For at inspicere disse data fulgte jeg stort set den samme proces som med Trivia Crack . jeg spillede Slik ødelæggelse i min browser på Facebook , mens du registrerer og inspicerer de anmodninger og svar, der sendes imellem Slik ødelæggelse 'S klient og server ved hjælp af et værktøj, jeg oprettede tidligere kaldet Gargl . Ja, jeg ved, at jeg kunne have brugt Fiddler eller Charles eller Chrome's Developer Tools til at gøre det samme. Jeg besluttede at bruge Gargl i stedet for foruden at lade dig se klient- / serveranmodninger / svar, giver Gargl dig også mulighed for at ændre og parametrere disse anmodninger og derefter automatisk generere moduler i et programmeringssprog efter eget valg, så du kan komme med de samme anmodninger uden at skrive en linje kode. Men mere om det senere.

I hvert fald efter at have fortalt Gargl for at starte optagelse og gå til Slik ødelæggelse på Facebook i min browser var det første trin at finde ud af, hvilke af de mange anmodninger, der blev sendt på denne Facebook-side, var relateret til Slik ødelæggelse , versus Facebook selv. Inspektion af HTML på siden viste, at Slik ødelæggelse flash-indhold er integreret i Facebook via en iframe. Elementet lige over denne iframe var en form, der var beregnet til at sende til en ejendommelig URL - https://candycrush.king.com/FacebookServlet/ .

Joe Levy

Jeg vidste, at King er det firma, der skaber Candy Crush Saga , så jeg formodede, at dette er domænet hvor Slik ødelæggelse er vært. Det næste trin var bare at begynde at spille Slik ødelæggelse , og da jeg spillede for at se på anmodningerne, finder Gargl, at siden gør til enhver URL, der indeholder 'king.com':



Joe Levy

Da jeg slog niveauer ind Slik ødelæggelse , Bemærkede jeg, at der syntes at blive udstedt en ny anmodning for hvert niveau. Anmodningerne syntes at være udstedt lige efter at jeg med succes havde gennemført et niveau:

Joe Levy

Så det syntes, måske klienten fortæller det Slik ødelæggelse server, når et spil er slut. Dette fik mig til at tænke måske, at klienten ikke bare siger, at spillet er forbi, men siger også, om brugeren slog niveauet eller ej, og hvis niveauet blev slået, med hvilken score brugeren slog niveauet.

Jeg regnede med, at jeg havde en føring og gravede mig ind i detaljerne i denne 'gameEnd' -anmodning.

2) Sårbarheden i detaljer

Ved brug af Gargl at se på “candycrush.king.com/api/gameEnd3? anmodning / svar i detaljer, var jeg i stand til at bekræfte, at det faktisk fortæller serveren, når spillet er slut, og den score, som brugeren slog niveauet med:

Joe Levy

Som du kan se ovenfor, indeholder anmodningen, der sendes til serveren, som en forespørgselsstrengparameter et JSON-objekt, der indeholder det score, niveauet blev slået med, ID'et for det niveau, der blev slået, samt en masse andre oplysninger. Forespørgselsstrengparameterens navn er et ikke-meget-beskrivende “arg0?” - måske et forsøg fra spillets skabere på at forsøge at skjule det faktum, at denne parameter er hemmeligheden bag at lave alle dine Slik ødelæggelse drømme går i opfyldelse!

Den fulde værdi af “arg0? Parameterværdien ser ud som nedenfor:

Joe Levy

Fra nogle eksperimenter og at se denne anmodning, da jeg var færdig med flere niveauer, kunne jeg skelne, hvad de fleste felter i arg0 betyder, og hvor de kommer fra. EpisodeId og levelId bruges til at identificere niveauet og kan findes i anmodningen sendt til serveren, når du begynder at spille et niveau — https: //candycrush.king.com/api/gameStart2.

Frø kan også findes i denne 'gameStart' -anmodning og ser ud til at repræsentere et tilfældigt frø til, hvordan slikets layout i niveauet skal se ud. Derudover hver API anmodning til Slik ødelæggelse skal sendes med en '_session' -forespørgselsstrengsparameter for at identificere den aktuelle brugersession. Denne værdi kan også findes i gameStart-anmodningen og virkelig i enhver anmodning til Slik ødelæggelse , for den sags skyld.

Sådan ser https://candycrush.king.com/api/gameStart2-anmodningen ud:

Joe Levy

Igen ser det ud Slik ødelæggelse Skaberne er enten rigtig dårlige til at komme med kreative parameternavne, eller de forsøger at tilsløre disse oplysninger for at gøre det sværere at manipulere deres API. EpisodeId sendes via en forespørgselsstrengparameter kaldet 'arg0', levelId sendes som 'arg1', og frø sendes som 'arg2.' Af en eller anden grund besluttede de dog at bruge et ret beskrivende navn til sessionstokenet - '_ session.'

Bortset fra episodeId, levelId, score og seed er resten af ​​felterne i gameEnd-anmodningens arg0-forespørgselstrengparameter uvigtige og kan være hårdkodede som ovenfor. Det vil sige bortset fra cs. Cs i dette tilfælde står sandsynligvis for kontrolsum, for hvis du ikke sender den rigtige værdi til det, vil anmodningen mislykkes. Det viser sig, at det heller ikke er så svært at konstruere værdien af ​​kontrolsumfeltet. For at få den korrekte kontrolsum skal du blot MD5 hash en bestemt streng og bruge de første seks tegn i den streng som kontrolsum. Strengen til hash matcher formatet:

::: - 1 ::: BuFu6gBFv79BH9hk

UserId er det eneste stykke information, vi ikke allerede har, og som er nødvendige for at konstruere ovenstående streng. Det sendes i 'gameInit' anmodningen, der sker hver gang du indlæser Candy Crush Saga —Https: //candycrush.king.com/api/gameInitLight. Du kan foretage denne anmodning når som helst (naturligvis videregive _session som en forespørgselsstrengeparameter), og svaret indeholder din userId:

Joe Levy

Fantastisk, vi har nu alt, hvad vi har brug for til at gøre spilletEnd anmodning!

Lad os prøve at poppe disse oplysninger ind i Fiddlers komponist, målrette mod det første niveau i spillet, og se hvad der sker, når vi indtaster en score på 100.000, beregner kontrolsummen, foretager spilletEnd anmodning og derefter genindlæser Candy Crush Saga :

Joe Levy

Nå, mine venner, det ser ud til, at vi med succes har knækket Slik ødelæggelse !

Mens Candy Crush Saga tog nogle defensive tiltag, så en enkelt anmodning om at fuldføre niveauet med enhver score er i direkte konflikt med “ Defensiv programmering ”Praksis med programmering - især“ stol aldrig på klienten ”Webprogrammeringsprincip. Da serveren ikke har kontrol over, hvordan klienten handler, kan den ikke antage, at klienten ikke handler skadeligt, og det skal derfor beskytte sig selv. En bedre måde at implementere 'fuldførelsesniveauer' på ville være at få klienten til at sende hvert træk, som brugeren foretager i niveauet til serveren, og at få serveren til at afgøre, om disse bevægelser med succes tjener en score, der er høj nok til at fuldføre niveauet. Selvom denne metode heller ikke er perfekt, betyder det i det mindste, at klienten, enten gennem manuel brugerhandling eller via en automatisk metode, skal spille niveauet i stedet for bare at fortælle serveren 'Jeg vinder.'

Imidlertid, Slik ødelæggelse gjorde ikke dette og stoler i stedet på klienten. Nu var det bare et spørgsmål om at oprette en ondsindet klient for at drage fordel af det faktum, at klienten bare kan fortælle serveren, at den vandt et vilkårligt niveau. Ideelt set en der ville være let for ikke-tekniske brugere at installere og bruge. Hmm ... hvad med en Chrome-udvidelse, der bare tilføjer en knap til Slik ødelæggelse spil, når det spilles på Facebook , At når der klikkes, slår det aktuelle niveau automatisk ??

3) Udnyttelse af sårbarheden

Som jeg nævnte ovenfor, Gargl giver dig mulighed for at tage de anmodninger, du fik det til at registrere, ændre og parametrere dem efter behov, og derefter automatisk generere moduler på et programmeringssprog efter eget valg for at stille de samme anmodninger. Jeg vil ikke gå i detaljer med denne proces, da du kan se på en af ​​mine Gargl blogindlæg for at finde den information, men i det væsentlige genererede jeg en Gargl skabelonfil til Slik ødelæggelse 'S forskellige API-anmodninger ved hjælp af Gargl Chrome udvidelse , og brugte derefter en Gargl-generator til at gøre denne skabelonfil til en Slik ødelæggelse JavaScript-bibliotek . Brug af Gargl til dette tillod mig at oprette et JavaScript-bibliotek, der taler med Slik ødelæggelse Servere uden at skrive en kodelinje for at gøre det og også at have en skabelonfil til fremtiden, hvis jeg senere vil gøre det samme med et andet programmeringssprog.

Engang havde jeg det her Slik ødelæggelse JavaScript-bibliotek, det var et simpelt spørgsmål at opbygge en Chrome-udvidelse i JavaScript, der kører på det domæne, der er indlæst i Slik ødelæggelse Facebook-spilsidens iframe (candycrush.king.com), tilføjer en knap til HTML for spillet, og når der klikkes på denne knap, beder brugeren om en score, gør ovenstående trin for at finde episodeId, levelId, seed, _session og userId, og udsteder derefter gameEnd-anmodningen om at slå det aktuelle niveau.

Joe Levy

Og bare sådan, Candy Crush Cracker var født! Er du nysgerrig efter de nøjagtige detaljer om, hvordan Candy Crush Cracker fungerer? Tjek kildekoden til GitHub .

Foto via m01229 / Flickr (CC BY 2.0)