All streams
Search
Write a publication
Pull to refresh
402
0
Evgeny Vrublevsky @VEG

C++ Developer, Reverse Engineer

Send message
На каком этапе запуска программы потребовало диск?
Функция отвязки от диска проверена не один раз, все должно работать. Вы не могли вы выложить скриншот с этим сообщением?
*то заметили бы, что это и есть моя модификация :)
Если бы вы были внимательны, то это и есть моя модификация :)
Если не секрет, расскажите что за модификацию вы делали?
Очень интересно. Может быть движок Starcraft более гибкий в этом плане?..
В Age of Empires мало того, что для каждого игрового разрешения своя графика, так еще и в коде есть огромное количество switch-ей в зависимости от текущего разрешения, где определяется расположение вывода всех элементов интерфейса и т.д. И чтобы добавить новые разрешения все это нужно исправлять.
Однако, ребята молодцы, респект им за это в любом случае :)
Главное побольше энтузиазма и терпения — и все получится! У меня тоже не сразу все получалось, над некоторыми мелочами приходилось сидеть чуть ли не сутки и т.д.
Дело в том, что я из игры передаю параметры в config.dll, поэтому простым добавлением в импорты не обойдешься. Более того, для некоторых вещей может понадобиться возможность управлять программой из библиотеки — и здесь обычным вызовом DllMain при LoadLibrary не обойдешься, необходимо передавать/принимать какие-то данные в/из игры.
Хотя это хорошая идея для подключения библиотеки wndmode.dll — чтобы наименьшей кровью сделать какое-нибудь DirectDraw приложение оконным. Спасибо за идею.
Вызовы функций из системных библиотек и функции из стандартных заголовочных файлов отображаются в IDA с нормальными именами.
Верно, но освободившееся место я использовал для реализации специальных функций для работы с курсором мыши с учетом оконного режима (в статье я не привел, потому что кода много). И к сожалению, отведенного места чуть-чуть не хватило на полноценную реализацию замены SetCursorPos, а разрывать на куски одинаковые по смыслу функции не хотелось :). Впрочем, это отразилось только на одном вызове этой функции в ветке кода игры, которая никогда не вызывается. Вообще я в коде игры пока разбирался обнаружил очень много принудительно отключенных веток кода и не до конца реализованных вещей, которые никак нельзя запустить из игры, но можно из отладчика.
Для этого нужно отладчиком найти где программа ставит для себя эксклюзивный доступ к видеобуферу и отключить эту «фичу». Это всегда происходит гарантированно до перехода игры в полноэкранный режим. Поскольку Age of Empires работает на DirectDraw, я нашел вызов:
DrawDev->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);

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

После чего игра хоть и с противными графическими артефактами (вся цветовая палитра нарушилась) потеряла эксклюзивный доступ к видеобуферу, и появилась возможность открывать программы поверх этого приложения (отладчик). Думаю, в случае с Direct3D будет очень похоже.
В случае же с Age of Empires я постарался как можно быстрее «прикрутить» оконный режим. Так что теперь можно отлаживать игру вообще без проблем с графикой и т.д.
Поскольку Starcraft очень похож на Age of Empires в техническом плане, сомневаюсь что есть возможность добавить поддержку новых разрешений экрана без перерисовки графики. Хотя добавить оконный режим вполне реально, при этом можно использовать библиотеку wndmode.dll — что-то мне подсказывает, что она справится.
Осталось только сделать LoadLibrary(«wndmode.dll»); в WinMain вашей игры :)
У вас все надписи квадратиками или только на кнопках? И какая локаль стоит в винде? Age of Empires II — это ANSI приложение, для его нужно чтобы в системе стоял русский язык для программ по умолчанию.
Спасибо, исправил.
Если так, то замечательно — я, как обладатель лицензионной копии — могу спать спокойно :)
К сожалению, это так.
На американском сайте heavengames.com когда я опубликовал эту модификацию фанаты сперва обрадовались обновлениям. Потом кто-то восторженно спросил, как же я это сделал, на что я (сглупил) честно ответил, что дизассемблировал, а затем внес правки в сам исполняемый файл. На что мне ответили, что это незаконно, забанили навсегда, и попросили больше этим не заниматься. Такое впечатление что сразу было не ясно, каким образом можно сделать такую модификацию :) Если бы сам не сказал — уверен, до сих пор мог бы свободно выкладывать обновления. Довели дело до абсурда…
Надеюсь, здесь никто не будет беспокоиться о том, что мы занимаемся дизассемблированием игрушки восьмилетней давности :)
Раньше было все намного сложнее. Современные инструменты (я их перечислил в статье) значительно все упрощают. Так что при знании ассемблера достаточно запастись терпением — и много что можно будет сделать.
Несколько энтузиастов уже пыталось разработать OpenGenie, однако, пока что ничего не вышло. Мне же одному проще (и интереснее) модифицировать готовый исполняемый файл для достижения необходимого эффекта.
В любом случае там нет оконного режима, конфигов и т.д. :)
Не за что :) Я буду рад, если найду людей, кому интересно копаться внутри программ. Особенно — в Age of Empires! (это отдельный разговор почему).
Простите, я не указал конкретно о какой версии идет речь. Здесь я говорю о последней версии Age of Empires II: The Conquerors 1.0C. Она требует обязательного наличия в реестре ключа CDPath, который создается при установке игры.

Information

Rating
Does not participate
Location
Финляндия
Date of birth
Registered
Activity