ДВИЖОК QUAKE2
Движок q2 есть не что иное, как файл quake2.exe и наоборот:).
Его можно найти в корневом каталоге игры. На данный момент
последняя версия это 3.20, поэтому я взял её за основу. Скачать
её можно
здесь
(179 K).
Свойства файла(чтобы не было путаницы с версиями):
- Системные:
- Размер: 362 496 байт
- Название: quake2.exe
- Игровые:
- Версия(version в консоли): 3.20 x86 Oct 16 1998 Win32 RELEASE
- Примечание: используется deathmatch-версия 3.20 из
этого
патча (13.8 M). Если линк сдох то зайдите на
огонек к Джонни
и поищите там. Проще скачать quake2.exe у меня...
Устройсто движка с точки зрения продвинутого юзера:
Движок(далее и везде 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.
Name | RVA |
Virtual Size |
File Offset | File Size |
Type |
.text | 00001000 | 000473A0 |
00000400 | 00047400 | код |
.rdata | 00049000 | 00002698 |
00047800 | 00002800 | импорт |
.data | 0004C000 | 00729470 |
0004A000 | 0000E400 | данные |
.rsrc | 00776000 | 000003A0 |
00058400 | 00000400 | иконка |
Из 4 нас интересуют только 2, а именно код и данные. Как видно код занимает
291840 байт(мама!). Размер данных, конечно, тоже нехилый, но это не важно.
Данные не надо понимать, их надо воспринимать:)
Наша задача найти точку входа программы. Конечно проще это было-бы сделать
через TurboDebugger32, но нужно знать, откуда берется и как получается
точка входа. Для ее получения нужны два компонента: начало модуля(берется из PE-заголовка по смещению +34H),
и виртуальный адрес точки входа(находитсяв PE-заголовке по смещению +28H).
Берем эти 2 числа и складываем. Получается искомая точка входа, равная
0043A7E0.
На этом месте раздел упирается в свои рамки. Все что еще придет на ум,
будет описано в разделе Дополнительная Информация. Остается только
перейти к
Последовательному Декомпилингу.
Дополнительная Информация
Organic
/2001/