Pull to refresh

Comments 57

классно пишешь! уже хочу прочесть продолжение
А я очень хочу его написать :-)
чувак ты крут!
както тоже пытался написать автоиграйку для флеш игры, она даже работала и подсчитывала количество цветов в игре Филлер на mail.ru, но как потом выяснилось стратегия которую я придумал не давала выигрыша и я забросил это дело.
Ну у меня тоже пока не играет. Но обязательно будет в следующей серии. На ту игру я тоже смотрел. Но как подойти к ней из под отладчика не догадался, а распознавание из скриншотов — не интересно.
я из скриншотов распознавал :)
Библиотека от Microsoft Research для инъекции Dll и перехвата управления на себя :-). Здесь подробнее. Можно скачать и побаловаться.
Есть еще EasyHook под C#. Она вроде бы повеселее, но я по некоторым причинам не пользуюсь
а там разве небыло никакой защиты от дизасма? мне кажется все шаровары нехило запакованы секьюрными пакерами.
Не было. Может потому что я уже ломаную смотрел.
Классная статья.
Как-то написал целый «отладчик» что бы в сеттлерах, по моему, жульничать.
Так как ничего более простого чем обработка int 3 прерывания с последующим патчем переменной в памяти не придумал :)
Сейчас пишу «отладчик» для эмулятора Sega, чтобы ломать алгоритм генерации пароля Rock'n'Roll racing. Скоро думаю написать об этом.
Ну у меня не полноценный отладчик был :)
так, всего лишь запускал процесс в режиме отладки, тут же патчил по определенному смещению опкод на int 3 и дальще слушал, сработал бряк — проверялся адрес срабатывания, дальше сдвигался на длинну int 3 получались значения регистров, патчилось количество ресурсов. Родная команда возвращалась на место, и продолжалось выполнение. Вот такой «отладчик» :)
Было и такое до того как узнал про инъекции
В ваше время ещё не было АртМани?
Хоть вопрос и не ко мне, но вставлю свои 5 копеек. Про артмани лично я узнал много после того, как начал исследовать приложения. Причем узнал от программиста 1С-ника, который долго и радостно его пользовал (не для профессиональных целей, конечно). После того как скачал, сразу же с радостью купил себе лицензионную копию, настолько оно мне облегчило жизнь. Потому как до того писал сомнительного качества приблуды, которые останавливали выполнение программы и выполняли поиск, примерно как описано у bioskiller.
Ну в тех сеттелрах арт мани был не помошник.
Так как значение кодировалось, и адрес был плавающим. При каждом изменении значения, менялось и смещение в памяти.
Да там все хорошее. Блог его очень даже интересно почитать.
Что вы имеете ввиду под «ломать алгоритм генерации пароля»?
Исследовать. Конечно же исследовать. Это оговорка такая случилась после слова «отладчик»
Хотите именно сами разобраться?) Алгоритмы в сети по идее должны быть.
Конечно сам. Интересно ведь. Тем более, журнал ПРОграммист целую футболку за это дает ))
Пароль там «ломается» вообще без отладчиков, дизасмов и т.д., буквально на бумаге и «железной» приставке (где в ROM не посмотришь в принципе), путём сравнительного анализа паролей с минимальными отличиями. Тем более что в игре есть масса способов быстро собрать приличное количество паролей с минимальными отличиями ничего не проходя вообще — выбираем разную сложность, одинаковых гонщиков, машину, цвет => локализовали биты отвечающие за сложность. Аналогично с гонщиком, цветом машины и машиной (всего 2, но хоть что-то) — фиксируем все параметры кроме интересующего, его меняем и собираем пароли с экрана опций. Таблица символов — классическое для сеги 5 битовое кодирование (B=0=00000, C=1=00001,…, !=31=11111). Деньги легко отломать используя такие факты: на трассах есть money power up дающий 1000$, гонку можно завершить досрочно в паузе (с засчитыванием поражения), если не собрать достаточно очков за все трассы, то нас кинут опять проходить текущую планету и дивизион сначала, однако обновят пароль на экране опций. Т.е. мы просто подбираем 1000$ на любой трассе и взрываемся через паузу во всех гонках пока нам не скажут что гонки окончены, идём на экран опций и получаем пароль. Деньги хранятся там достаточно своеобразно. Понятное дело что суммы кратны 1000$, т.е. 99000$ будут храниться как 99, однако там хранится каждая десятичная цифра отдельно в виде 4х битов, что позволяет делать «заэкранные» деньги вплоть до 15*100+15*10+15=1665, т.е. до 1665000$. Гонщик кодируется 3мя битами, т.е. можно закодировать 8 гонщиков, однако на экране выбора игроков их меньше… что наводит на мысли. Таким образом нашёл пасхалку от Blizzard — отсыл к замечательной игре Lost Vikings — можно гонять за викинга Olaf'а :) Ещё одна комбинация битов кодирующих гонщика вызывает забавный сбой игры — чёрный экран, однако можно выбирать опции вслепую и играть. Аналогичные сбои вызывают «нелегальные» коды цветов машины (часть из них кодирует синий цвет) и самих машин (невидимая/взрывающаяся машина). Вообщем, есть где развернуться, главное выяснить как модифицировать биты чтобы игра принимала пароль. Первые 16 бит пароля (т.е. целиком первые 3 символа + 1бит из 4го символа) — проверочные, остальные — информационные. Алгоритм вычисления проверочных бит простой — xor. Т.е. если мы изменили 17й бит пароля (он же 1й информационный бит (отвечает за сложность)) на противоположный (не важно 0->1 или 1->0), то нужно изменить и 1й бит (1й проверочный). Вообщем, взяв любой верный пароль и применяя алгоритм «улучшения» можно сгенерировать любой пароль. Ну и есть куча готовых генераторов пароля (с исходниками) к этой игре на разных языках, например на javascript (исходник «подсматривается» в тексте страницы) или на Q-basic'е.

p.s. Вообщем-то игры на Sega с генерируемыми паролями можно разделить на 2 категории — в одних можно «ломать» пароль «на бумаге» методом анализа паролей с минимальными отличиями (Rock'n'Roll Racing, Prince of Persia, Herzog Zwei, Jurrasic Park, Road Rash 2,3, Centurion), т.к. алгоритмы кодирования примерно похожи и зависимость между битами легко устанавливается «на глаз» при достаточно большой выборке паролей, равно как и механизм вычисления проверочных битов.
В других же играх применяются несколько более сложные алгоритмы, которые на бумаге так просто не сломаешь. Например Zero Tolerance, True Lies, Power Monger, Syndicate, Soldiers of Fortune. Вот тут и пригождается возможность ковыряться в ROM'е, отладчик (есть эмуляторы со встроенным отладчиком, например GensVKNTracer) и дизассемблер.
Спасибо, конечно, за спойлер, но мне самому в кайф в коде покопаться, поэтому не толком не читал. Сам пароль мне не очень нужен, процесс увлекательнее. «Аналитическим» способом как у вас я когда-то подбирал пароль к metal gear под nes. Было очень увлекательно Отлачик по ссылке очень похож на regen(кажется). Я не уверен что делал все правильно, но точка останова работает только пока находишься в отладчике. Играть в это время невозможно, что накладывает некоторые ограничения.
У меня схема обычно такая: через «Debug->Поиск кодов» эмулятора ищу адрес в RAM где хранится пароль (процесс напоминает «взлом» через ArtMoney), затем в отладчике ставлю бряк на чтение найденного адреса и при завершении ввода пароля обычно всплывает отладчик в проверочной процедуре (т.к начинает считываться пароль для проверки). Теперь код проверки пароля локализован, можно смотреть в дизассемблере нужное место и разбираться что к чему.
Да. примерно так и было, только отладчик не всплывал отчего-то. Тогда я сначала в ArtMoney нашел пароль и регистр команд в эмуляторе. Потом открыл эмулятор в OllyDbg, поставил точку останова на чтение пароля. Когда она сработала — просмотрел в ArtMoney значение регистра команд, изменил его значение, и начал в отладчике эмулятора и дизассемблере уже дальше разбираться.
В том смысле, что я понимаю конечно, что занимаюсь ерундой. Но мне очень нравится этот процесс.
Ну не ерундой. В процессе разбора у меня происходит изучение asm'а, т.к. пока постоянно подсматриваю в документацию. Плюс всплывают всякие ньюансы, например что M68000 — «тупоконечный» процессор, а intel — «остроконечный», потому при переносе алгоритма с одного на другой циклический сдвиг влево пришлось заменять сдвигом вправо и наоборот, дабы алгоритмы давали идентичный результат.
Плюс приятно самому обнаруживать скрытые возможности в игре. Хоть порой и кажется, что всё ломано-переломано, однако это не совсем так. Вот например дока по разбору пароля в Cannon Fodder в которой автор нашёл «секретный» пароль, не опубликованный в интернете. Сам не так давно наткнулся на жёстко «зашитые» пароли в Power Monger, которые не гуглятся.
Прочитал доку по разбору пароля. Наконец-то дошло, что изобретаю велосипед :-)
Просто ArtMoney и OllyDBG — универсальные инструменты (с их помощью можно исследовать любые приложения), а отладчик встроенный в эмулятор Sega — специализированный. А как показывает практика — специализированный инструмент на задаче, под которую он затачивался, практически всегда обходит универсальный по удобству и прочим критериям. Потому да, «ломать» эмуляторные игры через ArtMoney и OllyDBG/свой отладчик — можно, но это из серии удаления гланд при помощи автогена через другое отверстие :)
Тут спору нет. Примерно это я и чувствовал. То чем сейчас занимаюсь выглядит еще хужее.
всегда мечтал научиться ковыряться в приложениях, и купаться в ассемблере, как в родном языке программирования. Вы, случайно, не крякали софт в прошлом?
Я до сих пор об этом мечтаю. Нет, не крякал. Я немного по другой линии.
Для этого просто нужно научиться на нем писать и постоянно этим заниматься — вот и всё.
Самое интересное опустили, как детуром перехватили нужный код? Я так понял вы написал свою Dll и заинжектил ее в процесс Зумы или как? А потом в DllMain перехватил нужную функцию (несовсем понял откуда взяли ее адрес и декларацию), так?
Поддерживаю. Как раз самое интересное вы зря опустили.
«Подробно расписывать не буду, и так накатал столько, что вряд-ли кто сюда дочитал. „
В следующей статье обязательно опишите подробности. Тема очень интересна.
Обязательно исправлюсь. И исходники приложу. Я и здесь собирался, но там страшно и кода всего ничего.
Да, написал Dll используя Microsoft Detours. Потом с помощью CreateRemoteThread инжектил в процесс.
По поводу DllMain Вы тоже угадали.
Что касается декларации, то дело обстоит таким образом:
Microsoft Detours вставляет своего рода трамплин(в их терминологии) в код процесса. Трамплин выглядит примерно как jmp hook_function_addres, заменяя им 5 байт кода исследуемой программы.
Я объявляю функцию как _naked, чтобы компилятор не генерировал для нее ненужного, типа выхода по ret. Пишу там все что мне надо, затем перехожу джампом обратно. Это позволяет перехватить не только в начале функции, а вообще где угодно в коде. Как-то так.
Адрес кода который перехватывается взялся из цикла где перебираются шарики. (последний скрин перед видео)
А я как-то писал бота для Chuzzle :)
image
Правда попроще — распознавал поле и эмулировал действия мыши.
Может напишете как? Я, например, ботов делаю таким образом по той простой причине, что распознавание изображений для меня совершеннейшая загадка. А «попроще» и «распознавал поле» для меня уж точно не одно и то же.
Было бы о чём писать. Как такового распознавания в конкретном случае не нужно.
В отличие от Зумы в этой игре «шары» всегда на заданных местах — достаточно брать цвет одного-двух пикселей каждого шара и пространства между ними, чтобы точно определить состояние поля.
Понравилось, плюсанул карму. Ждем еще статей. Спасибо :)
Очень интересно! Обязательно продолжайте, и желательно со всеми «вкусными» подробностями. Уверен, что ваши посты читают до конца, нимало не смущаясь их длиной.
Прочел детектив на одном дыхании! С нетерпением жду продолжения! А Зуму я что-то не люблю и не играл.
cracklab на выезде… спасибо)
А меня хватало максимум на пол часа — час игры. Ну не привлекает меня ваша Зума.
Это уже кому что нравится. Да и статья, не сказать чтобы полностью об игре.
Ну во вступлении: «Играла жена, друзья, все играли, в общем. Любой, кто посмотрел в глаза жабе, услышал волшебное «дзынь» шариков...». Не на всех, всё же, действует магия этой игры. А статья хорошая, спору нет.
Ну ладно, кто-то с игрой надолго не остался, НО ВЕДЬ ВСЁ РАВНО ИГРАЛИ! Хоть пять минут, но всё-таки!
Отличная статья! «Я требую продолжения банкета» (с) :)
Будет обязательно! С некоторым перерывом, но будет. Я и не ожидал, что оно так здесь понравится.
Классно! Вспомнил своё самое начало двухтысячных. Правда не с играми возился, а с софтом, ибо инета не было и денег у школьника не было, но очень хотелось (:

Никогда не забуду свой самый первый опыт — поиск серийника UniVBE. Россыпь серийников просто была вшита в бинарик (: Hiew и внимательность сделали своё дело! Правда потом такой халявы уже не обламывалось…

А ещё вспомнил как пользовался программой типа артмани (или именно ею, много тогда таких было) и одим солдатиком в StarCraft валил армии. Бессмертие — оно такое!
Да, было время :-). Я первое что из реверсинга делал — пытался понять как сейвки дьяблы работают. Сидел довольно долго над этим делом. Тем более, что когда игра запускалась в полноэкранном режиме, попадание на брикпоинт завешивало систему намертво (как сделать запуск в оконном на тот момент момент у меня ума не хватало). В результате получил бесценный опыт, а в сейвах так и не разобрался. А недавно на хабре видел статейку про ребят, которые реверсили его полностью.
Дык во времена диаблы была же чудо штука — SoftICE! После небольшого шаманства с настройкой им можно было что угодно изучать! О боги, я просто обожаю софтайс! Он столько мне помогал (:

А ещё помню любил Q2 и любил модельки менять и прочие штуки. Расковырял формат pak файлов (примитив совсем) и долго радовался. А потом появился инет и Max Payne и у него ресурсы хранились в похожем формате, вот радости было!
от NuMega был еще шикарный DriverStudio, в который и входил SoftIce.
Помню как тянул его досовый еще с какой-то BBS паками по 1мб...4 ночи :) но 30 минут сессия и time up
Sign up to leave a comment.

Articles