Кто создал game blaster чит
Перейти к содержимому

Кто создал game blaster чит

  • автор:

История Game Genie — чит-устройства, которое всколыхнуло мир

О читерстве в играх можно рассказывать много. Это история настолько древняя, что трудно понять, в какой момент времени люди стали использовать читы. Разработчики включали читы для облегчения разработки, поэтому их можно найти даже в Manic Miner и аркадном автомате Gradius. В первых компьютерных играх геймеры могли с помощью POKE изменять значения данных, а игровые журналы печатали списки таких команд, ведь они не только могли дать бесконечные жизни, но и исправить ошибки, мешавшие прохождению игры. Бывало и так, что разработчики сами добавляли читы, пароли и коды для того, чтобы игроки могли их использовать.

Короче говоря, «коррекция» игр существовала всегда. Но особый интерес вызывают физические чит-устройства, которые обрели немалую популярность в 90-х годах. Многие считают, что первопроходцем была Game Genie, однако это не так. Чит-картриджи изначально появились на рынке домашних компьютеров, и первым их примером стал Action Replay от Datel, выпущенный для C64 и других компьютеров в 1985 году. Британская компания Romantic Robot также выпускала периферийные устройства Multiface для различных компьютеров. Это позволяло использовать не только читы, но и делать сохранения игр.

Так что к моменту выхода Game Genie в 1990 году концепция чит-устройств была уже хорошо известна. Однако, в отличие от Game Genie, ни одно из устройств не вызвало гнева Nintendo, направившей судебный иск аж на 15 миллионов долларов.

В 1980-х Codemasters занималась разработкой игр для ZX Spectrum и других устройств. Причём это была одна из немногих компаний, которая продавала свою продукцию по неизменно низкой розничной цене. Как рассказывал соучредитель Codemasters Дэвид Дарлинг, всё началось с выпуска серой консоли NES от Nintendo в Америке, которая поначалу не вызвала особого интереса.

На выставке CES в Чикаго присутствовала небольшая японская компания Nintendo, у которой была забавная маленькая консоль. Люди как-то слабо на неё реагировали, да и сотрудники Codemasters просто отметили забавную вещицу, быстро забыв про неё. Однако шесть месяцев спустя Nintendo была повсюду. Она стала популярной в Америке. Даже на заправочных станциях продавали игры Nintendo. Поэтому братья Дарлинг подумали: «это устройство, с которым нужно работать».

Для разработки для NES требовалась дорогая лицензия от Nintendo. Но когда представители Codemasters в ходе CES попытались поговорить с Nintendo о том, чтобы делать игры для них, те даже не стали слушать. Причина была «уважительной»: ребята не записались на приём. Такое отношение было принято как вызов. Ребята решили, что будут создавать что-то своё для приставки NES, но без одобрения Nintendo.

Как позднее рассказывал Ричард Дарлинг, второй соучредитель Codemasters, самым сложным было найти способ обойти защиту NES, чтобы игры не считались поддельными. «Злым гением» для Nintendo стал Тед Каррон, ещё один участник команды Codemasters. Возмущённый апатией японского холдинга, он всерьёз принялся за работу. Реверс-инжиниринг приставки, взлом системы безопасности, создание собственного комплекта разработки для NES, и даже разработка самой Game Genie — всё это зависело от технических знаний Каррона.

Четвёртый участник команды, Эндрю Грэм, вспоминал, что после того, как он «разобрал» игру Treasure Island Dizzy (Диззи на острове сокровищ) с помощью самодельной системы разработки Codies, Тед создал систему «Хит Робинсон», которая состояла из ПК, подключённого к Commodore 64, подключённого к коробке, полной проводов и электроники. И всё это подключалось к приставке NES. Этого игрового монстра Тед отправил Эндрю в Шотландию, а сам занялся модернизацией устройства. В результате последующие комплекты для разработки NES были в более компактными. А назывались они в честь персонажей фильма «Бегущий по лезвию».

Джина выпустили из бутылки

Изначально Codemasters планировала уйти от разработки компьютеров и начать создавать консольные игры. Это объяснялось тем, что первые успехи компании были связаны с бюджетными играми и спортивными симуляторами. Ведь намного проще привлечь уже существующую аудиторию (например, поклонников BMX или регби), а не наращивать базу фанатов с нуля. Хотя пробным шаром Codemasters в отношении NES был перенос уже существующих компьютерных игр наподобие Dizzy, в компании всё равно думали о способах охвата более широкой аудитории. А есть ли более широкая аудитория, чем все геймеры сразу?

Ребята попытались придумать концепцию игры, которая понравилась бы абсолютно всем. И решили, что для достижения этой цели необходимо предоставить игре множество опций, чтобы люди могли сделать её сложной или лёгкой. Менять игру так, как им заблагорассудится.

Казалось, это невозможно, ведь игры Nintendo находятся на картридже и поменять ПЗУ не получится. Однако решение всё-таки нашлось: можно не менять ПЗУ, а немного его обмануть.

На одном из регулярных собраний, проводимых разработчиками, были сформулированы потребности любого геймера: управление количеством патронов и жизней, добавление нового оружия и тому подобные вещи. Далее нужно было сделать интерфейс, который мог бы взаимодействовать с существующими играми и давать геймерам дополнительные возможности. В Codemasters понимали, это понравится всем американским детям, играющим в Super Mario Bros. Так возникла идея создать устройство, которое каким-то образом изменит поведение существующих игр. И одним прекрасным днём Тед Каррон создал прототип такого устройства.

Как именно он это сделал, Тед не рассказывает. Говорит, из-за юридических рисков. Но можно примерно понять принцип самого устройства. Для работы в Codemasters использовали анализаторы LA4800, которые выглядят гораздо внушительнее, чем есть на самом деле.

Приблизительно можно понять, как всё работало. Есть куча цифровых входов, скажем, 32 ~ 48, и LA4800 выполняет их выборку с любой скоростью, которая нужна, скажем, 20 МГц. Затем он отображает результаты либо в виде волнистых линий для одного для одного входа или чисел. Благодаря захвату данных можно было увидеть, что процессор делал с памятью во время работы. Так удавалось понять, что происходит.

Чит-устройство для первой версии NES было создано всего за 6 месяцев. И то часть времени ушла на знакомство с принципами создания оборудования и подбор людей, готовых этим заниматься. ПЗУ для пользовательского интерфейса будущего Game Genie было написано Эндрю Грэмом, а коды — Джоном Мензисом.

Принцип работы кодов
Вожделенное окно ввода чит-кодов

Первые Game Genie работали как промежуточное звено между картриджем и консолью. После запуска консоли игроку показывалось меню, в котором можно было ввести 16 символов, каждый из которых соответствует шестнадцатеричному значению, и три пунктирные линии, позволяющие вводить коды из 6 или 8 символов. Каждый код представлял собой закодированную последовательность пар чисел «адрес — значение», которая в момент загрузки самой игры меняла соответствующие данные, поступающие из ПЗУ картриджа. Таким образом, устройство модифицировало код игры до того, как он будет запущен консолью, при этом содержимое ПЗУ оставалось не изменённым.

Если выразиться проще, то 6 и 8-символьные коды переводятся в адреса данных игры (верхняя половина адресного пространства 0x8000-0xFFFF), что позволяет Game Genie обманывать центральный процессор, подменяя ожидаемые байты на свои. Подобный процесс делает бесконечным количество возможных кодов, которые можно открыть.

Пример кодов из книги

Шестисимвольный код переводится в 15-разрядный адрес и 8-битный байт данных. Именно 15-разрядный, так как 15-й бит всегда выставлен как единица, чтобы ссылаться на верхнюю часть адресного пространства процессора. Когда CPU пытается считать адрес памяти, указанный в чит-коде, Game Genie перехватывает процесс и подставляет байт из кода, вместо фактического байта из ПЗУ картриджа.Чтобы расшифровать Game Genie код для NES, переведём каждый символ в его шестнадцатеричный эквивалент, используя эту таблицу:

A 0x0 P 0x1 Z 0x2 L 0x3 G 0x4 I 0x5 T 0x6 Y 0x7 E 0x8 O 0x9 X 0xA U 0xB K 0xC S 0xD V 0xE N 0xF

Сдвигая «связанные» биты, мы можем получить адрес и данные из Game Genie. Если у вас есть два кода, один из которых дает 5 жизней в игре, а второй 9 жизней, а разница между ними лишь в одном символе кода, то вполне очевидно, что при замене этого символа на любой другой из доступных, можно получить любое количество жизней в диапазоне от 1 до 16.

Представим каждый из переведенных в шестнадцатеричную систему символов чит-кода в виде переменных от n0 до n5. Затем используем следующий псевдокод (надеюсь, вы в курсе битовых операций AND (&) и OR (|), а также операций сдвига >):

Алгоритм объединяет в себе нижние 3 бита одного полубайта (4 бита) и берёт верхний бит из другого полубайта. В результате получаются другие 4 бита (3+1), которые помещаются куда-то ещё. Ниже алгоритм для данных:

Для примера возьмём код GOSSIP для игры Ghosts’n Goblins, который даёт персонажу на старте игры необычное оружие. Разберёмся, как это работает:

n0 n1 n2 n3 n4 n5 G O S S I P 0x4 0x9 0xD 0xD 0x5 0x1 0100 1001 1101 1101 0101 0001 address = 0xD1DD, data = 0x14

Мы видим, что когда CPU пытается считать данные из адреса 0xD1DD, Game Genie перехватывает процесс и возвращает байт 0x14.

Восьмисимвольные коды похожи на шестисимвольные. Разница лишь в том, что у них существует значение байта сравнения, которое тоже необходимо декодировать. Возможно, это связано с использованием играми мапперов памяти, увеличивающих объём доступных для использования данных.

Поскольку игра может свопить входящие и выходящие программные банки (PRG) из адресного пространства центрального процессора, Game Genie не может просто вернуть значение данных из чит-кода, когда процессор считывает из определённого адреса. Поэтому при чтении процессором данных с картриджа Game Genie проверяет, равен ли адрес из картриджа значению переменной сравнения и возвращает данные из чит-кода, если это так. В противном случае возвращаются реальные данные из картриджа.Алгоритм декодирования адрес для восьмисимвольного чит-кода такой же, как и для шестисимвольногои. А вот алгоритм декодирования данных чуть другой:

И ниже алгоритм декодирования переменной сравнения:

compare = ((n7 & 7) << 4) | ((n6 & 8) << 4) | (n6 & 7) | (n5 & 8);

Пример: чит-код ZEXPYGLA. Этот код позволяет в игре очищать ряд или колонку при совпадении трех цветов в линию, вместо изначально положенных четырех. Разберем по алгоритму:

n0 n1 n2 n3 n4 n5 n6 n7 Z E X P Y G L A 0x2 0x8 0xA 0x1 0x7 0x4 0x3 0x0 0010 1000 1010 0001 0111 0100 0011 0000 address = 0x94A7, data = 0x02, compare = 0x03

Здесь, во время считывания центральным процессором из адреса 0x94A7, проверяется наличие реального байта данных 0x03. Если все совпадает, Game Genie возвращает значение 0x02.

Взломщик игр

Коды давали самый разный результат. Например, если вставить в Game Genie игру Super Mario Bros. 3, а затем ввести пароль LEUXKGAA, можно было попасть в мир 1-1, а Марио превращался в Енота-Марио.

Вроде Марио, а вроде и енот

Поскольку Game Genie исправляет программный код игры, эти коды иногда называют кодами исправлений. Интересно, что Game Genie был защищен патентом США № 5112051 «Интерфейсное устройство для компьютерных игр» от 30 мая 1990 г. Срок действия этого патента истёк 30 мая 2010 г.

Само устройство поставлялось с буклетом, содержащим коды для всех последних игр того времени. Однако выбор букв для представления шестнадцатеричных значений казался совершенно произвольным. Возможно, это было сделано для того, чтобы увеличить вероятность того, что настоящие слова образуют коды, или чтобы упростить запись новых кодов. Например, «PIGPOG» в Super Mario Bros., который случайным образом меняет расположение врагов, намного легче запомнить и рассказать друзьям, чем эквивалент «154194». К сожалению, никто не рассказывает, почему интерфейс меню сформировался именно так. Каррон лишь загадочно утверждает, что «этот шестнадцатеричный код возник по юридическим причинам».

Вложенная инструкция

Новый продукт Codemasters был почти готов к выходу на рынок. Ему требовалось броское название. Первоначально Game Genie назывался «Power Pak», но затем переименован, так как по мнению соучредителя компании при вводе кодов у игроков исполнялись «три желания». Какими бы ни были причины, новое имя и фигура красного джинна стали культовым и привлекательным брендом. Забавно, но варианты Galoob и Camerica были совершенно разными. Джинн Camerica выходит из пламени в футуристическом научно-фантастическом забрале. Автора этого изображения установить не удалось. Это был кто-то из сотрудников фирмы-распространителя.

Чит-устройство было готово, оставалось его распространить. Первоначально делами в Канаде занималась Camerica, в то время как Lewis Galoob Toys работала на территории США, прежде чем в Galoob полностью взяла на себя управление. И, забегая вперёд, скажем, что продажи были очень хорошими.

Инструкция для покупателей

Game Genie для NES подключался к картриджу таким образом, что исключал возможность достать его из североамериканской консоли обычным способом путём нажатия на картридж. Из-за этого воздействие на ZIF-механизм вставки картриджа стало таким, что контакты разъёма изгибались ещё сильнее (узел вставки картриджа был одним из слабых мест консоли NES), что в конце концов приводило к тому, что играть в игры без установленного Game Genie становилось невозможным. Для решения этой проблемы разработчики выпустили адаптер, который Galoob предлагал владельцам Game Genie бесплатно, но их почти не брали, и запас был ликвидирован.

Тед Каррон занимался аппаратным обеспечением, а Эндрю Грэм работал над пользовательским интерфейсом. Последним серьезным препятствием на пути популярности устройства стал поиск кодов для существующих игр, которыми дополнялось устройство. Из-за универсального характера Game Genie, позволяющей использовать коды для всех игр NES — старых, нынешних и будущих — каждый код для каждой игры нужно было искать вручную, методом проб и ошибок. И не все найденные коды были рабочими в разных играх. Не существовало универсального решения для всех игр сразу, а это означало, что Codemasters нужно было привлечь больше людей, чтобы «грубой силой» пробиться сквозь стену шестнадцатеричных чисел.

Одним из самых известных «добытчиков» кодов стал Грэхэм Ригби, Вместе с Мензинсом он подключил Commodore 64 для управления прототипом Game Genie с помощью всплывающей утилиты, благодаря чему стало возможно вводить коды в шестнадцатеричном формате, что было намного удобнее, чем работа с контроллером NES. Кроме того, разработчикам удалось последовательно подключить два Genie, чтобы вводить до шести кодов одновременно. Это немного ускорило процесс. Игр было много, но в первую очередь искались коды для Mario и Mega Man, так как в них было весело играть.

На прохождение обычной игры уходило около трёх дней, а для некоторых популярных RPG этот срок удваивался. Ригби говорил, что ему особенно запомнился первый комплект разработчика: несколько рядов переключателей, припаянных к верхней части черной 5.25 дюймовой коробки для гибких дисков. Это были двоичные переключатели, в которых нужно было выбрать положение до 0 или 1, чтобы выбрать адрес и значение, которое хотелось установить. Возможно, это звучит неприглядно, но для всех, кто любил игры, это было невероятным опытом.

Коллеги Ригби вспоминали, что он был главным Codemeister, так как жил в комнате, заполненной только полками и стойками с играми NES — у него были все игры NES! Когда с помощью Galoob дела пошли в гору, команда получала около 10 игр каждые две недели. В то время многие игры не были доступны в Великобритании, поэтому сотрудники видели много нового. Очевидно, что некоторые игры не были хорошими, и им всё равно приходилось вкладывать время и силы в них, но в целом Ригби и другие искатели кодов играли во множество блестящих игр для NES в начале своей карьеры.

Nintendo против Galoob

Версия для NES впервые появилась на полках магазинов в 1990 году. Хотя Game Genie в конечном итоге стала известна исключительно как продукт Galoob, все же напомним, что Camerica продавала устройства в Канаде. Очень скоро Galoob столкнулся с судебным запретом Nintendo прекратить продажи в США, что привело к длительным судебным разбирательствам. В это же время канадские суды отклонили иск Nintendo против Camerica. Этот поворот фортуны привел к тому, что Camerica выпустила печально известный плакат «Спасибо, Канада», в котором говорилось: «Вы хотели Game Genie. Nintendo этого не сделала. Они пытались остановить нас. Они этого не сделали. Genie’s жив. Доступно только в Канаде!».

Тот самый плакат «Спасибо, Канада»

Надо сказать, что не Nintendo был инициатором разбирательств, хотя впоследствии и японцы подали многомиллионный иск. В мае 1990 года именно Galoob инициировала процесс, целью которого было получение официального заключения о том, что Game Genie не нарушает авторские права Nintendo, а также постановления суда, которое бы запрещало японской компании умышленно модифицировать NES таким образом, чтобы сделать чит-приставку и консоль несовместимыми. В понедельник 2 июля 1990 года, 46 дней спустя, суды вынесли предварительный судебный запрет в пользу не подстрекателя Galoob, а Nintendo. Galoob пришлось бы прекратить продавать Game Genie, пока судебное дело не закончилось. Судебный запрет был позже подтверждён апелляционным судом в среду, 27 февраля 1991 года.Уже ответным Nintendo стал встречный иск, в котором юристы компании утверждали, что творение Galoob нарушает авторские права Nintendo на разработанные игры, так как Game Genie создаёт производное произведение (игру с изменённым кодом) без разрешения правообладателя. Если бы суд признал правоту Nintendo, мир был бы другим.

Но американская судебная система встала на сторону геймеров, за что можно сказать спасибо окружному судье Ферн Мейерсон Смит, которая приняла решение, что после приобретения игровой консоли и картриджа покупатель имеет право экспериментировать с продукцией Nintendo так, как сочтёт нужным. То есть если он захочет модифицировать программный код и создавая его новые варианты для личного использования, то и пожалуйста. Так как речь не идёт о распространении полученных таким образом копий игр, то и нарушения закона тоже нет.

Хотя некоторые источники пытаются изобразить эту битву как сражение Давида против Голиафа, это не совсем верно. Galoob была основана в 1957 году и регулярно упоминается как одна из десяти крупнейших компаний по производству игрушек в США, а её общий доход за 1989 год составил 228 миллионов долларов. Nintendo же с момента выхода на розничный рынок США пыталась получить монополию на производство и продажу видеоигр, в основном закулисными методами. Это были настоящие монстры, которые пытались уничтожить друг друга в открытом судебном заседании. А вот и текст судебного постановления после полуторагодичного разбирательства. Nintendo подала апелляцию, и все закончилось только в четверг, 21 мая 1992 года, примерно два года спустя, по-прежнему в пользу Galoob. Nintendo не имеет обыкновения проигрывать юридические баталии, но история с Game Genie — один из немногих случаев, когда японская компания проиграла.

Однако даже после решения суда, прошла пара лет, прежде чем Galoob и Codemasters получили выплаты. В начале судебного процесса Nintendo должна была выплатить залог в размере 15 миллионов долларов в качестве обеспечения предварительного судебного запрета против Galoob. Когда Nintendo проиграла дело, она обжаловала исполнение этого залога, и только 17 февраля 1994 года Апелляционный суд Девятого округа отклонил протест. Деньги частично ушли в Galoob, а частично — в Codemasters.

Private Undetected ANDROID PRO — Приватный чит для PUBG MOBILE ✅ AIM ESP ✅ 249.00 RUB

Античит:Внутриигровой
Скрытие чита на записи:Протестировано на Samsung, Xiaomi, OnePlus
Поддерживаемые входы:Twitter, Facebook, гостевой вход и вход по Email
Поддерживаемые устройства:Только Android (root права не нужны)

Представляем вашему вниманию один из лучших приватных читов для PUBG MOBILE для ANDROID!
Данный чит работает на всех ANDROID девайсах без рут прав!
После покупки чита, вы получите видеоинструкцию по установке.

Android PRO для Pubg Mobile — уникальная разработка от наших партнеров для пабга. В чите есть множество функций, детальная настройка вх, аима и некоторых других мелочей. С этим читом вы сможете играть легитно и брутально, здесь есть уникальные функции, такие как speedhack, carfly, bullet и многое другое. Также программа будет регулярно обновляться под новые версии игры, так что вы не будете терять время подписки впустую из-за обновлений игры. Есть возможность скрыть чит от записи.

Спойлер: Функции

Visuals
Выделение противников квадратами
Имена противников
Количество здоровья, брони
Оружие в руках
Расстояние до врага
Предупреждение вокруг 360
Cкелеты у врагов
Транспорт
Вх на оружие
Вх на лут
Аирдропы и флаерганы
Возможность идентификации за стеной
Aimbot (убран во избежание банов)

Автонаводка
Компенсация отдачи и Удаление отдачи
Легитный и жесткие режимы
Выбор части тела: голова, живот, ноги
Аим при стрельбе или при прицеловании
Игнорить нокнутых и ботов
Цель ближе к прицелу
Цель ближе к вам
Отключить тряску
Misc

Быстрый бег flash
Спидхак при ноке
Стрельба сквозь стены
Лутать сквозть стены
Черные тела, небо, удаление травы и деревьев
Ночной режим
Маленький прицел
Хедшот 100%
Вид как на айпадах
Длинный прыжок
Возможность летать на машинах
Скрыть чит от записи


Only Russian region and CIS:
1 day — 249р КУПИТЬ
7 day — 990р КУПИТЬ
30 day — 2490р КУПИТЬ

Тех. поддержка оказывается только в Discord: НАПИСАТЬ В ПОДДЕРЖКУ (КЛИК)

Steam Приватный чит для PUBG [Jarvis Pak]

Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно.
Вам необходимо обновить браузер или попробовать использовать другой.

forealseller
Новичок

Автор темы

Системные требования:
OS / Поддерживаемые ОС :: Windows 10 от 1803 до 21H2
Game Mode / Поддерживаемый режим игры :: Windowed Mode, Borderless, Full screen / Оконный, Без рамок, Полноэкранный
Processors / Поддерживаемые процессоры :: Intel & AMD;

  • Покраска тела
  • Покраска одежды
  • Покраска экипировки каждого уровня
  • Покраска парашютов
  • Покраска транспорта
  • Покраска карты
  • Компенсация отдачи от 0% до 100%
  • Отключение анимации при стрельбе
  • Отключение тряски при стрельбе и прицеливание
  • Увеличенный урон
  • Быстрое прицеливание
  • Изменение кратности прицелов
  • Отключение травы
  • Оставить траву на 10 метров
  • Серый пол
  • Улучшенные звуки
  • Третье лицо в первом
  • Холодное оружие как ESP
  • Покраска холодного оружия в любой цвет
  • Смотреть сквозь стены
  • Ходить сквозь двери
  • Высокие прыжки
  • Увеличенный радиус лута

Спойлер: Пользовательское соглашение

Софт вы приобретаете на свой страх и риск.
Статус Undetected не гарантирует 100% защиту от блокировок(с любым читом в любой игре возможен бан).
Если обновление в игре дождитесь обновления софта.
Покупая данное ПО, вы соглашаетесь с правилом, что при детекте или полном закрытии проекта вы не получите возврат денежных средств!
Покупая данное ПО, вы соглашаетесь с правилом, что при блокировке игрового аккаунта вы не получите возврат денежных средства!

Спойлер: Политика возвратов, лицензионное соглашение на использование программ

1.1. Мы НЕ возвращаем средства, если Ваша Windows не соответствует нашему описанию.
1.2. Мы НЕ возвращаем средства и не совершаем обмен, если Вы купили не тот продукт.
1.3. Мы НЕ возвращаем средства, если Вы приобрели программу, а она по каким-либо причинам приостановила свою работу на определенный или неопределенный срок.
1.4. Если у Вас блокировка в программе (что вы обязаны знать), но покупаете её, то средства за покупку Вам не возвращаются.

История взлома всех игр в Telegram

Сейчас компьютерные игры везде. Присутствуют они и в Telegram. Расскажу о том, как были взломаны практически все игры этого мессенджера, обойдя самых первоклассных игроков, находящихся в топах скорбордов. Хочу поделится результатами исследований. О различных методиках взлома, читинга и путях обхода логики игр под катом.

@gamebot

Первая игра, которая была рассмотрена несколько месяцев назад — LumberJack, играя дровосеком, нужно рубить ветки так, что бы они не придавили игрока. Цель игры в том, что бы срубить как можно больше веток за определенное количество времени.

Изначально, хотелось попрактиковаться в графическом читинге игр, то есть на основе графических данных на мониторе принимать решение. Программа должна эмулировать реакцию человека, отправляя нужные комбинации клавиш, исходя из ситуации на экране. Принцип построения логики программы для текущей игры следующий. Делается скриншот экрана размером 600×1 пиксель по правую сторону дерева. Не весь экран, потому что на процесс снятия скриншота такого большого пространства уходит больше времени. Затем программа в 6 точках проверяет цвет пикселей и на основе этого рассчитывает траекторию движения игрока сразу для 6 веток. Если справа есть ветка, уйти влево, если нет — остаться справа. За один ход делается 2 удара топором. Выполняются ходы, затем снова делается скриншот и цикл повторяется. Так будет продолжаться, пока не закончится время.

Код программы для python 2.7 в ОС Ubuntu 16.04

import os, time import pyscreenshot as ImageGrab from Xlib import display def move_left(): os.system("xte 'key Left'") def move_right(): os.system("xte 'key Right'") def exist_branch(x, y): box = (x, y - 6 * 100, x+1, y) im = ImageGrab.grab(box) rgb_im = im.convert('RGB') x, y = im.size result = [] for i in range(0, 6): r, g, b = rgb_im.getpixel((0, y - 1 - i * 100)) summa = r + g + b if summa < 700: result.append(True) else: result.append(False) return result def get_mouse(): while True: data = display.Display().screen().root.query_pointer()._data x = data["root_x"] y = data["root_y"] print '%s,%s - %s' % (str(x), str(y), exist_branch(x, y)) def main(): start_x = 1543 start_y = 641 while True: branches = exist_branch(start_x, start_y) cons_str = "" for elem in branches: if elem: cons_str += 'Left ' else: cons_str += 'Right ' print cons_str for elem in branches: if elem: move_left() time.sleep(0.03) move_left() else: move_right() time.sleep(0.03) move_right() time.sleep(0.2) try: #get_mouse() time.sleep(5) main() except: print 'Exit..'

Для запуска нужно установить следующие зависимости

sudo apt-get install xautomation pip install pyscreenshot

За эмуляцию клавиш в среде Linux отвечает утилита xte, подробнее можно почитать тут. За снятие скриншота выбранного участка экрана отвечает библиотека pyscreenshot, подробнее читать тут. Для работы программы нужно задать первую точку (самую нижнюю ветку справа, или место, где она могла бы находится), для этого можно воспользоваться функцией get_mouse(). Высота между ветками — 100 пикселей. Задержки между нажатиями клавиш и задержка между снятием скриншотов выставлена методом проб и ошибок. Меньше, чем эти значения, установить не вышло, программа не успевала обрабатывать изображение или нажимать клавиши. Пример работы представлен на видео.

800 очков ни один человек набрать не сможет, так что результат работы программы можно считать победой.

Процесс написания и отладки занял довольно продолжительное время, так что нужно рассмотреть другие варианты решений.

Анализируя HTTP запросы, при окончании игры отправляется два типа запросов. Если пользователь не достиг нового рекорда.

POST /api/getHighScores HTTP/1.1 Host: tbot.xyz Accept: */* Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate, br Content-Length: 197 Content-Type: text/plain;charset=UTF-8 Connection: close data=[..some_base_64_code..]
POST /api/setScore HTTP/1.1 Host: tbot.xyz User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0 Accept: */* Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate, br Referer: https://tbot.xyz/lumber/ Content-Length: 206 Content-Type: text/plain;charset=UTF-8 Connection: close data=[..some_base_64_code..]&score=some_score 

Достаточно лишь подменить some_score на какое то значение, и новое число добавляется в таблицу.

В base64 отправляются данные о аккаунте, то есть id, имя игрока, который кликнул на игру, имя игры, а так же id чата.

Стоит отметить, что эта игра относится к боту @gamebot, на котором есть еще две игры, Math Battle и Corsairs. Более подробно была рассмотрена игра Math Battle.

HTTP запрос с количеством баллов отправляется похожий. Стоит попробовать отправить запрос через инспектор в браузере.

Открыв режим отладчика, открыть исходный код main.min.js. Поставить несколько брекпоинтов (точек останова), запустить игру и найти переменную r, в которой хранится количество очков. Через консоль это значение можно менять.

Отключив режим дебага, выполнится функция отправки очков и таким образом можно отправить уже заданное количество очков. Что бы не кликать много раз, включая\отключая инспектор, стоит немного разобраться в исходниках main.min.js, отредактированный сервисом JS Beautifier. Вот три интересные функции.

function ba(a, b, d) < var c = new XMLHttpRequest, e = [], f; for (f in b) e.push(encodeURIComponent(f) + "=" + encodeURIComponent(b[f])); c.onreadystatechange = function() < 4 == c.readyState && 200 == c.status && d(JSON.parse(c.responseText)) >; c.open("POST", a, !0); c.send(e.join("&")) > function na() < n && ba("/api/setScore", < data: n, score: r || 0 >, function(a) < e = a.scores; Y(); I(); a["new"] && l && (z = !0, x(M, "shown", z)) >) > function ca() < n && ba("/api/getHighScores", < data: n >, function(a) < e = a.scores; Y(); I() >) > 

Функция na() вызывается, когда достигнут новый рекорд, ca() нужна просто для получения scoreboard игры. Кстати, решение, какую функцию вызвать происходит в функции U() в этой строке.

r > Z ? na() : ca();

При изменении параметра r и вызове функции na() должен быть включен режим дебага. Должно получится примерно так.

Исходный код немного обфусцирован, это усложняет его анализ, но основные вещи ясны.

Игра Corsairs, относящаяся так же к боту @gamebot решается всеми вышеописанными методами. За различные запросы на сервер я был забанен, и не могу добавляться в scoreboard, аккаунт находится в бан листе. Нужно быть осторожным при тестировании игр этого бота.

@gamee

Довольно популярным был бот @gamee. Выбрана игра Qubo.

Запрос, отправляемый в конце игры следующий

POST /set-web-score-qkfnsog26w7173c9pk7whg0iau7zwhdkfd7ft3tn HTTP/1.1 Host: bots.gameeapp.com Accept: application/json, text/javascript, */*; q=0.01 Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate, br Content-Type: application/x-www-form-urlencoded; charset=UTF-8 Content-Length: 247 Origin: https://www.gameeapp.com Connection: close ">

Подменить score, как в предыдущем боте, уже не получится. Генерируются хэши, которые подписывают score, play_time и тд, что бы таким простым способом нельзя было накрутить очки. Отладчик не очень помог, так как в нем было очень много переменных.

Пришлось анализировать код вручную. В исходном коде страницы игры можно найти такой кусок кода.

Примечательно, что скрипты подключаются не обычным способом, а через запрос в js, и поэтому их не видно в инспекторе. Любопытные два файла — gameUI.min.js и gameUIdesktop.min.js. В первом файле нашлась такая функция, которая является методом объекта gameeUI.

saveScore: function(e) < var a = window.location.pathname, t = gameeUI.user, n = (new Date).getTime(), o = $("#dataId").data(), i = CryptoJS.AES.encrypt(JSON.stringify(< score: e, timestamp: n >), o.id, < format: CryptoJSAesJson >).toString(), s = < score: e, url: a, play_time: gameeUI.playTime, hash: i, username: t, anonymous_id: gameeUI.anonymous_id >; if (isFacebook()) < var r = FacebookUserData.getUserData(); s.app_scoped_user_id = r.app_scoped_user_id, s.user_id = r.user_id >gameeUI.sendScoreData(s) >

Очевидно, что входящий параметр e — очки, отправляемые на сервер. Отправив в консоли строку gameeUI.saveScore(some_score), можно получить заветное количество баллов.

К этому боту относятся игры «3+3», «Karate Kido», «Space Traveler», «Hexonix» и тд. Все решаются вышеописанным способом. Можно сделать вывод, что когда одна из игр очередного бота решается определенным способом, то им решаются и остальные игр этого бота.

@GamesHDBot

Довольно сложную по логике можно назвать игру «Galaxy Space Shooter». Красивая графика, много плюх в процессе игры, можно зарабатывать очки и монеты.

Но достаточно было заглянуть в инспектор, найти объект TlgAdapter и его метод putScore.

@ludeiBot

Любопытным оказался этот бот. Игра для тестирования — «Jumping Submarine».

Запрос при окончании игры следующий.

POST /v1/setscore HTTP/1.1 Host: telegram-games.ludei.com Accept: */* Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate, br Content-Type: application/json;charset=UTF-8 Content-Length: 73 Origin: https://angrypianohtml5.ludei.com Connection: close

Очки подменить просто. Примечательно то, что в открытом виде посылается user_id. Если узнать id всех пользователей в чате, то можно сделать следующую атаку типа спам. Сделать это можно через API Telegram.

Идея в том, что можно мало того, что менять очки другого игрока в таблице, так еще и спамить в общем чате, отсылая уведомления о новом победителе текущей игры. Это довольно серьезная атака, если правильно ее сделать. Нельзя определить, кто на самом деле накручивает очки, и даже после исключения человека из чата (атакующего или того, кто «спамит») — все равно можно продолжать безобразничать. Можно «спамить» от имени любого участника чата, включая админа, заставив админа чата исключить определенных людей. Единственный способ прекратить такое мракобесие — админу чата удалить сообщение с предложенной игрой.

К этому боту относятся так же игры «iBasket», «Sumon», «Angry Piano».

@MeduzaGameBot

К этому боту относятся 5 игр, и их можно применять для того типа атаки, который описан выше.
К примеру игра, всем знакомый сапер.

GET /embed/telegram-game-bot/?user_id=user_id&inline_message_id=chat_id&score=score HTTP/1.1 Host: meduza.io Accept: application/json, text/plain, */* Accept-Language: en-US,en;q=0.5 Connection: close

Здесь еще проще. Обычным GET запросом, зная id чата и id пользователей можно устраивать спам.

@foragamesbot

Тут всего одна игра — «DevRunner»

После окончания игры отправляется два запроса

POST /game/scored HTTP/1.1 Host: devrunner.fora-soft.com User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0 Accept: */* Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate, br Content-Type: application/x-www-form-urlencoded Referer: https://devrunner.fora-soft.com/?uid=453743655&imi=AgAAAKwAAAAnlAsbCh1sirM6oOQ Content-Length: 97 Cookie: _ga=GA1.2.2104866484.1507563316; _gid=GA1.2.1543721993.1507563316 Connection: close user_id=453743655&score=111111&chat_id=&message_id=&inline_message_id=AgAAAKwAAAAnlAsbCh1sirM6oOQ 
POST /game/scores_image HTTP/1.1 Host: devrunner.fora-soft.com Accept: */* Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate, br Content-Type: application/x-www-form-urlencoded Content-Length: 47 Connection: close crutches=1&bugs=2&scores=31&level=0&rank=Intern

Второй запрос позволяет увидеть, на каком месте игрок с текущим количеством баллов. До того, как было начато тестирование, на первом месте был игрок с 2000-3000 баллов, а забавно то, что всего играло в игру около 13к людей. Получается никто из этих людей не додумался перехитрить эту игру 🙂 Подменив запросы с количеством очков 111113 оказался на первом месте.

@brugamebot

Бота с этой игрой можно определенно назвать самыми скучными среди всех.

Пример — шахматы. Никакого рейтинга, оповещение о победе и так далее. Игра только client-side.

@microgamesbot

Эта игра так же одна в этом боте, «Jumper Frog».

Запрос в конце игры

POST /score HTTP/1.1 Host: microgames-ijwqbqxfic.now.sh User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0 Accept: */* Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate, br Content-Type: application/json; charset=UTF-8 Referer: https://microgames-ijwqbqxfic.now.sh/games/jumper_frog/?token=eyJhbGciOiJIUzUxMiJ9.eyJnYW1lIjoia. Content-Length: 14 Connection: close

Часть токена вырезана, но смысл должен быть ясен. На сервер отправляется в качестве данных только score. Подменить его просто. Вопрос в другом, как сервер распознал, что играл определенный человек, и записал его в scoreboard в чате телеграмма? А все просто — сервер берет данные из заголовка Referer токен, упомянутый выше. Странный костыль, насмешил. Логичный вопрос, что будет, если зайти по прямой ссылке на эту игру? Ничего особенного, вот только когда набрать очки, в ответ на запрос выше (без Referer) придет ответ такого вида.

Ловится ошибка, которая раскрывает абсолютные пути к файлам. В совместимости с LFI, например, уже можно достать много полезных данных. Но так как задача стояла в обнаружении недочетов игр, а не проводить полноценный пентест конкретной игры, на этом было решено остановится.

@foxgamebot

Теперь будет описана игра «Tricky Fox», которая является самой сложной по своей структуре среди всех, имеет относительно всех других игр высокий уровень безопасности, и что бы обойти ее, ушло много времени. Автор молодец, создал очень годную игру, было интересно ее разобрать. Процесс решения этой игры хочется описать подробно. Задача игрока — поедать куриц, прыгая из острова на остров. Зажимая левую клавишу мыши или палец на экране телефона можно заставить лисицу лететь нужное расстояния.

При окончании игры отправляется такой запрос

POST /game-api/expandScore HTTP/1.1 Host: play.alexbelov.xyz Accept: application/json, text/plain, */* Accept-Language: en-US,en;q=0.5 Content-Type: application/json;charset=utf-8 Content-Length: 432 Connection: close

Что за хэш пока не ясно. Это явно не hex или base64. В исходном 30 тысяч строк, если переформатировать код в читаемый вид. Был использован сервис JS Beautifier. Логично поискать какую нибуть подстроку по такому фильтру — post". Находится такая функция.

key: "setScore", value: function(e) < console.log(e); var t = "expandScore"; return this.apiRequest(t, < hash: e >, < method: "post" >) >

Поискав эту функцию через поиск, можно найти несколько мест, где она вызывается. К примеру из этих объектов — this.ApiService, или this.scoreView. Но ни один из них не был доступен через инспектор. Тогда было решено разобраться, что за хэш отправляется и как его декодировать.

Далее поиск производился уже по тексту setScore. Нашлась такая замечательная функция, которая объясняла примерно, как производится шифрование.

key: "saveResults", value: function() < var e = this, t = arguments.length >0 && void 0 !== arguments[0] ? arguments[0] : <>, n = window, r = n.gameMe, i = f.default.extend(< key: r._shard >, p), o = d.encrypt(i, JSON.stringify(t).split("").reverse().join("")); this.ApiService.setScore(o).then(function(t) < e.updateMe() >) >

Сначала JSON формат еще не известных данных переводится в строку, затем эта строка разбивается на символы в массиве, меняется задом на перед порядок этих символов и строка склеивается заново. Небольшая антиреверс фишка от разработчика? Поставив брекпоинт как на скриншоте был получен доступ ко всем текущим функциям и объектам, доступными конкретно в строке 14016.

Теперь можно получить доступ к некоторым интересным параметрам.

Получается, что все данные шифруются алгоритмом AES 256 в режиме ECB. Но вот что не понятно, воспользовавшись хорошим сервисом по симметричному шифрованию получил.

В то время, как программа выдавала другой результат.

Получается алгоритм шифрования тоже изменен, очередная фишка для антиреверса и процесса эксплуатации. Впрочем это не самая большая проблема. На сервер отправляется не количество очков, а массивы данных в формате JSON (отформатировано для читаемости, в запросе нет переносов и ни единого пробела).

Исходя из логики _t, это время, когда была съедена очередная курица в миллисекундах, _f — координаты острова или курицы, _s — номер, _n — следующий остров с съеденной курицей. Получается на сервере обрабатываются не то, сколько очков набрано, а данные о какие данные были зафиксированы при съедении куриц. Очень хорошая идея с точки зрения безопасности игры.

Проведя несколько игр, не вышло определить, что такое _p и _r, скорее всего они для отвлечения внимания и усложнения понимания кода, очередная фишка разработчика. Но все переменные варьировались в определенных пределах и было написан скрипт, который исходя из нужного количества времени и необходимого количества очков генерировал бы JSON массивы.

import time import json import random score = 3 #time = time.time() * 1000 time = 1507761372191 def generate(counter, time, score): if counter < 10: _s = counter else: _s = chr(counter + 87) _f = [200, random.randrange(360, 600) + random.randrange(2*10^14, 9*10**14)/(10.0*10**14)] _p = random.randrange(15, 80) / 100.0 _r = random.randrange(2*10^19, 9*10**19)/(10.0*10**19) _t = time result = if counter < score: time += random.randrange(1000, 6000) result['_n'] = generate(counter + 1, time, score) return result def start_generate(time, score): result = generate(1, time, score) result = json.dumps(result) result = result.split(' ') result = ''.join(result) return result def console_str(time, score): return "d.encrypt(i, '" + start_generate(time, score) + "'.split('').reverse().join(''));" print console_str(time, score)

Результат нужно было вставить в консоль и затем сделать подмену HTTP запроса. Увы это работало для нескольких очков, затем аккаунт был забанен. Видимо не все было учтено в скрипте.

Пришлось брать другой тестовый аккаунт, продолжать изучать исходный код и проводить тестирования. В исходнике много разных странных вещей присутствует, например реализованы все виды шифрования AES, или вот такой странный кусок кода с таблицами хэшей.

Или вот, например, непонятно зачем нужный ключ в base64 (при шифровании передавался md5 ключ).

И вот его расшифровка.

Это не все странности, найденные в коде. Впрочем, после еще нескольких часов отлаживания нашлось кое что интересное, функция catchAnimals.

key: "catchAnimals", value: function() < var e = this, t = [this.foxOffsetX, this.foxy.position.y], n = this.getHitAreaAnimal(this.foxy, t, this.foxOffsetX); if (n) < window.score = ++this.score; var r = v.Utils.getRandomInt(0, 100) / 100; r < .9 ? gameSounds && ion.sound.play("chicken_3") : gameSounds && ion.sound.play("chicken_1"), this.scoreView.setScore(this.score), this._passIslands || (this._passIslands = <>); var i = < _s: this.score.toString(20), _f: t, _p: r, _r: Math.random() * r, _t: (new Date).getTime() >, o = this.getListHead(this._passIslands); o._t ? o._n = i : y.default.extend(o, i), isWebGLRenderer && game.getFPS() > 45 && f.Main.CanvasWidth > 2500 && ! function() < var t = new l.ScoreIncrementer; t.addScore(1, n.animalType, function() < e.removeChild(t), t.destroy(), t = null >), e.addChild(t) >(), this.animationAttractor.append(n.getRebornNumber(), n, function(e) < return e.explode() >) >

Из нее становится понятно, как генерируются массив. Каждый раз, когда лисица съедает очередную курицу, вызывается эта функция и к существующему массиву добавляется новый блок данных, который помещается в переменную _n. А еще, в score записывалось значение, которое было переведено в другую систему исчисления, вместо десятичной, в score записывалось число в двадцатеричной системе, очередной антиреверс прием от разработчика. Вместо усовершенствования скрипта, было решено поставить брекпоинт и подменить score прямо на лету.

Прям перед установлением score в коде. Теперь в консоли поменять значение и продолжить выполнение скрипта.

И вот так я был вознагражден за труды.

В общий скорборд добавился немного позднее.

Примечательно то, что изменить очки можно всего одним массивом. В параметре _s записать нужное количество очков в 20чной системе исчисления, все это зашифровав кастомным алгоритмом aes, с сгенерированным ключем(md5 формат). Стоит отметить, что ключ выдается исходя из id чата, и не меняется в процессе игры. Исходя из id аккаунта в этой игре, можно сделать вывод, что в нее играло не менее 100 тысяч человек.

Хочется отметить, что выполнить эту атаку удалось благодаря уязвимости на сервере. Кода принимается JSON, расшифровывается, скорее всего, из массива данных берется массив с максимальным _s, и не важно, что он всего один. Поправить это просто — нужно парсить весь массив на предмет инкрементного увеличения _s, проверяя, что бы значение этого параметра соответствовало номеру вхождения в дереве JSON.

Какой можно сделать вывод? Все, что обрабатывается на стороне клиента, можно модифицировать, подменить, и не важно, насколько сложно шифруются данные для отправки и насколько сложно обфусцирован код. Очень порадовала игра «Tricky Fox», разработчик молодец. Пусть это всего лишь игра, на которую нужно тратить час-два максимум, все же стоит принимать меры по предотвращению читерства и обходу логики. На фоне других более популярных игр с халатным отношением к модификации очков очень хорошо сделана игра. Если ты, уважаемый читатель, хочешь разработать свою игру, то разобрав практически кейсы из этой статьи сможешь создать не только красивую, интересную, но и довольно защищенную игру.

P.S. Для подмены очков многих игр можно использовать сервис Telegram Cheats, для совсем ленивых. Но там не все игры можно накрутить.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *