Comments 57
классно пишешь! уже хочу прочесть продолжение
+7
чувак ты крут!
както тоже пытался написать автоиграйку для флеш игры, она даже работала и подсчитывала количество цветов в игре Филлер на mail.ru, но как потом выяснилось стратегия которую я придумал не давала выигрыша и я забросил это дело.
както тоже пытался написать автоиграйку для флеш игры, она даже работала и подсчитывала количество цветов в игре Филлер на mail.ru, но как потом выяснилось стратегия которую я придумал не давала выигрыша и я забросил это дело.
+1
D=
А что такое detours в двух словах?
А что такое detours в двух словах?
0
Библиотека от Microsoft Research для инъекции Dll и перехвата управления на себя :-). Здесь подробнее. Можно скачать и побаловаться.
Есть еще EasyHook под C#. Она вроде бы повеселее, но я по некоторым причинам не пользуюсь
Есть еще EasyHook под C#. Она вроде бы повеселее, но я по некоторым причинам не пользуюсь
+1
а там разве небыло никакой защиты от дизасма? мне кажется все шаровары нехило запакованы секьюрными пакерами.
0
Классная статья.
Как-то написал целый «отладчик» что бы в сеттлерах, по моему, жульничать.
Так как ничего более простого чем обработка int 3 прерывания с последующим патчем переменной в памяти не придумал :)
Как-то написал целый «отладчик» что бы в сеттлерах, по моему, жульничать.
Так как ничего более простого чем обработка int 3 прерывания с последующим патчем переменной в памяти не придумал :)
0
Сейчас пишу «отладчик» для эмулятора Sega, чтобы ломать алгоритм генерации пароля Rock'n'Roll racing. Скоро думаю написать об этом.
+1
Ну у меня не полноценный отладчик был :)
так, всего лишь запускал процесс в режиме отладки, тут же патчил по определенному смещению опкод на int 3 и дальще слушал, сработал бряк — проверялся адрес срабатывания, дальше сдвигался на длинну int 3 получались значения регистров, патчилось количество ресурсов. Родная команда возвращалась на место, и продолжалось выполнение. Вот такой «отладчик» :)
так, всего лишь запускал процесс в режиме отладки, тут же патчил по определенному смещению опкод на int 3 и дальще слушал, сработал бряк — проверялся адрес срабатывания, дальше сдвигался на длинну int 3 получались значения регистров, патчилось количество ресурсов. Родная команда возвращалась на место, и продолжалось выполнение. Вот такой «отладчик» :)
+1
Было и такое до того как узнал про инъекции
+1
В ваше время ещё не было АртМани?
+2
Хоть вопрос и не ко мне, но вставлю свои 5 копеек. Про артмани лично я узнал много после того, как начал исследовать приложения. Причем узнал от программиста 1С-ника, который долго и радостно его пользовал (не для профессиональных целей, конечно). После того как скачал, сразу же с радостью купил себе лицензионную копию, настолько оно мне облегчило жизнь. Потому как до того писал сомнительного качества приблуды, которые останавливали выполнение программы и выполняли поиск, примерно как описано у bioskiller.
+2
Ну в тех сеттелрах арт мани был не помошник.
Так как значение кодировалось, и адрес был плавающим. При каждом изменении значения, менялось и смещение в памяти.
Так как значение кодировалось, и адрес был плавающим. При каждом изменении значения, менялось и смещение в памяти.
+1
0
Что вы имеете ввиду под «ломать алгоритм генерации пароля»?
0
Пароль там «ломается» вообще без отладчиков, дизасмов и т.д., буквально на бумаге и «железной» приставке (где в 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) и дизассемблер.
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) и дизассемблер.
0
Спасибо, конечно, за спойлер, но мне самому в кайф в коде покопаться, поэтому не толком не читал. Сам пароль мне не очень нужен, процесс увлекательнее. «Аналитическим» способом как у вас я когда-то подбирал пароль к metal gear под nes. Было очень увлекательно Отлачик по ссылке очень похож на regen(кажется). Я не уверен что делал все правильно, но точка останова работает только пока находишься в отладчике. Играть в это время невозможно, что накладывает некоторые ограничения.
0
У меня схема обычно такая: через «Debug->Поиск кодов» эмулятора ищу адрес в RAM где хранится пароль (процесс напоминает «взлом» через ArtMoney), затем в отладчике ставлю бряк на чтение найденного адреса и при завершении ввода пароля обычно всплывает отладчик в проверочной процедуре (т.к начинает считываться пароль для проверки). Теперь код проверки пароля локализован, можно смотреть в дизассемблере нужное место и разбираться что к чему.
0
Да. примерно так и было, только отладчик не всплывал отчего-то. Тогда я сначала в ArtMoney нашел пароль и регистр команд в эмуляторе. Потом открыл эмулятор в OllyDbg, поставил точку останова на чтение пароля. Когда она сработала — просмотрел в ArtMoney значение регистра команд, изменил его значение, и начал в отладчике эмулятора и дизассемблере уже дальше разбираться.
0
В том смысле, что я понимаю конечно, что занимаюсь ерундой. Но мне очень нравится этот процесс.
0
Ну не ерундой. В процессе разбора у меня происходит изучение asm'а, т.к. пока постоянно подсматриваю в документацию. Плюс всплывают всякие ньюансы, например что M68000 — «тупоконечный» процессор, а intel — «остроконечный», потому при переносе алгоритма с одного на другой циклический сдвиг влево пришлось заменять сдвигом вправо и наоборот, дабы алгоритмы давали идентичный результат.
Плюс приятно самому обнаруживать скрытые возможности в игре. Хоть порой и кажется, что всё ломано-переломано, однако это не совсем так. Вот например дока по разбору пароля в Cannon Fodder в которой автор нашёл «секретный» пароль, не опубликованный в интернете. Сам не так давно наткнулся на жёстко «зашитые» пароли в Power Monger, которые не гуглятся.
Плюс приятно самому обнаруживать скрытые возможности в игре. Хоть порой и кажется, что всё ломано-переломано, однако это не совсем так. Вот например дока по разбору пароля в Cannon Fodder в которой автор нашёл «секретный» пароль, не опубликованный в интернете. Сам не так давно наткнулся на жёстко «зашитые» пароли в Power Monger, которые не гуглятся.
0
Прочитал доку по разбору пароля. Наконец-то дошло, что изобретаю велосипед :-)
0
Просто ArtMoney и OllyDBG — универсальные инструменты (с их помощью можно исследовать любые приложения), а отладчик встроенный в эмулятор Sega — специализированный. А как показывает практика — специализированный инструмент на задаче, под которую он затачивался, практически всегда обходит универсальный по удобству и прочим критериям. Потому да, «ломать» эмуляторные игры через ArtMoney и OllyDBG/свой отладчик — можно, но это из серии удаления гланд при помощи автогена через другое отверстие :)
0
всегда мечтал научиться ковыряться в приложениях, и купаться в ассемблере, как в родном языке программирования. Вы, случайно, не крякали софт в прошлом?
+1
Самое интересное опустили, как детуром перехватили нужный код? Я так понял вы написал свою Dll и заинжектил ее в процесс Зумы или как? А потом в DllMain перехватил нужную функцию (несовсем понял откуда взяли ее адрес и декларацию), так?
0
Поддерживаю. Как раз самое интересное вы зря опустили.
«Подробно расписывать не буду, и так накатал столько, что вряд-ли кто сюда дочитал. „
В следующей статье обязательно опишите подробности. Тема очень интересна.
«Подробно расписывать не буду, и так накатал столько, что вряд-ли кто сюда дочитал. „
В следующей статье обязательно опишите подробности. Тема очень интересна.
0
Да, написал Dll используя Microsoft Detours. Потом с помощью CreateRemoteThread инжектил в процесс.
По поводу DllMain Вы тоже угадали.
Что касается декларации, то дело обстоит таким образом:
Microsoft Detours вставляет своего рода трамплин(в их терминологии) в код процесса. Трамплин выглядит примерно как jmp hook_function_addres, заменяя им 5 байт кода исследуемой программы.
Я объявляю функцию как _naked, чтобы компилятор не генерировал для нее ненужного, типа выхода по ret. Пишу там все что мне надо, затем перехожу джампом обратно. Это позволяет перехватить не только в начале функции, а вообще где угодно в коде. Как-то так.
Адрес кода который перехватывается взялся из цикла где перебираются шарики. (последний скрин перед видео)
По поводу DllMain Вы тоже угадали.
Что касается декларации, то дело обстоит таким образом:
Microsoft Detours вставляет своего рода трамплин(в их терминологии) в код процесса. Трамплин выглядит примерно как jmp hook_function_addres, заменяя им 5 байт кода исследуемой программы.
Я объявляю функцию как _naked, чтобы компилятор не генерировал для нее ненужного, типа выхода по ret. Пишу там все что мне надо, затем перехожу джампом обратно. Это позволяет перехватить не только в начале функции, а вообще где угодно в коде. Как-то так.
Адрес кода который перехватывается взялся из цикла где перебираются шарики. (последний скрин перед видео)
+2
А я как-то писал бота для Chuzzle :)
Правда попроще — распознавал поле и эмулировал действия мыши.
Правда попроще — распознавал поле и эмулировал действия мыши.
+3
Может напишете как? Я, например, ботов делаю таким образом по той простой причине, что распознавание изображений для меня совершеннейшая загадка. А «попроще» и «распознавал поле» для меня уж точно не одно и то же.
0
Понравилось, плюсанул карму. Ждем еще статей. Спасибо :)
0
Очень интересно! Обязательно продолжайте, и желательно со всеми «вкусными» подробностями. Уверен, что ваши посты читают до конца, нимало не смущаясь их длиной.
0
Прочел детектив на одном дыхании! С нетерпением жду продолжения! А Зуму я что-то не люблю и не играл.
+1
«Секс — ради труда!» © С. Лем
0
cracklab на выезде… спасибо)
+3
А меня хватало максимум на пол часа — час игры. Ну не привлекает меня ваша Зума.
-3
Это уже кому что нравится. Да и статья, не сказать чтобы полностью об игре.
+2
Ну во вступлении: «Играла жена, друзья, все играли, в общем. Любой, кто посмотрел в глаза жабе, услышал волшебное «дзынь» шариков...». Не на всех, всё же, действует магия этой игры. А статья хорошая, спору нет.
-2
Отличная статья! «Я требую продолжения банкета» (с) :)
0
Классно! Вспомнил своё самое начало двухтысячных. Правда не с играми возился, а с софтом, ибо инета не было и денег у школьника не было, но очень хотелось (:
Никогда не забуду свой самый первый опыт — поиск серийника UniVBE. Россыпь серийников просто была вшита в бинарик (: Hiew и внимательность сделали своё дело! Правда потом такой халявы уже не обламывалось…
А ещё вспомнил как пользовался программой типа артмани (или именно ею, много тогда таких было) и одим солдатиком в StarCraft валил армии. Бессмертие — оно такое!
Никогда не забуду свой самый первый опыт — поиск серийника UniVBE. Россыпь серийников просто была вшита в бинарик (: Hiew и внимательность сделали своё дело! Правда потом такой халявы уже не обламывалось…
А ещё вспомнил как пользовался программой типа артмани (или именно ею, много тогда таких было) и одим солдатиком в StarCraft валил армии. Бессмертие — оно такое!
0
Да, было время :-). Я первое что из реверсинга делал — пытался понять как сейвки дьяблы работают. Сидел довольно долго над этим делом. Тем более, что когда игра запускалась в полноэкранном режиме, попадание на брикпоинт завешивало систему намертво (как сделать запуск в оконном на тот момент момент у меня ума не хватало). В результате получил бесценный опыт, а в сейвах так и не разобрался. А недавно на хабре видел статейку про ребят, которые реверсили его полностью.
0
Дык во времена диаблы была же чудо штука — SoftICE! После небольшого шаманства с настройкой им можно было что угодно изучать! О боги, я просто обожаю софтайс! Он столько мне помогал (:
А ещё помню любил Q2 и любил модельки менять и прочие штуки. Расковырял формат pak файлов (примитив совсем) и долго радовался. А потом появился инет и Max Payne и у него ресурсы хранились в похожем формате, вот радости было!
А ещё помню любил Q2 и любил модельки менять и прочие штуки. Расковырял формат pak файлов (примитив совсем) и долго радовался. А потом появился инет и Max Payne и у него ресурсы хранились в похожем формате, вот радости было!
0
Sign up to leave a comment.
Исследование игр без исходного кода на примере Zuma