(24.07.2020 03:26)Zur13 Wrote: Вопрос знатокам, насколько плохо то что я сделал в третьей части и можно ли такое проворачивать?
Увы, с точки зрения программного кода это называется костылями. Так делать не надо (и учить плохому других наверное тоже).
Давайте будем разбираться.
Как найти более-менее правильно причину ошибки?
1. Смотрим содержимое EIP в логе ошибки. По примеру - 4B4BAA.
2. Открываем базу IDA и переходим по этому адресу. Видим это:
mov ecx, [eax+1Ch]
3. Смотрим лог дальше. Он нам говорит следующее:
read of address: 0x0000001C
4. Анализируем. Игра что-то пытается прочитать по адресу 1С, чего не должно быть (т.к. данные ниже адреса 400000 к коду игры никакого отношения не имеют). Смотрим причину - в eax почему-то записан ноль. Хорошо, смотрим строчку выше:
mov eax, [esi+170h]
Теперь осталось узнать, что такое esi. Вспоминаем, что в esi обычно сишный компилятор записывает данные для длительного хранения. Хорошо, тыкаем в IDA по esi и в коде сразу все места, в которых участвует esi, выделятся желтым цветом.
5. Анализируем далее. По идее тут надо бы идти к источнику esi, но это очень долго (т.к. адрес, который в него записан, может передаваться через сотню функций, без опыта пока что туда лучше не лезть). Попробуем побыстрее. Смотрим функции, для которых что-то считывается из esi. Так, это различные операции с отрядами на поле боя. Может тогда комбатменеджер? Нет, он в нашей функции получается отдельно. Может структура стека??? Хорошо, открываем структуру и сравниваем адресацию.
Выше в функции можно найти следующие строчки:
mov eax, [esi+38h]
mov dword ptr [esi+3Ch], 2
mov dword ptr [esi+40h], 0
mov eax, [esi+44h]
В структуре это:
Позиция dd ?; 38
def_group_ix dd ?; 3C - animation
def_frame_ix dd ?; 40 - animationFrame
Mon2SqDirectionForDWCr dd ?; 44 - secondHexOrientation
Смотрим названия функций, для которых эти данные используются. Думаю логично. Скорее всего esi - и есть структура стека.
Так мы разобрали небольшой участок кода, приступим к исправлению ошибки.
6. Смотрим опять то, с чего начали, но уже с комментариями:
mov eax, [esi+170h] - по структуре - получение Загруженный_звук_перемещения
mov ecx, [eax+1Ch] - тут нужна структура загруженного звука (или что-то вроде того), но у нас её нет, ну и ладно, не страшно.
7. Собственно, чтобы игра не падала, можно:
а) записать в структуру какую-нибудь загруженную озвучку, например скопировать туда адрес звука выстрела/урона/защиты/смерти, что короче подойдёт (если не будет резать слух) - выполнимо и ERM-ом в триггере перед экраном битвы (когда все звуки загружены).
б) ставить перехват кода на это место, проверять 0 в eax, если там ноль, то записывать в ecx ноль (т.е. чтобы функция остановки звука не останавливала звук, которого нет, т.к. там простая проверка на 0 по аргументу, который идёт на функцию) - бинарным патчем или уже dll.
в) грузить всю озвучку для боевой машины - так же искать место в коде, отвечающую за это дело, конкретно в месте проверки на боевые машины (там либо флаг боевой машины, либо номера монстров, в ощем тут опять применить навыки поиска адресов от Игрика). Ну и не забыть добавить саму озвучку в архивы с игрой (если её там нет).
(24.07.2020 10:19)igrik Wrote: напомни - в чем проблема у тебя поставить Win 7? В слабом ПК?
Все виндовозы, начиная с финальной версии Win 6, попросту виснут при первом запуске их установщика. Первая бета-версия Вислы устанавливалась и даже работала (но на ней невозможно работать).
(24.07.2020 10:19)igrik Wrote: А XP не потащит?
На XP IDA 7 так же не работает (у меня не вышло заставить её работать).
(24.07.2020 10:19)igrik Wrote: Просто использование вогобазы в текстовом режиме то еще извращение.
У меня вог-база сохранена в IDA 6.1 (пересохранял с версии 5.5).