Как стать автором
Обновить

Комментарии 74

Никто. Никто не смеет обижать бегемотика ><.

Автор, я Вас обожаю. Но хомо.
иногда я получал по 5-6 рабочих файлов с разными измененными символами в разных местах.
Да вы же упоротый! Ну ладно, отличная статья (и работа) на самом деле :)
image — UPD: не заметил аватарку
Забавное битье лбом в стену )
Это будет серия постов «О том, как я...»?
Было бы круто!
Да, у меня есть еще пара подобных историй, не знаю, правда, как воспримет их хабр :)
Пишите прямо в комментариях. И спасибо за интересный рассказ!
Ждём статью про ручной майнинг биткоинов :)
Ну, к слову: берём динамомашину, подключаем к ней майнер — профит?! :)
Я так в седьмом классе добавлял игрового времени в King Bounty 2. На этом мой прогресс в изучении программирования в принципе и остановился
Не совсем по теме, но вспомнилось, как в 1999 году нашел легкий способ обмана Fallout 2. Если помните — сэйв представлял собой папку с файлами, каждый из которых соответствовал одной локации.
Выкладываем все вещи в какой-нибудь ящик, уходим в соседнюю локацию, сохраняемся. Возвращаемся, забираем все вещи, уходим в соседнюю локацию, сохраняемся. Перекладываем файл соседней локации из первого сейва во второй. Вуаля — вещи у нас в карманах и точно такие же в соседней локации. Profit!
Если Фоллаут запускался с компакта, то во время боя можно было нажать Eject так, что противник пропускал свой удар
Вот что называется вдохновением! =D
Чем-то напомнил мой опыт, в далекие годы когда PSX была пределом мечтаний и походы в школы были регулярны, у меня появился клон Action Replay, но увы не PRO версия. Кто не в курсе, это такой аппаратный ArtMoney для PS1.
То есть в ней отсутствовал поиск, и можно было использовать лишь готовые коды.
Но это не остановило меня, и методом тупого перебора порядка 10000-20000 адресов, были найдены нужные комбинации и я таки получил все открытые уровни в «Crash Bandicoot 2: Cortex Strikes Back».
А стимулом был поцарапанный диск, который упорно вис на одном из уровней.
Данный случай лишний раз показывает, что для достижения победы требуется дерзость и авантюризм.

Тут явно повезло. Те, кто «шифровал» файлы и встраивал в них ограничения по дате просмотра, явно сделали свою работу тяп-ляп. И одно осознание того, как можно, если захотеть, правильно защитить файл, уже отбросило бы многих продвинутых пользователей и программистов от идеи пытаться случайными изменениями в файле заставить его работать.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Я так понял, эти файлы открывались через флеш плеер который был специально для них и написан. Почему-бы не ковырять плеер в этом случае?
Поначалу это и пробовал, но после декомпилирования этого плеера я получал такое, с чем невозможно было работать, огромный листинг на ActionScript который был совершенно нечитабилен и все мои попытки хоть чуть-чуть понять суть не увенчались успехом. К тому же, обратно плеер не компилировался. В общем, в этом варианте я полностью зашел в тупик и интуиция подсказывала мне что так я ничего не добьюсь :).
Хм… Давным-давно. В две тысячи лохматом году я играл в Ragnarok Online, само собой, на пиратских серверах.Игра представляет собой страшное гриндилово, поэтому боты для этой игры были весьма популярны. Особенно при том, что был весьма неплохой опенсорсный бот, написанный на перле, который активно развивался. И вот, на моем любимом сервере админы решили, что с ботами пора завязывать и написали ланчер для игры, который кроме запуска игры еще и занимался шифрованием трафика. Меня такое решение не устроило и я решил пропатчить бота, чтобы он все таки работал. Я предположил, что ланчер инжектится в клиентский процесс и хукает функции send и recv для соответсвенно зашифрования и расшифрования трафика. Также я предположил, что шифруется все тупым xor'ом. И еще я предположил, что ключи шифрования константны. Частично мои предположения подтверждались поверхностным анализом первых передаваемых пакетов при подключении: игра в процессе подключения трижды создавала новые подключения, причем расшифрованные версии первых пакетов посылаемых и принимаемых через этих подключений были известные (что-то вроде хендшейка), что давало некоторое поле для экспериментов.

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

Потом админы добавили изменение ключей в зависимости от трафика и защитили ланчер Темидой. Тут уже пришлось познакомиться с OllyDbg.
Пишите статью! Интересно как вы обходили всякие анти-чит защиты.
И правда, очень интересно! Напишите, пожалуйста, об этом!
Да писать особо не о чем: это было лет 5-7 назад, все подробности какие вспомнил — написал.

Региональные официальные клиенты игры имели какие-то отличия в протоколе, соответственно бот (OpenKore) имел вагон настроек для тюнинга протокола в региональным особенностям, чем пользовались держатели пиратских серверов: легкая модификация настроек сервера (плюс возможно, модификация клиента) и очередной подбор параметров протокола ботоводам обеспечен. Шифрованием трафика заморачивались немногие.

С Темидой мне тоже повезло: руками по туториалам ее снять у меня не вышло, но зачем-то я хранил архив ланчеров, и для одной из версий нашелся автоматический unpacker, и алгоритм шифрования авторы не меняли.

Больше мне похвастаться нечем. А хотя, еще я долго и упорно пытался расковырять клиент Eve Online, но дальше инъекции питоновского кода, который создавал окно с текстом «Hello, World» в игре у меня ничего не получилось. Т.е. теоретически, я пролез в клиентский интерпретатор питона, но что с ним сделать так и не придумал: моих знаний C хватило, чтобы написать более-менее рабочий инжектор, но знаний питона не хватило, чтобы изучить потроха клиента.
А Вам не приходила мысль в голову, что файл зашифрован? И то чем Вы занимались — это подбор байт таким образом чтоб чексумма совпала.
И сдается мне, что проверка даты идет от времени создания/модификации самого файла.
Автор сразу предупредил об этом, но его упороертость заставила его продолжать:
… Изучив сайт я выяснил, что каждый файл виртуального тура шифруется каким-то хитрым способом, а расшифровать его может только «фирменный» flash-плеер...
Тогда что это за нестойкая чексумма такая? Как вообще можно сделать шифрование, не опирающееся на более-менее стойкий хэш?
Очень хороший пример принципа, согласно которому алгоритм шифрования, обеспечивающий секретность, но не целостность, в конченом счете не обеспечивает и секретности, т.к. нестойкий к активным атакам (схемы ECB, CTR, CBC).

Например, вы знаете, что кто-то посылает по сети электронный зашифрованный чек на сумму 100$. Вы также знаете позицию, в которой расположена сумма (допустим она записана строкой). Перехватив сообщение и не зная ни ключа, ни остального его содержания вы можете занемить 100$ на 900$ заменив позицию в которой записана «1» (в зашиврованном виде это некий X) значением (X xor «1» xor «9»).

Тут все аналогично, только позиция и значение перебиралось наугад.
Очень необычный способ решения проблемы. Впрочем, главное это результат :)

Автор, я хочу поиграть с тобой в одну игру.

0865dbf1e9d3c45db078abe59830ed85
самое интересное, что эот хеш встречается в гугле )
молодец =)
НЛО прилетело и опубликовало эту надпись здесь
Отладка методом брутфорса :))
Возвращение человека-брутфорса.
C большой вероятностью изменение байтиков даёт изменение срока работоспособности тура. Так что бомба по-прежнему тикала бы :)
Честно, даже примерно не могу понять от куда это
Немного поразмыслив, я понял что дата или параметр который отвечает за отображение будут, скорее всего, в самом начале файла, либо в его конце, а в середине будет информация о самом туре. Но скорее всего в начале. Поэтому я выделил для себя примерную область работы, грубо говоря, что-то около такой

Что в голове у автора? Может третий глаз? И как это вообще могла сработать?
Автор, восхищаюсь, как Вашей упорностью, так и шестым чувством.
Ага, такой человек, найдя на улице ключ, не успокоится, пока не найдет дверь, которую этот ключ открывает.
Ну потому что по логике заголовок со служебной информацией должен быть где-то в начале файла. Хотя, успешный исход всей этой операции был определён тем моментом, когда автору удалось случайно записать байты rS по правильному адресу. Т.е. одновременно было найдено и правильное смещение и правильные байты. Вероятность всего этого крайне низка. Если этого бы не произошло, всей этой статьи бы и не было. А следовательно, и описанный способ можно воспринимать просто как прикольный случай из жизни, а не как методику брутфорса файлов.
Паки от дума1-2 и игр тех времен имели всю служебную информацию именно в конце файла. А в начале было лишь указано смещение на эту область.
Интересно, как оценивали (или презентовали :) стойкость своей криптографической защиты разработчики :)

P.S. А вообще по-моему подобные защиты находятся на грани статьи УК о вредоносном ПО, если в договоре не оговорено, что они работают только до определенного срока.
Надо было предусмотреть в договоре передачу исходников. Так ведь и делается.
Как сейчас помню, как моей радости небыло предела, когда я смог сам увеличить количество жизней в одной DOS-овской игре.

1. Сначала искал в памяти байт в котором число значений совпадает с числом оставшихся жизней. Выписывал адреса на листочек.
2. Потом «погибал» разок и искал в памяти уменьшенное число жизней. Искал совпадение по адресам.
3. Правил этот байт в памяти — жизни успешно добавились.
4. Потом изменил присвоение константы уже в файле.

И вот она радость победы!

Вручную? Это было еще до выхода GameTool? :)
ArtMoney своими руками.
Наверное вы бы очень обрадовались, узнав, что во времена DOS была программа, которая это делала автоматически. Она устанавливалась резидентно (TSR), после чего надо было запустить игру и при каждом погибании героя нажимать на заданную клавишу. Программа делала снимок памяти, после чего анализировала все снимки и выводила список ячеек в которых последовательно уменьшались значения.

Между прочим, во времена Синклеров я честно искал места где декрементировалось кол-во жизней и вписывал туда NOP'ы. Анализировать память мне и в голову не приходило. :)
Про специализированные программы я тогда не знал. Насколько я помню я делал это встроенным в DOS отладчиком debug.com
Делал то же самое на спектруме 48-м с турбо-пзу, там была возможность вызвать встроенный примитивный монитор по NMI, возможно где-то до сих пор лежат бумажки исписанные пятизначными числами :)
Вспомнилась история из детства.

Папе где-то переписали Stylus 1.0 (это тот самый переводчик, который потом превратился в Promt). Не помню точно, но, кажется, ещё у нас тогда была 3.11-я винда. Но инсталлятор не запускался, требовал какой-то пароль.

Что сделали? Открыли exe-файл инсталлятора в Norton Commander по F3. Видим — там в начале файла среди двоичного мусора затесалась вполне себе алфавитная строка символов на восемь. Попробовали ввести её — подошло.
автор молодец!
главное — ролики теперь показываются!
следующий раз можно и глубже покопать, но будет ли этот «следующий раз»?

image
НЛО прилетело и опубликовало эту надпись здесь
С такой интуицией и удачей нужно было Вам несколько лет назад казино ломать… а не за компьютером сидеть.
Знал бы прикуп, жил бы в Сочи…
>Откуда:
>Россия, Краснодарский край, Сочи

ээээ…
Знает.
Напомнило мой первый «серьёзный» взлом.

Взломав пару Windows приложений по статьям с Cracklab для новичков, мне захотелось побороть одну игрушку, вроде бы она называлась Mummy Maze, не помню.

Игра от обычного приложения отличается тем, что у неё труднее цепляться к различным событиям. Если программа требующая регистрацию выводит MessageBox через WinAPI, то игра это делает какими-то своими способами.

Собственно, тогда я не знал и этого: я знал только магию замены инструкций jz на jnz и обратно. Из отладчиков я знал только WinDbg.

Открыв ехе-шник игры в WinDbg, я трассировал программу до первого встретившегося jz или jnz, запоминал адрес инструкции в буфер обмена, заменял прыжок на противоположный, и смотрел, что получилось. Иногда программа падала, иногда выполнялась как обычно — приходилось ждать несколько секунд, пока у неё заполнится симпатичная полоса загрузки и отобразится «Please register».
Завершал выполнение программы, прыгал на запомненный в буфере адрес, ставил точку останова и перезапускал на выполнение снова, трассируя до очередного jz/jnz.

Таким образом я сидел три вечера до поздней ночи, пока от ощущения тошноты, уставших глаз, да и пальцев, не приходилось ложиться спать. Но на третью ночь, дав себе очередное «последнее обещание», что ещё разок, и спать, игра вдруг сжалилась надо мной, и выдала после загрузки что-то вроде «Спасибо за регистрацию».

Радости моей не было предела, чистая эйфория! Я прыгал по своей комнате и мысленно кричал — вслух не мог, так как все давно спали.

Здорово мне тогдашнему повезло, конечно: ведь я пребывал в священной уверенности, что в любой программе всегда есть один единственный переход, исправив который, можно взломать любую программу, главное его найти. Сделай разработчики логику проверок чуть сложнее, я бы ещё долго тыкал в trace into, и в итоге сдался и меня постигло разочарование.
УпоротостиУпорности вам не занимать.
Я бы на вашем месте сразу узнал кто писал сайт и эти «туры», и катил бы бочку в том направлении…
Вообще разработчики этих туров — довольно странные люди. Ни одна нормальная программа, привязанная к дате, не возобновляет работу при переводе даты назад. Просто момент пересечения заданной даты фиксируется неким флагом и программа перестаёт работать совсем. Заодно это защищает от уловки перевода даты вперёд при установке с последующим переводом её назад. Сделав тупую проверку даты, разработчики очень сильно себя подставили: как минимум, уличив их в этом неуклюжем фокусе, можно было раскрутить их ещё на пару лет бесплатной поддержки.
Это встроенная фишка в программе по генерации этих туров, а веб-студия лишь пользуется ею чтобы удерживать своих клиентов и зарабатывать больше денег.
Вот за такое их по рукам нужно бить…
А какое было «благое» назначение данной фишки?
Т.е. я поняла что разработчик этой программы генерации прямым текстом про эту фишку написал, значит зачем-то они ее придумали?
Мне кажется эта функция сделана была чтобы можно было отправить тур заказчику «в ознакомительных целях». А после получения оплаты — прислать полную версию.
Спасибо, сразу не сообразила)
Это для демонстрации. Делают туры, отдают заказчику, и только после этого он платит. Если не платит — соответственно, блокируется воспроизведение. И да, я буду обновлять комментарии.
А не пробовали генерировать одинаковые тура в программе с разными датами и сравнивать их побайтово? Если шифрование столь простое, что сработала простая подмена байт — наверняка сразу нашли бы нужный оффсет.
Чтобы такое попробовать — надо было бы купить эту программу, а делать этого не очень хотелось :)
Просто момент пересечения заданной даты фиксируется неким флагом и программа перестаёт работать совсем
Этот флаг — очень уязвимое место. Отследить его запись/чтение не составит никакого труда.
Вспоминается как в hex редакторе ломал сейвы к Diablo 2. Найти в *.d2s файле значение денег несложно, поправить тоже. Но вот как без знаний об алгоритмах чексумм и навыков в программировании поправить чексумму чтобы игра признала файл валидным? Экспериментируя с сохранениями я выяснил один факт — есть 2 типа сейвов — «обычные» и «персонаж расширения» (если установлен expansion set), за это отвечает флажок в заголовке файла. Дальше выяснилось, что если взять свой сейв который имеет тип «персонаж расширения» отредактировать его как угодно, а затем установить флажок что это «обычный» сейв, то потом можно будет попросить игру преобразовать этого персонажа обратно в «персонаж расширения». При этом (та-да!) игра не будет проверять чексумму преобразуемого файла, а в преобразованном вычислит её правильно сама! Ну а дальше всё просто, ломай не хочу. Помимо взлома денег экспериментировал с переносом инвентаря между сейвами копированием куска файла и был у меня специальный персонаж «дырокол», у которого был выполнен квест в 5м акте и в награду кузнец был готов сделать сокет(ы) в любой вещи. Ну а дальше переносил нужную вещь с основного персонажа на «дырокола», делал сокет(ы) средствами игры, далее из сейва «дырокола» вытаскивал новые байты «проколотой» вещи (вроде заголовок вещи начинался с байтов 'JN' если правильно помню) и переносил родному персонажу. А «дырокола» опять восстанавливал из бэкапа в боевую готовность к «проколу» следующей вещи.

Дааа, весело было в те времена (когда был 1й компьютер, но не было интернета), а сейчас как-то проще всё стало и не романтично — идёшь в интернет, а за тебя уже всё подумали, взломали и написали программу, да ещё и исходники выложили :)
Моей первой успешно взломанной игрой был какой-то бильярд (неплохой, причём) под Windows 95. Игрушка требовала ввести некий код для того, чтобы открыть новые режимы. И вряд ли дело в том, что мне и раньше нравилось смотреть Нортон Коммандером в бинарники и впадать в матрицу; и не счесть количество запоротых сейвов в Elite в попытке поднять себе денег и угадать контрольную сумму (я не знал, что это, но «странные необъяснимые байты» явно указывали на внеземное происхождение). Не осознавая дикость и теоретическую бесплодность подхода, недрогнувшей рукой я открыл exe файлик и ввёл в поиске строчку «CODE» как в каком-нибудь голливудском боевике. Ответом был пустой экран где-то ближе к концу файла с этим единственным словом. А на следующем экране был собственно код 122-167, который и подошёл, и порадовал юного хакера.

Надо сказать, я ещё несколько раз пытался так же «поломать» ряд других программ, но, разумеется, не вышло. Сейчас я бы даже не начал с этого, да и разве жалко 5 у.е. за хорошую игру?..
Напомнило 8 главу из книги «Дневник охотника за ошибками» (Тобиас Клейн). Автор, эксперт по безопасности ПО, в автоматическом режиме сгенерировал 1000 тестовых файлов, представляющих собой рингтон, с одним перезаписанным байтом. Затем, последовательно произвел попытки открыть модифицированные варианты рингтона (опять-таки, не ручная работа) в MobileSafari на IPhone с прошивкой 2.2.1. Не, углубляясь в подробности, скажу, что анализ файлов, приводящих к краху, позволил автору обнаружить и эксплуатировать переполнение буфера на стеке.
НЛО прилетело и опубликовало эту надпись здесь
Лет 10 назад я занимался примерно тем же самым пытаясь в hex редакторе править екзешники для всяких программ. Принцип примерно тот же — нужно было найти код который сравнивает серийный номер с допустимым и заменить == на !=. Если все срабатывало, то активировать программу можно было введя любой серийник кромне правильного) Иногда получалось, иногда нет. Вершиной этих трудов был хак одной из первых версий фотошопа.

В целом автору респект. Кто ищет то всегда найдет. Так держать )
А я так искал какой регистр отвечает на моей бывшей GeForce9600GT за обороты вентиляторы… в итоге нашёл. :) Увы тогда проекту nouveau это было не нужно, только nvclock вроде добавил.
Хотя нет, таким способом я много чего делал…
Вы вот прикалываетесь, а я как-то бессмертия добился в 8-битной игрушке Парк Юрского периода под NES. Мне в детстве её никак не удавалось пройти — сложная сильно. И когда настало время эмуляции, даже с сейвами мне не удавалось преуспеть в прогрессе. И тогда я просто прошелся HEX-редактором по рому. И о чудо какое-то изменение привело к вечно мигающему герою (как после респауна). Он почти во всех случаях бессмертен (только динозавр мог наступить). Так я наконец-то прошел эту игру. Так что метод рабочий — проверено ;)

p.s. Ром даже где-то в архиве должен до сих пор валяться.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации