ДВИЖОК QUAKE2

Движок q2 есть не что иное, как файл quake2.exe и наоборот:). Его можно найти в корневом каталоге игры. На данный момент последняя версия это 3.20, поэтому я взял её за основу. Скачать её можно  здесь  (179 K).

Свойства файла(чтобы не было путаницы с версиями):
  1. Системные:
  2. Игровые:
Устройсто движка с точки зрения продвинутого юзера:
   Движок(далее и везде q2) Quake2 реализован , отчасти, как система плагинов(plug-in). Плагин это обычно .dll библиотека, которая имеет в списке экспортируемых функций определенный набор методов. Когда запускается главный модуль, он ищет все доступные плагины(они распологаются либо в определенном каталоге, либо имеют специальные имена типа plugin_1.dll, plugin_2.dll, plugin_X.dll итд). После того, как найдено расположение плагинов, модуль выбирает из всех доступных плагинов нужный и использует его по ходу программы. Короче, те кто пользовался WinAmp'ом поймут...
    В q2 на плечи плагинов возложена основная задача-ВИДЕО. Все остальное железо: звук, управление, CD и сеть находится внутри движка. Сам игровой процесс, т.е. интеллект монсторов, оружие и все все все, что относится к ИГРЕ, вообще находится в другом, особняком стоящем файле-gamex86.dll. Этот файл широко известен людям делающим боты и другие q2-модификации %) Кстати исходники этого файла давно раскрыты и лежат  тут (445 K).
    Результат можно представить в виде такого рисунка:

Показать...

Про плагины q2:
    Плагины q2 находятся в корневой директории Quake2. О том что это плагин, говорит префикс имени файла ref_, например ref_soft.dll-это видеоплагин для софтверного рендеринга, а ref_gl.dll-это OpenGL-рендеринг. ref скорее всего cокращение от "refresh"-обновление (экрана). Других вроде пока не наблюдается, но ничто не запрещает создавать свои плагины. Например, я создам ref_d3d.dll и у меня будет Direct3D-рендеринг.
    Подключаются плагины проще простого-для этого нужно в корне q2 создать batch(.bat)-файл с таким содержанием: quake2.exe +set vid_ref d3d , где d3d это название плагина, который нужно подключить.

Как движок подключает плагины:
    Внутри каждого плагина есть экспортируемая функция GetRefAPI. Какой .dll использовать указано в консольной переменной vid_ref. q2 вызывает GetRefAPI выбранного плагина, получая на выходе адреса основных методом плагина. Какие функции входят в плагин, пока не важно. Потрошить их я пока не буду, а кому нужна инфа по ref_'ам, то почитайте её здесь.

    Про видеоплагины вроде-бы все, теперь конкретно про сам движок. Для его потрошения(дебагинга) нужен кое-какой софтик. Вот список:
  • HEX-редактор. Понадобится нечасто, но все равно пригодится. Я выбираю HIEW 5.50. Может она устарела, но меня устраивает.
  • Дизассемблер. Однозначно W32DASM 8.93. И не надо кричать про софтайсы и ИДЫ.
  • Отладчик(дебагер).TurboDebugger32, входящий в состав TASM 5.0, под именем TD32.EXE. На мой взгляд это самая полезная из всех прог, которыми я пользуюсь. Классная вещь!!!
  • Здесь кончается LAMERZONE...


    Структура quake2.exe:
        Как известно q2 это программа для Windows9X и выше. Если вы попытаетесь запустить ее под DOS, то она выдаст такое сообшение: This program cannot be run in DOS mode...
        Соответственно у q2 будет два EXE-заголовка: старый для совместимости с DOS, и новый PE-заголовок. В старый заголовок входит также stub ("пень или заглушка")- это программа, которая выводит строку и завершается. Здесь находится HEX-карта и описание старого заголовка, а тут нового.
        Разбор PE-заголовка дает следующую инфу: у экзешника 4 объекта

    Таблица объектов. Все значения в HEX.
    NameRVA Virtual Size File OffsetFile Size Type
    .text00001000000473A0 0000040000047400код
    .rdata0004900000002698 0004780000002800импорт
    .data0004C00000729470 0004A0000000E400данные
    .rsrc00776000000003A0 0005840000000400иконка

        Из 4 нас интересуют только 2, а именно код и данные. Как видно код занимает 291840 байт(мама!). Размер данных, конечно, тоже нехилый, но это не важно. Данные не надо понимать, их надо воспринимать:)
        Наша задача найти точку входа программы. Конечно проще это было-бы сделать через TurboDebugger32, но нужно знать, откуда берется и как получается точка входа. Для ее получения нужны два компонента: начало модуля(берется из PE-заголовка по смещению +34H), и виртуальный адрес точки входа(находитсяв PE-заголовке по смещению +28H). Берем эти 2 числа и складываем. Получается искомая точка входа, равная 0043A7E0.
        На этом месте раздел упирается в свои рамки. Все что еще придет на ум, будет описано в разделе Дополнительная Информация. Остается только перейти к  Последовательному Декомпилингу.

    Дополнительная Информация    


    Organic /2001/
    Hosted by uCoz