Как създадох най-добрата хакерска игра Candy Crush някога

Как създадох най-добрата хакерска игра Candy Crush някога

BY ДЖО ЛЕВИ


optad_b

След като получи голям интерес към Trivia Cracker , разширение за Chrome, което ви позволява лесно мамят в популярната игра Trivia Crack , Реших, че може да е интересно да видя дали съществуват същите видове уязвимости в други популярни игри. Предвид безумната му популярност, първата игра, която мислех да разследвам, разбира се, беше Candy Crush .

За тези от вас, които живеят под скала, Candy Crush Saga е мач-три пъзел игра за Facebook , iPhone и Android, пуснати през 2012 г. Въпреки че по същество е преработен Bejeweled , Candy Crush е успял да покара класациите на „най-популярните“ магазини за приложения, за разлика от всяка игра преди него. Дори сега, три години след пускането му, е така Още е силен като топ приложение както в магазините за приложения за iOS, така и за Google Play. И това да не говорим за лудите 75 милиона харесвания Candy Crush се натрупа във Facebook.



Като се има предвид нейната популярност, бихте си помислили, че разработчиците на такава изискана и успешна игра може да са отделили време да я внедрят по начин, който е сигурен от измама. Но, както се оказва, писането на някакъв код за измама Candy Crush всъщност е доста проста. Точно като с Trivia Crack , през уикенда успях да напиша и пусна разширение за Chrome, Candy Crush Cracker , Което ме превърна от посредствен в най-добрия случай Candy Crush играч до богоподобна трошачка за бонбони. Можете да видите Candy Crush Cracker в действие по-долу, където го използвам, за да спечеля допълнителни животи и да побеждавам нива с какъвто и да е резултат:

И така, какво не е наред Candy Crush Saga Изпълнението, което ми позволи толкова лесно да създам инструмент, който позволява на всеки да изневерява? Накратко, биене на ниво в Candy Crush е толкова лесно, колкото изпращането на заявка до Candy Crush сървър казва, че сте победили нивото. Можете дори да изпратите резултат - всеки резултат -, за да кажете, че сте победили нивото с този резултат. Подробностите за уязвимостта, как я намерих и как изградих разширение за Chrome, за да се възползвам от него, са по-долу.

Как да хакна Candy Crush Saga

1) Намиране на уязвимостта

Много от моите приятели са Candy Crush фанатици, постигане на резултати и достигане на нива, които никога не бих могъл естествено. Но докато моята Candy Crush способностите непрекъснато ме проваляха, реших, че може би моите обратни инженерни умения биха могли да ме отведат до нови високи точки за смачкване на бонбони. Подозирах, че може да е възможно да изпращам собствени заявки до Candy Crush Или използвайте някои данни в отговорите, изпратени на клиента от Candy Crush Сървъри, за да спечелите предимство в играта. И така, започнах да изследвам какви видове данни са Candy Crush клиент и сървър преминават напред и назад.



За да проверя тези данни, следвах почти същия процес като при Trivia Crack . играх Candy Crush в моя браузър във Фейсбук , докато записва и проверява заявките и отговорите, изпратени между Candy Crush Клиент и сървър, използвайки инструмент, който бях създал преди това Гаргъл . Да, знам, че бих могъл да използвам Fiddler или Charles или Chrome’s Developer Tools, за да направя същото. Реших вместо това да използвам Gargl, защото освен че ви позволява да преглеждате заявки / отговори на клиент / сървър, Gargl ви позволява да модифицирате и параметризирате тези заявки и след това автоматично генерира модули на избран от вас език за програмиране, за да можете да правите същите тези заявки без да пишете ред код. Но повече за това по-късно.

Както и да е, след като разказа Гаргъл за да започнете да записвате и да отидете Candy Crush във Facebook в моя браузър, първата стъпка беше да разбера коя от многото заявки, изпратени на тази страница във Facebook, бяха свързани Candy Crush , срещу самия Facebook. Проверката на HTML на страницата показа, че Candy Crush съдържанието на флаш е вградено във Facebook чрез вградена рамка. Елементът точно над тази вградена рамка беше форма, предназначена за публикуване на специфичен URL адрес - https://candycrush.king.com/FacebookServlet/ .

Джо Леви

Знаех, че King е компанията, която създава Candy Crush Saga , така че подозирах, че това е домейнът къде Candy Crush се хоства. Следващата стъпка беше просто да започнете да играете Candy Crush и докато играех, за да разгледам заявките, Gargl установява, че страницата отправя към всеки URL адрес, съдържащ „king.com“:



Джо Леви

Докато бия нива в Candy Crush , Забелязах, че сякаш се издава нова молба за всяко ниво. Исканията изглежда бяха издадени веднага след като успешно завърших ниво:

Джо Леви

Така че, изглежда, може би клиентът казва на Candy Crush сървър, когато играта приключи. Това ме накара да си помисля, че клиентът не просто казва, че играта е приключила, но също така казва дали потребителят е победил нивото или не и ако нивото е победено, с какъв резултат потребителят е победил нивото.

Реших, че имам преднина и се впуснах в подробностите на тази заявка за „gameEnd“.

2) Уязвимостта в детайли

Използвайки Гаргъл да погледнете “candycrush.king.com/api/gameEnd3? заявка / отговор в детайли, успях да потвърдя, че наистина казва на сървъра, когато играта приключи, и резултата, с който потребителят побеждава нивото:

Джо Леви

Както можете да видите по-горе, заявката, изпратена до сървъра, съдържа като параметър на низа на заявка JSON обект, съдържащ резултата, с който е бито нивото, идентификатора на нивото, което е бито, както и куп друга информация. Името на параметъра на низа на заявката е не особено описателно „arg0?“ - може би опит на създателите на играта да се опитат да скрият факта, че този параметър е тайната за създаване на всички ваши Candy Crush мечтите се сбъдват!

Пълната стойност на стойността на параметъра „arg0?“ Изглежда по-долу:

Джо Леви

От някои експерименти и наблюдение на тази заявка, когато завърших няколко нива, успях да разбера какво означават повечето полета в arg0 и откъде идват. EpisodeId и levelId се използват за идентифициране на нивото и могат да бъдат намерени в заявката, изпратена до сървъра, когато започнете да играете ниво — https: //candycrush.king.com/api/gameStart2.

Семена също могат да бъдат намерени в тази заявка „gameStart“ и изглежда, че представляват произволно семе за това как трябва да изглежда оформлението на бонбоните в нивото. В допълнение, всяка заявка за API, отправена към Candy Crush трябва да се изпрати с параметър низ на заявка „_session“, за да се идентифицира текущата потребителска сесия. Тази стойност може да се намери и в заявката на gameStart и наистина във всяка заявка към Candy Crush , за този въпрос.

Ето как изглежда заявката https://candycrush.king.com/api/gameStart2:

Джо Леви

Отново изглежда Candy Crush Създателите са или наистина лоши в измислянето на имена на параметри на рекламата, или се опитват да замъглят тази информация, за да затруднят манипулирането на техния API. EpisodeId се изпраща чрез параметър на низ за заявка, наречен „arg0“, levelId се изпраща като „arg1“, а семето се изпраща като „arg2“. По някаква причина те все пак решиха да използват доста описателно име за маркера на сесията - „_ session“.

Различни от episodeId, levelId, score и seed, останалите полета в параметъра низ на заявката arg0 на заявката gameEnd са маловажни и могат да бъдат кодирани твърдо, както по-горе. Това е, с изключение на cs. Cs в този случай вероятно означава контролна сума, защото ако не изпратите правилната стойност за нея, заявката ще се провали. Оказва се, че и конструирането на стойността на полето за контролна сума не е толкова трудно. За да получите правилната контролна сума, просто MD5 хешира определен низ и използвайте първите шест знака от този низ като контролна сума. Низът за хеширане съответства на формата:

::: - 1 ::: BuFu6gBFv79BH9hk

UserId е единствената информация, която все още не разполагаме, необходима за изграждането на горния низ. Изпраща се в заявката “gameInit”, която се случва всеки път, когато зареждате Candy Crush Saga —Https: //candycrush.king.com/api/gameInitLight. Можете да направите тази заявка по всяко време (разбира се, като предавате _session като параметър на низа на заявката) и отговорът ще съдържа вашия userId:

Джо Леви

Страхотно, вече имаме всичко необходимо, за да направим заявката за игратаEnd!

Нека опитаме да пуснем тази информация в композитора на Fiddler, насочвайки се към първото ниво на играта и да видим какво се случва, когато въведем резултат от 100 000, изчислим контролната сума, направим заявката gameEnd и след това презаредим Candy Crush Saga :

Джо Леви

Е, приятели мои, изглежда, че успешно сме се счупили Candy Crush !

Докато Candy Crush Saga предприе някои защитни мерки, позволявайки на една молба да завърши нивото, с какъвто и да е резултат, е в пряк конфликт с „ Защитно програмиране 'Практика на програмиране - особено' никога не се доверявайте на клиента ”Принцип на уеб програмиране. Тъй като сървърът няма контрол върху това как клиентът действа, той не може да предположи, че клиентът няма да действа по злонамерен начин и затова трябва да се защити. По-добър начин за прилагане на „завършване на нива“ би бил да накарате клиента да изпраща всеки ход, който потребителят прави в нивото, към сървъра и да накара сървъра да определи дали тези ходове успешно печелят резултат, достатъчно висок, за да завърши нивото. Въпреки че този метод също не е перфектен, той поне означава, че клиентът, независимо дали чрез ръчно действие на потребителя или чрез някакъв автоматизиран метод, трябва да играе нивото, вместо просто да каже на сървъра „Печеля“.

Въпреки това, Candy Crush не направи това и вместо това се доверява на клиента. Сега беше просто въпрос на създаване на злонамерен клиент, за да се възползва от факта, че клиентът може просто да каже на сървъра, че е спечелил произволно ниво. В идеалния случай такъв, който би бил лесен за инсталиране и използване от нетехнически потребители. Хм ... какво ще кажете за разширение за Chrome, което просто добавя бутон към Candy Crush игра, когато се играе във Фейсбук , Че при щракване автоматично бие текущото ниво ??

3) Възползване от уязвимостта

Както споменах по-горе, Гаргъл ви позволява да приемате заявките, които сте имали, да ги записва, модифицира и параметризира при необходимост и след това автоматично да генерира модули на избран от вас език за програмиране, за да направи същите тези заявки. Няма да навлизам в подробностите на този процес, тъй като можете да разгледате един от моите Постове в блога на Gargl за да намеря тази информация, но по същество генерирах Файл на шаблона на Gargl за Candy Crush Различни заявки за API, използвайки Разширение за Gargl Chrome , а след това използва Gargl генератор, за да превърне този файл с шаблон в Candy Crush JavaScript библиотека . Използването на Gargl за това ми позволи да създам JavaScript библиотека, която да разговаря Candy Crush На сървъри, без да пиша ред код, за да го направя, както и да имам файл с шаблон за в бъдеще, в случай че искам да направя същото по-късно с друг език за програмиране.

След като имах това Candy Crush JavaScript библиотека, беше просто да се изгради разширение за Chrome в JavaScript, което работи в домейна, зареден в Candy Crush Вътрешната рамка на страницата на играта във Facebook (candycrush.king.com) добавя бутон към HTML за играта и когато се кликне върху този бутон, се иска от потребителя резултат, прави горните стъпки за намиране на episodeId, levelId, seed, _session и userId и след това издава заявката gameEnd, за да победи текущото ниво.

Джо Леви

И точно така, Candy Crush Cracker е роден! Любопитни сте за точните подробности как работи Candy Crush Cracker? Вижте изходния код на GitHub .

Снимка чрез m01229 / Flickr (CC BY 2.0)