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

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

Круто, правда. Спасибо за статью.
Не за что :) Я буду рад, если найду людей, кому интересно копаться внутри программ. Особенно — в Age of Empires! (это отдельный разговор почему).
Боюсь, мне это интересно только с теоретической точки зрения, не более. Да и в AoE не играл; хотя, люблю globulation2, wc3tft, а из старых стратегий — Saga (Rage of the Vikings).
Age of Empires II совершенно спокойно работает просто переписавшись на другой компьютер. Я тоже в это не верил, но друг это продемонстрировал. ( да и сам это делал сутки назад )
Простите, я не указал конкретно о какой версии идет речь. Здесь я говорю о последней версии Age of Empires II: The Conquerors 1.0C. Она требует обязательного наличия в реестре ключа CDPath, который создается при установке игры.
Вот именно в него моя жена в данный момент и играет. переписал как раз на ноут. У нас что-то вроде клуба любителей Age of Empires, собираемся и играем по сети. Ностальгия…
Хотя я, олень, не сказал, что игра пиратская и скорей всего уже с проделанными выше операциями. Прошу прощения.
В любом случае там нет оконного режима, конфигов и т.д. :)
Не могу с этим не согласиться. Спасибо. А вот за "… Логическим завершением развития данной модификации может стать внедрение в игру поддержки игровых комнат с созданием соответсвующего игрового сервера..." я проголосую обоими руками, ногами и волосами.
НЛО прилетело и опубликовало эту надпись здесь
это какое-то волшебство…
> xor eax, eax
> inc eax

а не проще так?
>mov eax, 1

а в целом — спасибо, понравилось)
это 3 байта а mov eax, 1 пять байтов
мм… тогда понятно. спасибо. учту)
В век питона и Ruby по прежнему есть кодеры экономящие байты %)
P.S. Хотя учитывая тематику этого блога… :)
Найдите ка аналогичную статью на Руби или Питоне ..))
В данной ситуации экономия не причем… здесь требуется сохранить количество байт, что бы адресацию в программе не сбить.
при чём тут это? мы просто экономим место. а неиспользованыt байты забиты nop'ами (90h)
Автор пишет:
>При этом мы освободили 288 байт для дополнительного машинного кода, что пригодится нам в дальнейшем.
Верно, но освободившееся место я использовал для реализации специальных функций для работы с курсором мыши с учетом оконного режима (в статье я не привел, потому что кода много). И к сожалению, отведенного места чуть-чуть не хватило на полноценную реализацию замены SetCursorPos, а разрывать на куски одинаковые по смыслу функции не хотелось :). Впрочем, это отразилось только на одном вызове этой функции в ветке кода игры, которая никогда не вызывается. Вообще я в коде игры пока разбирался обнаружил очень много принудительно отключенных веток кода и не до конца реализованных вещей, которые никак нельзя запустить из игры, но можно из отладчика.
а что за ветки?
Ветки кода :)
Я их так называю.
Ну там например игра может играть MP3 во время геймплея. Однако, эта функция не дописана — композиция играет один раз и не «зацикливается».…
Экономия как раз и причем, если не экономить, то требуемая реализация может не уместиться в освободившейся области. А адресация никуда не денется, в крайнем случае всегда можно сделать jmp на другую область там закончить и вернуться обратно.
Полагаю что вы себя относите именно к питону и руби %) Верно говорят что асм и все остальное это два разных мира. И проблемы одних просто не понятны другим.
что там байты, я как-то с 3 битами мучался :)
Хм. Вроде бы минимальный адресуемый объем — 1 байт. А работа с отдельными битами требует большего объема кода. Нет?
Наверное, я не совсем точно выразился. Мне было достаточно только 3 бит из байта, чтобы сделать нужную мне вещь (хранить статусы 3 событий в игре), но читал байты, да. Вот с реализацией возникли проблемы, из-за которых мне и пришлось выучить азы ассемблера и освоить кнопочку «attach» в ollydbg — кроме меня всем было лень решать важную для меня тогда проблему, пришлось самому.
НЛО прилетело и опубликовало эту надпись здесь
А на старшие биты пофик?
Да, вариант не самый надежный.
С другой стороны, скорее всего, результат функции, возвращающей 1 при успехе, сравнивается с нулем, а в этом случае старшие биты не помешают.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Несколько энтузиастов уже пыталось разработать OpenGenie, однако, пока что ничего не вышло. Мне же одному проще (и интереснее) модифицировать готовый исполняемый файл для достижения необходимого эффекта.
До такого я ещё не доходил. Самые крутые «дрова», которые я «наломал» — это был проигрыватель мультимедиа QvPro для DOS. Каким-то макаром закрыл там все нагскрины (для более старых версий и кодогенератор написал, но в последних его, по-видимому, написать было невозможно, т.к. перешли на онлайн-регистрацию).

Ещё раз спасибо за то, что заставили меня тряхнуть стариной.
Раньше было все намного сложнее. Современные инструменты (я их перечислил в статье) значительно все упрощают. Так что при знании ассемблера достаточно запастись терпением — и много что можно будет сделать.
Но ломал-то я всё равно идой. Хоть и более старой версии.
P.S. Остальное — по мелочи.

— адаптировал Prince of Persia 2 под AC'97 (зарезал странную ветвь в ISR'е звукового драйвера, зависы кончились).
— хакнул Warcraft II патч 1.50 (правда, его я домал не идой, а Qview).
Да… hiew, tasm… ностальгия. Всплакнул %)
Фраза «автор не несёт никакой ответственности», к сожалению, не оказывает магического влияния на действующее законодетельство. А написано здорово :)
К сожалению, это так.
На американском сайте heavengames.com когда я опубликовал эту модификацию фанаты сперва обрадовались обновлениям. Потом кто-то восторженно спросил, как же я это сделал, на что я (сглупил) честно ответил, что дизассемблировал, а затем внес правки в сам исполняемый файл. На что мне ответили, что это незаконно, забанили навсегда, и попросили больше этим не заниматься. Такое впечатление что сразу было не ясно, каким образом можно сделать такую модификацию :) Если бы сам не сказал — уверен, до сих пор мог бы свободно выкладывать обновления. Довели дело до абсурда…
Надеюсь, здесь никто не будет беспокоиться о том, что мы занимаемся дизассемблированием игрушки восьмилетней давности :)
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Да, но если ты произвёл действия, противоречащие ИХ законодательству у НАС, публично проинформировал об этом (в т.ч. на ИХ языке), а потом, хорошенько не подумав, прилетел к НИМ, скажем, на семинар или в турпоездку, велик шанс попадания не на семинар, а в совсем другое место.
Чтобы не нарушать законодательство можно написать loader который на лету все патчит в памяти… =)
если правильно помню, то в рамках действующего(РФ) как раз можно менять под себя, главное что б в пределах государства.
Если так, то замечательно — я, как обладатель лицензионной копии — могу спать спокойно :)
исправлять то вроде модно, а вот распрстранять…
блин, 2 ночи, пальцы заплетаются… пора спать
нет.Это разрешается только для того, чтобы программа заработала. Если она и так работает — тады ой.
Не совсем так. тем более, что понятие «работает» довольно растяжимое. В данном случае, автор может смело сказать что имеющеся баги не позволяют ему считать программу работающей.

И вообще, если уж совсем подходить с позиций занудства, то можно сказать что автор платил за качественный софт, а ему подсунули баги %) Соответственно можно подать в суд, моральный ущерб и т д. :)
НЛО прилетело и опубликовало эту надпись здесь
Вы просто волшебник. Здорово.
Спасибо, исправил.
Функционал помимо своего первоначального смысла еще используется в качестве короткого аналога слову «функциональность» в айтишном сленге. Та к что это не безграмотность, а просто сленг.
Я не говорил о «безграмотности».
Это все хорошо, пока «сленг» не начал встречаться не только в статьях официальных оффлайн-изданий, но и white papers крупнейших софтверных и консалтинговых компаний. Функционал добавляют, разрабатывают, внедряют, расширяют, закладывают. И пишут это сотрудники пиар-отделов, а не айтишники. Не потому, что так короче, а потому что от слова отдает бизнес-новаторством, можно применить к любой стандартной разработке, и звучит ведь, и продается.
Всегда біло интересно — как делают NoCD к играм… Спасибо за статью!
Сори за «біло» — правильно — бЫло — но, в час ночи и не такое написать можно…
Спасибо. Очень доступно про то как сделано. И за саму игру спасибо. В своё время руки не дошли, а сейчас самое то будет на флешку записать и время от времени поигрывать.

Только один вопрос — у меня все тексты знаками вопросов — видимо в системе какойто фонт не русский, который игра использует. Можно самой игре этот файл подсунуть, чтобы он был уже в игре?
У вас все надписи квадратиками или только на кнопках? И какая локаль стоит в винде? Age of Empires II — это ANSI приложение, для его нужно чтобы в системе стоял русский язык для программ по умолчанию.
Все знаками вопросов. Попробую переключить, машина не моя, я только вечерами там сижу и есть время. Просто подумал, что может если фонт будет лежать прямо в папке игры, она его подхватит до того, как полезет в системные. Или где в конфигах прописано и можно поменять.
Вероятнее всего стоит стандартная системная кодировка — не кириллица. Если так, то загрузка даже нужных скриптов не поможет. Здесь можно попробовать подсунуть игре английскую версию библиотек language*.dll. Тогда все будет по-английски :)
Работает. Поменял на рус. все нормально.
Впечатлило, вот такие статьи и ждешь от Хабра))

p.s. Отключение проверки CD — хорошая идея. Например, в игре Driver Parallel Lines проверка CD (надо время на раскрутку привода + если диска нет в приводе, владелец диска должен тратить время на поиск и вставку диска) занимает больше времени, чем сам запуск игры! Возмутительно! Поэтому я всегда за отключение этих дурацких проверок.
когда я интересовался этими вопросами, моим любимым сайтом был wasm.ru/
там много статей на аналогичную или похожую тему, а так куча инструментов и целый форум ассемблерных гиков
Вау, это просто легендарно. Может можно попросить вас покопаца в старкрафте дабы разрешить ему использовать нестандартные разрешения екрана?

как ето было бы круто поиграть в него полноценно хотя бы на ноуте не говоря уже про мониторы скажем 22 и больше дюймов
Поскольку Starcraft очень похож на Age of Empires в техническом плане, сомневаюсь что есть возможность добавить поддержку новых разрешений экрана без перерисовки графики. Хотя добавить оконный режим вполне реально, при этом можно использовать библиотеку wndmode.dll — что-то мне подсказывает, что она справится.
Осталось только сделать LoadLibrary(«wndmode.dll»); в WinMain вашей игры :)
Вот недавно появилась mod для старкравта позволяющий поставить любое разрешение:
www.starcraftresolutionhack.de.vu/
www.campaigncreations.org/forum/index.php?topic=1345.0
Но он пока еще в бета версии, сам не проверял, смотрел только видео. Народ говорит что реплеи смотреть удобнее :)
Очень интересно. Может быть движок Starcraft более гибкий в этом плане?..
В Age of Empires мало того, что для каждого игрового разрешения своя графика, так еще и в коде есть огромное количество switch-ей в зависимости от текущего разрешения, где определяется расположение вывода всех элементов интерфейса и т.д. И чтобы добавить новые разрешения все это нужно исправлять.
Однако, ребята молодцы, респект им за это в любом случае :)
Может конечно и гибкий, но тут мне кажется больше сыграла популярность старкрафта.
Думаю на данный момент старкрафт на порядок популярнее Age of Empires.
спасиб большое, щаз заценим
НЛО прилетело и опубликовало эту надпись здесь
У меня ф7 и ф8 были затёрты =) Либил я это дело годика 3-4 назад.
Причём сам дошёл до мысли что ломать программы можно с помощью отладчика. Сначала пытался приспособить под это дело отладчик из delphi, но потом почитал статьи в инете и нашёл OllyDbg
Ух ты… Круто!!! Спасибо большое за статью, это очень здорово что такие тексты появляются тут на хабре.
Отличная статья. Жаль, что на многих старых играх стоит StarForce (чаще 3ий версии)… и первый пункт статьи занимал бы тогда раз в 20 больше места :)
дни cracklab.ru на хабре
Где же вы раньше ходили, TTD с нуля переписывать пришлось.
Отлично!!! Просто в 10-ку!
Большое спасибо за статью, главное не забрасывайте эту тему! Очень интересно что и как можно сотворить без наличия исходников, да и побольше статей про реверс инженеринг и асм.
Буду ждать следующие статьи.
А как одновременно пользоваться отладчиком и игрой в fullscreen? Постоянное переключение было бы очень утомительно…

Кто бы ещё поправил такую фичу в CS 1.6, что после смерти выбранное ранее «spectator view mode» не запоминается :-)
Для этого нужно отладчиком найти где программа ставит для себя эксклюзивный доступ к видеобуферу и отключить эту «фичу». Это всегда происходит гарантированно до перехода игры в полноэкранный режим. Поскольку Age of Empires работает на DirectDraw, я нашел вызов:
DrawDev->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);

И заменил его на:
DrawDev->SetCooperativeLevel(hWnd, DDSCL_NORMAL);

После чего игра хоть и с противными графическими артефактами (вся цветовая палитра нарушилась) потеряла эксклюзивный доступ к видеобуферу, и появилась возможность открывать программы поверх этого приложения (отладчик). Думаю, в случае с Direct3D будет очень похоже.
В случае же с Age of Empires я постарался как можно быстрее «прикрутить» оконный режим. Так что теперь можно отлаживать игру вообще без проблем с графикой и т.д.
В контре могут быть проблемы с античитерскими фичами разными.
Хорошая статья :)
Я тоже примерно тем же занимаюсь, только для Neverwinter Nights. :) Например, добавили поддержку MySQL/PostgreSQL/SQLite для хранения данных и объектов, поддержку Ruby как языка игровых скриптов и т.д. :)
www.nwnx.org/
Для получения машинных кодов не обязательно писать сначала src.asm а потом компилить FASMом и смотреть байты. Достаточно в Hiew писать сразу на asm.
А каков процесс прослеживания вызовы функций?

Это сразу видно в отладчике, где какая или …?
Вызовы функций из системных библиотек и функции из стандартных заголовочных файлов отображаются в IDA с нормальными именами.
Хотелось бы почаще видеть посты подобной тематики (ассемблер/дизассемблирование). :)
Сурово, есть еще кодеры!

А может, вместо патчинга ebueulax.dll было проще добавить в импорты свою собственную DLL? Она бы подгружалась при запуске приложения.
Дело в том, что я из игры передаю параметры в config.dll, поэтому простым добавлением в импорты не обойдешься. Более того, для некоторых вещей может понадобиться возможность управлять программой из библиотеки — и здесь обычным вызовом DllMain при LoadLibrary не обойдешься, необходимо передавать/принимать какие-то данные в/из игры.
Хотя это хорошая идея для подключения библиотеки wndmode.dll — чтобы наименьшей кровью сделать какое-нибудь DirectDraw приложение оконным. Спасибо за идею.
Не за что :-)
С перехватом есть еще одна мысль: если вызов DirectX идет через call, и по call управление передается на jmp API (бывает такое иногда), можно просто расширить последнюю секцию, добавить в нее код, который будет корректировать параметры и делать jmp API
Спасибо, замечательная статья. Сам сейчас потихоньку пилю одну игрушку (тоже из 2000-го года), но т.к. ассемблерное мышление развито слабо, продвигаюсь очень медленно.
Главное побольше энтузиазма и терпения — и все получится! У меня тоже не сразу все получалось, над некоторыми мелочами приходилось сидеть чуть ли не сутки и т.д.
Спасибо за статью!
Было интересно почитать.

Одно время сам занимелся реверсом, для внедрения одной фишки в Starcraft, правда мои познания в области Ассемблера не такие как у Вас, но с задачей справился, правда и задача была куда проще )
Если не секрет, расскажите что за модификацию вы делали?
В движке Starcraft'a для вывода текста разным цветом, используются специальные HEX коды.

В начале менял через ArtMoney, искал в памяти нужный адрес по значению текста (ник игрока), потом модифицировал и возвращался в игру, затем решил автоматизировать.

В итоге разобрался с DMA (Dynamic Memory Allocation), нашел необходимые адреса, и на Delphi написал программу, которая по заданному смещению выводила текущий ник и позволяла его модифицировать (ReadProcessmemory, WriteProcessMemory).

Дальше начал изучать программу на предмет изменения разрешения, но в тот момент не обладал необходимыми знаниями для столь серьезных изменений. Потом был занят другими задачами и к этому вопросу не возвращался.
Если бы вы были внимательны, то это и есть моя модификация :)
*то заметили бы, что это и есть моя модификация :)
лучше бы топик был о нормальном программировании на ассемблере.
по реверс инженерингу статей и книг куча.
еще очень часто в лицезии запрещается дизассемблировать программу.
А про программирование на Ассемблере книг мало… :-)
Почему мало?
Пирогов, Зубков, Магда, Юров, Абашев, Iczelion, Абель — далеко не полный список.
Многие авторы выпускают также книги по реверс инжинеринг — Пирогов, Касперски.
А если учесть забугорных авторов — можно долго перечислять…
Это был сарказм…
Пусть у нас есть разработчик с программой распространяемой по GPL лицезии (или совместимой).
Вдруг какой-либо другой разработчик использует код в целях получения коммерческой выгоды и не сообщает создателю.
Это хорошо?
Нет, это наказуемо и можно судится — даже народ поддержит.
Тогда почему нарушение лицензии («запрещается дизассемблировать программу или исследовать» итп) относительно машинного кода — это хорошо?
Ведь топик именно о том, как нарушить лицензию?
Это, думаю, многим напомнило детство в квадрате — одна из первых игр и дизассемблирование — всякие crackme-программки обучающие… Дальше дело не зашло :)
Спасибо за Творение!
Реально напомнила тема институтские годы.

Вопрос же будет в другом. Скачал архив, установил, запустил — для начала игры требуется вставить диск в дисковод. XP Pro, SP2. Что я делаю не так?
На каком этапе запуска программы потребовало диск?
Функция отвязки от диска проверена не один раз, все должно работать. Вы не могли вы выложить скриншот с этим сообщением?
Прошу пардону — диск требовался только для кампаний. К слову, есть ли возможность скачать их файлы отдельно?
Могу выложить, там 200 с чем-то мегабайт архив (если со всем звуковым оформлением)…
Да нет, пожалуй, кампании получаются великоваты.
А за статью — ещё раз спасибо. :)
буду признателен
Статья на конкурс хабра? если чесно?
публику и меня всегда завораживает зрелище выковыривания, особенно в АСМе

ЗЫ. если хабранарод помнит, то в прошлом конкурсе победила статья по раскопкам тини вируса.
ЗЫЫ. отличная статья :)
А что за конкурс если не секрет? Я не в курсе =)
на лучшую статью :) с призами, где то есть на главной
Здорово.
Но не написано, как была решена задача «4. Сделать игру переносимой». Предположу из текста, что получилось это «само» в результате замены функции загрузки библиотеки ebueulax.dll — «много лишних действий» могли быть не совсем уж и лишними. Или проверкой наличия диска дело ограничилось?
Под wine не работает :( А уже ведь руки зачесались!
Отличная статья! Сам много лет занимался подобными вещами (только с Ultima Online) и использую как раз такой-же набор инструментов, за исключением Hexview, вместо него использовал всегда HIEW (очень нравится такой функциионал как поиск ссылок на текущий адрес и ассемблирование на лету). А по поводу FASM'a там помоему есть директива Virtual которая подставляет нужные смещение для функций при компиляции.
Я предпочитаю для таких целей использовать С/С++ с минимальными вставками (а то и без них) ассемблера. Дело в том, что очень часто можно реверснуть структуры данных игры и использовать их в Сишном проекте. В результате немного увеличивается эффективность труда.

В свое время я сел переписывать Master of Orion 2, но дело заглохло — он был слишком криво написан и его проще было бы переписать с нуля, чем отреверсить целиком.

Кстати, из таких вот интересных проектов могу упомянуть TTDPatch, ScummVM, OpenTTD. Последние два реверснуты ludde (Ludvig Strigeus), он же автор µTorrent.

Вобщем, тема интересная. Только времени много забирает.
Статья отличная

А можно ли заставить работать AOE2 через Хамачи или другие VPN?

Не рабоает, сколько не бился :(
Извиняюсь за некропостинг, но это возможно, если выставить адаптеру Hamachi максимальный приоритет, к примеру вот таким способом.
Сорри за некрокомментарий, я добавил описание и решение проблемы в Community bug tracker. А вообще конечно лучше перейти на opensource клон игры . С открытым ПО не пришлось бы бинарники править.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.