BFG2407 = Warrant Officer =
| 1211 |
Doom Rate: 1.38 Posts quality: +235 |
Отправлено: 05.08.15 22:04:46 | | | Новая редакция:
Решил всковырнуть в IDA .exeшники дум движков, для приблизительного сравнения, насколько они похожи на то, что есть в версии 1.0 Тут меня сразу-же ждало разочаровние: версия движка 1.0 либо чем то пожата, но IDA выдала некорректный граф - после анализа кода, он выходит незаконченным. Впрочем его изображение я предоставлю с пометкой на место где программа запнулась. Для начала я просто предоставлю изображения графов, почти без комментариев, а в последующих постах буду стараться за счёт чтения кода приблизительно обрисовать логику работы, но для версии 0.2 я даже стараться не буду - овчинка не стоит выделки: когда увидите вы сами всё поймёте. Хочу оговориться, что на изображениях вы увидите блок-схемы без кода, в дальнейшем я буду показывать, где какой участок кода расположен.
1. Этот граф выдаёт IDA когда подсовываем ей .exe v 0.2 - чесн, ковырятся даже в нём не хочу, единственное, что понял: место отмеченное звёздочкой - код занимающийся построением левела.
2. Этот граф получен из 0.3. На лицо хаотичный творческий рост из 0.2 - единственное, что понятно, это то, что благодаря меню, вырисовалась структура "запуска" (верхняя часть изображения) и "завершения" (нижняя часть), при этом прописано уйма условий при которых двиг заводиться и останавливается, в ряде случаев условия цикличны. Но всё равно разобраться в этом весьма проблематично, хотя и логика уже прослеживается.
3. Это версия 0.4 Структура уже стройная и удобоваримая - чувствуется переписывание движка "с нуля". Компилятор идентифицировался - Boland C. Немного не понятно завершение программы, хотя второй выход (а точнее вылет), в случае ошибки.
4. Внимание найдите 10 отличий, хотя можете не искать - в структуре их нет. Это версия 0.5: разница только в том, что написано внутри блоков - самом коде. В логике работы разницы нет.
5. Эта версия 0.9 - структура теперь более линейная. В случае ошибки двиг перескакивает часть кода и завершается в штатном режиме без бсодов и зависаний. Ясное дело код претерпел значительные изменения. В виду отсутствия версий: 0.6, 0.7, 0.8 не берусь утверждать когда и как в его логике что-либо менялось. Может быть структура обрисовалась после добавления bsp - двиг стал работать более стабильно, и нужда в аварийных блоках, попросту пропала.
6. Это выдала IDA на релизную версию 1.0, запнулась она в последнем блоке: Красным отмечена строка, где программа не схавала. Вполне вероятно, что .exe был запакован. Однако я не думаю, что 1.0 будет чем-либо сильно отличаться по логике от 0.9 - вполне вероятно ситуация та-же, что с 0.4 и 0.5: разница только в содержимом блоков.
Думаю, что при наличии времени буду потихоньку допиливать анализ. Анализ будет как "геймпленый" мы будем пытаться понять логику работы запуская альфы и ища баги наверняка, а так-же пытаться понять что написано в коде. Предупреждаю сразу, что ассемблерист из меня плохой даже "со словарём", поэтому сильно не бейте. Жаль нет ЗЕРНОЕd'а!
P.S. Рано построил доводы относительно версий 0.4, 0.5 и 0.9. Дело в том, что собраны были они борландом, а следовательно дизасемблировалась борландовская развёртка - dos4gw. Появилась следующая задача: отвязать версии 0.4, 0.5 и 0.9 от Dos4GW - получить LE файл. После этого пропустить в IDA его через HexRays - получить исходник на С++. Не гарантирую, что всё будет работать, но зато будет более-менее понятно.
P.S.S. Как выяснилось на графы 0.4, 0.5, 0.9 - Dos4gw не влияет, т.к. он расположен отдельно от .exe, а вот на версии 1.0 IDA запиналась именно по причине этого самого dos4gw | |
|
ZZYZX - UAC Commissar -
| | 6284 |
Doom Rate: 1.65 Posts quality: +1630 |
Отправлено: 06.08.15 04:18:02 | | | Если я правильно понимаю, то это main(). В идеале main() игрового движка должен выглядеть так:
int main(int argc, char** argv)
{
parse_args(argc, argv);
main_loop_init();
while (main_loop_step())
sleep(1);
main_loop_shutdown();
return get_main_loop_return_value();
}
Почему в альфах дума такой огромный main(), я не понимаю. В версии 1.0 всё хорошо. А запнулась ида потому, что скорее всего там нестандартное использование регистров. Программисты под дос регулярно таким грешили, как и компиляторы с оптимизацией. | |
|
BFG2407 = Warrant Officer =
| 1211 |
Doom Rate: 1.38 Posts quality: +235 |
Отправлено: 06.08.15 08:19:44 | | | ZZYZX Вполне вероятно. Однако, в main содержится ещё что-то. Дело в том, что если говорить об ассемблерном построении, то сначала мы имеем перечисление функций - до тела программы, затем само тело программы. Функции в ассемблерном представлении, не совсем то, что в представлении С. Но при этом не факт, что графы - это только тело "main". Хотя и main может быть огромным, если разбиения на функции особо нет.
P.S. на еденице IDA запнулась, по причине "не соответствия типов" - это происходит, когда dos4gw собирают во едино с .exe, а не выносят его отдельно от основного .exe
sobran Да можно перенести. Надо будет ещё поковырять и накатать первую статейку.
Добавлено спустя 2 дня 12 часов 30 минут 22 секунды:
Преждевременно, но всё-таки, закину. Считаю это не такая важная фича, чтобы только из-за неё статью пилить. И так, это модифицированный dos4gw - он 32х битный, и весит меньше. Стабилизирует работу приложений использующих него, и полностью совместим с dos4gw. Подойдёт не только для альфа версий дум, но и для других игр с "открытым" dos4gw.exe. Короче попробуйте с Chasm: the Rift - может при 1024x768 будет работать стабильно. Версии 0.4 и 0.5 теперь реже вылетают и хуже провоцируют нестабильность. В 0.5 заработал Hi-Res режим! (правда криво, ибо криво написан). А это модифицированный doom.exe v1.0 - 32х битное приложение, однако под XP 64 bit, и 7-кой работать не будет! Работает только с версией shareware 1.0 коротая лежит на DP. Скорость работы немного выше. | |
|