читы на игру зума
Zuma Deluxe
Данные по игре | ||||||||||||||||||||
| ||||||||||||||||||||
Коды |
Замедлить движение мяча: Если вы застреваете на более высоком уровне, скажем 12-7, и затем только идете несколько строк ниже туда, где это говорит lvl127 и изменение его урегулирование скорости к 0.2 и сохранить. Заметка: не путайте lvl11 линию выше с level11 линией на той же самой странице. LiveInternetLiveInternet—Поиск по дневнику—Подписка по e-mail—СтатистикаZUMA DELUXE: я раскрыл секреты «жабы»!Второй день меня прет от этих маленьких открытий. Речь об игре ZUMA DELUXE или «жабе», весьма популярной по всей Вологде до сих пор, несмотря на почтенный возраст игры. Если не ошибаюсь, первая версия ее появилась году этак в 1999. Мои маленькие хитрости позволяют сделать следующее (кто хоть раз играл в жабу, меня поймет): — замедлить движение шариков Применив все мои открытия, я вчера за полчаса прошел всю жабу, набрав 4,5 миллиона очков, 45 жизней, а последний, самый сложный этап 13-1 прошел за 9 секунд! Я уже не помню, откуда принес «жабу» в нашу редакцию. Случилось это около года назад, и уже через месяц увлечение бешеной лягухой разрослось среди коллег до угрожающих масштабов, так что даже стали поговаривать о диверсии с моей стороны с целью остановить рабочий процесс. Играли и по сей день играют все: от секретаря до редактора. В папке Zuma Deluxe содержится папка levels, в которой в свою очередь лежит заветный файл levels.xml. Открываем его блокнотом и начинаем хулиганить… Все основные параметры этапов игры прописаны примерно в середине документа в строках, начинающихся с ЧИСЛО ШАРОВ ПРИ СТАРТЕ Чем дальше по игре, тем на большую длину выскакивает цепь шаров при самом старте. За число шариков при старте отвечает параметр start=. Самое прикольное – выставить его равным 5 и гасить врага на подходе! Впрочем, вариаций множество. Самая удобная – параметр равный 10. Этап в «жабе» считается пройденным, если набрано необходимое количество очков. Это количество регулируется параметром score=. Если выставить его равным 30, то с первой же разбитой тройки шаров этап будет пройден. От этапа к этапу это число возрастает, и здесь тоже можно поглумиться, исправляя параметр в нужную нам сторону. В конце этапа время прохождения срав6нивается с эталонным. Так вот, параметр partime= регулирует это самое эталонное время. Измерения в секундах. Т.е. 180 – это 3 минуты. Поставив значение равное 360 вы увидите, что расчетное время прохождения даже этапа 1-1 станет – 6 минут! В зависимости от того, насколько шустро вы пройдете этап, при таком раскладе бонус от 24 000 до 25 000. Впрочем, 25 000 не получить – видимо, это предел бонуса, но кто знает – может найдется добрый человек и покажет, где его изменять в сторону увеличения? Самое маньячество прилепить ко всем этапам, т.е. ко всем строкам после lvl.. следующую инфу: Успехов всем, кто тоже прется по «жабе». Мы победим! Inka chaka ssuka! Обратная разработка коммерческой программы: кейген для Zuma DeluxeВступлениеЗдравствуйте, Хабралюди. Часть 1: коварный FlashВ общем, запускаем игру, играем дольше положенного (или сразу же лезем в ветку реестра HKLM/Software/PopCap/Zuma и выставляем нули в ключах TimesExecuted и TimesPlayed) — и вуаля: Отлично, выбираем «Buy Now», закрываем вылезшее окошко браузера с предложением купить игру за жалкие 16.99 евро, и жмём «Enter the Registration Key Manually». Так-с, поле ввода. Уже от чего-то можно плясать. Пробуем ввести какую-нибудь абракадабру, ожидаемо получаем «Please enter a valid key», и идём разбираться, что к чему. Первое, что настораживает при вдумчивом осмотре — наличие в папке, прямо рядом с бинарём игры, двух файлов, намекающих на использование в программе технологии Flash: собственно, Flash.ocx и drm.swf… Видимо, с закрытием браузера можно было повременить. Ладно, открываем этот самый drm.swf — и что же мы видим: Ищем по «RegFailed» и выходим на вот этот блок кода: Вот оно. Правильный ключ имеет в длину 23 символа (больше просто не позволяет ввести само текстовое поле) и заставляет validate_regkey() возвращать True. На то, что в этом же блоке кода происходит инициализация таких «страшных» значений как gRegFailedMessage, можно не обращать внимания, т.к. здесь, вне зависимости от них, из флэш-объекта посредством fscommand() происходит передача данных в родительский процесс. Что ж, центральная проверка — однозначный шедевр. Надо, наверное, запостить это на govnokod.ru, ну да ладно, мы сюда не позубоскалить собрались. Главное, что эта функция дала нам структуру лицензионного ключа: #####-#####-#####-##### Опять забегая вперёд, скажу что набор верных символов внутри самой программы будет несколько сокращён. Но пока что нам без разницы. Запускаем OllyDBG и загружаем в него нашу подопытную. Запускаем на выполнение (F9) и дожидаемся момента прорисовки главного окна. Ставим на неё точку останова по чтению (выделение → Shift+F3). Далее, в окне проверки, идём по ссылке внизу «Already purchased this game?» → «Enter the Registration Key Manually», и вводим в поле для ключа любую алфавитно-цифровую белиберду, разделённую дефисами на 4 блока по 5 символов. Жмём «Register». Часть 2: we need to go deeperВот мы и попали, наконец, внутрь алгоритма проверки. Идём в список контрольных точек на память и удаляем 0x4417D0 (Alt+Y → Del), выполняемся (Ctrl+F9) до конца функции, т.к. там ничего интересного для нас нет, только цикл сравнения, далее возвращаемся в вызывавшую функцию (F8), и видим там проверку возвращённого результата. Опять пропускаем всё до конца функции и возвращаемся в вызывавшую: Ага! А вот теперь мы в сердце анализатора лицензионного ключа. Чтобы не забыть это место, поставим (F2) контрольную точку на 0x04066CA и осмотримся вокруг. Чуть ниже (0x406757 и 0x4067A8) видны вызовы функций с очень интересными строковыми параметрами «RegSucceeded» и «RegFailed». А повыше (0x406748) находится ветвление, которое передаёт управление в нужную функцию. Это ветвление завязано на сравнение (0x40672D) регистров AL и BL. Похоже, что функция 0x404260, вызываемая ещё двумя командами ранее — это как раз то, что мы искали, т.е. Самая Важная Функция Проверки. Сначала, проверим свою догадку: изменим сравнение так, чтобы оно оказывалось верным при некорректных исходных данных. Наведём выделение на 0x406748 и нажмём пробел. Откроется окно «Assemble». Заменим переход по равенству, JE, на переход по неравенству — JNE. Запустим на выполнение (F9)… Ура, первый бастион взят! Сейчас наша задача — понять, как себя ведут внутри этой функции регистры AL и BL, и где именно расположен кусок кода, ответственный за их равенство либо неравенство. Как видите, содержимое регистра AL на протяжении практически всего «хвоста» хранится в BL, и только перед самым выходом копируется обратно, с дальнейшим восстановлением исходного значения EBX из стэка. У этой функции всего два возможных выходных значения — 0 и 1. Первое генерируется, когда строка байт, указатель на структуру с которой передан как параметр функции, не совпадает со строкой, чей указатель лежит по адресу [ECX + 8]. Второе же (то самое, которое нам нужно) — при обратной ситуации, т.е. когда строки идентичны. Часть 3: MD5, RSA и все-все-всеВернёмся в родительскую функцию и взглянем, откуда берутся значения из [ECX + 8] и [ARG.1 + 8]. Теперь перезапустим программу и остановимся на входе в нашу главную функцию проверки (0x404260). Поставим туда контрольную точку и начнём трассировать функцию построчно (F8), следя за состоянием двух наших аппаратных точек останова. Трассировка показывает, что до строки 0x404546 оба значения остаются неизменными. А вот дальше уже любопытнее. Функция, непосредственно вызываемая из 0x404546, является «трамплином» для запуска функции 0x41E320, так что в ней нет ничего интересного. Ставим точку останова на 0x41E320 и жмём F9. До заветного момента, когда можно сказать, что реверс произведён, осталась одна функция, 0x41E100 (вызов из 0x40458C). Ну тут уж я не буду вас мучать прочтением и расшифровкой ассемблерных листингов, поскольку один хороший товарищ, к тому моменту как я только начал её разбирать, подкинул мне очень вовремя утёкший в Сеть кусок исходника PopCap`овского фреймворка, содержащий в себе пусть не реализацию указанной функции, но хотя бы её название. В общем, барабанная дробь… та функция, на которую мы сейчас собираемся пойти в лобовую атаку, называется aSignature.ModPow(e, n). Также, рекомендую обратить внимание на сами e и n: или, в ассемблерном представлении, Как можно догадаться из названия, ModPow() означает возведение в степень по модулю. окончательно проясняет ситуацию: алгоритм, с которым мы имеем дело — это RSA. Часть 4: генератор ключейВ общем, исходя из вышесказанного, код, генерирующий эту пакость, я решил в кейген не копипастить, а банально красть уже готовую строку из памяти игры посредством ReadProcessMemory(). В качестве небольшого хулиганства, также я добавил возможность записывать в строку имени что-то своё (с помощью WriteProcessMemory(), как несложно догадаться). Но, к сожалению, работает (т.е. сохраняет валидность регистрации) такой трюк только на WINE, но не на «реальной» Windows. В остальном — прошу любить и жаловать: Zuma keygen, proof-of-concept. Кейген проверялся не только на той версии Zuma, про которую идёт речь в статье, но также ещё и на других, более ранних или поздних (я не разбирался). Несмотря на то, что адреса с именем пользователя разнились, сам лицензионный ключ подходил к ним всем, что свидетельствует о неизменности алгоритма аж с 2003 года. Послесловие и использованные ссылкиP.S. Если кто-то может посоветовать более надёжный файлообменник, с которого файлы не удаляются через 30 дней простоя — буду крайне признателен. P.P.S. Каково же было моё удивление, когда уже после взлома я обнаружил, что Zuma.exe из обсуждаемого пакета — это просто обёртка, архив, который по лицензионному ключу разархивирует в свою же папку реальный бинарь с Zuma, названный popcapgame1.exe… [UPDATE:] перенёс картинки на Habrastorage. Читы на Deep.io (diep.io), чит на уровень, на массу, на зумПосле некоторого времени игры в Diep.io меня заинтересовал вопрос читов на Deep.io. После долгих поисков информации в Интернете и видео в Ютуб я выбрал лучшие из читов на Diep.io. Далее в статье, я расскажу о чите на уровни, на зум и массу в Deep.io. Diep.io – еще одна браузерная игра, выполненная в стилистике Agar.io, Cursors.io, Slither.io и прочих похожих проектов. Однако, в отличие от того же Agar.io, где предстояло бороться за выживание в чашке петри, здесь игрок получает в распоряжение танк. Со временем, при набирании достаточного количества очков опыта, даются новые уровни и поинты, которые можно тратить на улучшение своего танка. Читы на Diep.ioПо той причине, что Diep.io – это онлайн игра, в которой действия игроков фиксируются на стороне сервера, а не их клиентских машинах, то привычных читов здесь нет. Некоторые пытаются обхитрить систему, и взломать ее. Однако разработчики быстро фиксят такие дыры, и читы Dieo.io больше не работают. Чит для Diep.io на повышение уровняВозьмем, например, cheat, с описанием которого и инструкцией по установке можно ознакомиться в видео на YouTube: Как следует из заявления создателей чита, использующий предлагаемый скрипт по нажатию на клавишу «F9» во время игры получает новый уровень. Несколько циклов таких манипуляций, и можно получить максимально доступный левел в Diep.io. Следует отметить, что если на каких-то сайтах предлагаются читы, дающие, например, бессмертие (God mode), то они, скорее всего, содержат в себе вредоносный код. Чит на изменение зума в игре Diep.ioЕсть также скрипт, который может немного облегчить игровой процесс – он просто позволяет приближать и удалять картинку. Дня того, чтобы им начать пользоваться читом на зум в Diep.io потребуется, чтобы в браузер было установлено расширение Tampermonkey, в который нужно инсталлировать специальный скрипт. Откуда скачать сценарий, и как его запустить, можно узнать из видео на YouTube: Секреты игры в Diep.ioЕсли с читами все очень неоднозначно, то секретами прохождения Diep.io можно пользоваться свободно без опаски за свой компьютер и без страха получить бан. Хорошая тактика для игры в Diep.ioDiep.io – это игра, где можно прокачивать свой танк. Суть здесь заключается не только в сражениях, но и в наборе очков опыта, повышении уровня, а также улучшении характеристик. Чтобы быстрее подняться до высокого уровня следует придерживаться определенной стратегии: Подробно о тактике игры в Diep.io можно узнать из следующего видео: Исследование игр без исходного кода на примере Zuma
Но это присказка. Сказка в том, что я недавно перечитывал «Футурологический конгресс» Лема и наткнулся на орден безлюдистов, который проповедуют Евангелие компьютерам. Это привело меня к мысли, что в Евангелие компьютеру, в общем-то, ни к чему, а вот в Zuma он поиграть не отказался бы. Сказано-сделано. Пишу программу которая играет в Zuma. Сразу предупреждаю, что хотел написать мало и быстро, а получилось настолько много, что придется разбить на несколько частей. Если кому скучно читать — можно внизу статьи посмотреть видео. В комментариях прошу ответить: интересна ли тема, и стоит ли продолжать писать подобное? Интересно ли изложение? (я пишу одновременно с тем как делаю, поэтому тому кто читает может показаться странным). Приблизительный план действий такой: Для приготовления препарата мне понадобится IDA Pro, в качестве скальпеля буду использовать OllyDbg. Итак, определяю месторасположение шариков. Думаю что нужно посмотреть, как загружаются рисунки. Смотрю на файловую структуру игры, ресурсы хранятся очень просто, в обычных gif файлах. Есть смысл поиска в исходнике по названию файла. ALT+T, «RedBall», Enter. Нету. А если просто «Ball»? Есть! Перехожу к строке, смотрю перекрестные ссылки. Используется в одном месте: Ого какая функция огромная. Неужели они ее вручную набивали? Все действия сводятся примерно к одному. Насколько я понимаю в функцию загрузки картинки передается ее идентификатор и еше какие-то вещи, которые мне сейчас не нужны. Функция возвращает указатель. Указатель записывается в какую-то глобальную переменную. Здесь пока понятно. Теперь перехожу к отладчику и смотрю что с этим указателем происходит дальше. Ставлю точку останова на указатель и запускаю игру. Останавливается на этой строчке: Тут хорошо видно, что есть таблица указателей (скорее всего на картинки). В зависимости от чего-то выбирается индекс в картинке, соответствующий шарику определенного цвета. Чтобы быть точно в этом уверенным, делаю небольшой эксперимент: делаю индекс константой. Меняю строку MOV EAX,DWORD PTR DS:[EAX*4+9E9FC8] на MOV EAX,DWORD PTR DS:[9EA760] (9E9FC8 + 1E5*4). Вот что получилось: но это, конечно же, визуально. Игра воспринимает шарики по-прежнему. После анализа кода, отбросив все ненужное, получаю код для определения цвета в этой функции: Теперь смотрю откуда взялось ebx. В этой функции в него ничего не записывается, смотрю выше по стеку. Судя по перекрестным ссылкам, вызов идет из одной и той же процедуры. В этой функии, в самом начале регистр ebx инициализируется значением регистра ecx. Можно сделать вывод, что это объект. И предположить что он представляет собой шарик. Попробую подняться по стеку и увидеть откуда берется этот объект. Опять же, отбрасываю все ненужное и записываю код чтобы было понятно: Для пробы внедрю сюда код, который будет перекрашивать шарики в 4 цвета, по очереди. Использую Microsoft Detours. Подробно расписывать не буду, и так накатал столько, что вряд-ли кто сюда дочитал. Вкратце код будет такой: Это чтобы сделать режим «Nightmare!» а это «I’m too young to die» Итак, первый пункт плана я выполнил, продолжение следует…
|