Объявления
Поздравляем
VDV_forever


Друзья, если не получается зарегистрироваться, напишите на почту vdv_forever@bk.ru.
Я оторву свою задницу от всех дел и обязательно Вас активирую! :smile10:
Добро пожаловать на геройский форум! :smile25:

Редактирование ресурсов и кода игры

Не запускается игра? Проблемы со звуком? Где, в конце концов, взять игру, скачать патчи, приложения и карты? Как установить все это? Все проблемы обсуждаем в этом разделе
offlineАватара пользователя
t800  
Ветеран
Ветеран
 
Сообщения: 982
Зарегистрирован: 22 июл 2015, 11:36
Пол: Не указан
Награды: 4
Наградной знак (1) Деревянный Щит (1) Золотой Меч (1) Серебряные Сапоги (1)
Поблагодарили: 191 раз.

Re: Heroes2 - вставляем свои аватары

Сообщение t800 » 10 авг 2015, 02:12

AlexSpl писал(а):

Можно пока ограничиться обычным переименованием модифицированного экзешника и запускаться с него. Но если очень хочется, можно создать diff-файл (fc heroes2.exe heroes2_mod.exe > diff.txt) и поискать какой-нибудь бинарный патчер либо написать свой.


Я сделал diff-файл fc heroes2.exe heroes2x.exe > diff.txt

Получил в каталоге Heroes2 такой файл diff.txt

Код: Выделить всё
‘а ў­Ґ­ЁҐ д ©«®ў HEROES2.EXE Ё HEROES2X.EXE
001620AC: 01 09
001620B0: 0B 13
001620B4: 00 27
001620B8: 15 1C
001620BC: 15 1B
001620C0: 14 23
001620C4: 26 2E
001620C8: 0C 0E
001620CC: 1D 22
001620D0: 2F 34


И что мне с ним теперь делать? И где искать бинарный патчер? :smile24:
Вернуться к началу

offlineАватара пользователя
t800  
Ветеран
Ветеран
 
Сообщения: 982
Зарегистрирован: 22 июл 2015, 11:36
Пол: Не указан
Награды: 4
Наградной знак (1) Деревянный Щит (1) Золотой Меч (1) Серебряные Сапоги (1)
Поблагодарили: 191 раз.

Re: Heroes2 - вставляем свои аватары

Сообщение t800 » 10 авг 2015, 02:59

Нашел патчер :smile21:

Надо скачать UnixUtils для Windows c http://sourceforge.net/projects/unxutil ... p_redirect
Оттуда взять diff.exe и patch.exe
Кладем их в папку Heroes2
Сперва делам diff файл для мода командой

diff --binary -a Heroes2_mod.exe Heroes2.exe > diff.txt

Потом с этим diff.txt запускаем патчер

patch --binary Heroes2.exe diff.txt

И для удаления мода

Делается diff_uninst.txt

diff --binary -a Heroes2.exe Heroes2_mod.exe > diff_uninst.txt

И запускаем

patch --binary Heroes2.exe diff_uninst.txt

И все получается :smile21: и в мод нужно будет положить только diff.txt , diff_uninst.txt и patch.exe и все! :smile1:
Последний раз редактировалось t800 10 авг 2015, 03:45, всего редактировалось 8 раз(а).
Вернуться к началу

offlineАватара пользователя
t800  
Ветеран
Ветеран
 
Сообщения: 982
Зарегистрирован: 22 июл 2015, 11:36
Пол: Не указан
Награды: 4
Наградной знак (1) Деревянный Щит (1) Золотой Меч (1) Серебряные Сапоги (1)
Поблагодарили: 191 раз.

Re: Heroes2 - вставляем свои аватары

Сообщение t800 » 10 авг 2015, 03:11

AlexSpl писал(а):

Цитата:
запустить досовскиую версию игры из IDA нельзя

Если бы было можно, не пришлось бы пользоваться виртуальными машинами типа DOSBox :smile1:

Как поставить брейкпоинт на количество существ в DOSBox Debugger.
0. Сделайте сейв, в котором герой стоит в одном шаге от Хижины крестьян. Убедитесь, что у героя есть отряд крестьян в первом слоте.
1. Сделайте дамп памяти: memdumpbin ds:0 1000000
2. Откройте дамп и найдите в нём структуру данных, соответствующую Вашему герою. Искать быстрее всего по имени героя (например, "Lord Kilburn"). Прибавьте к адресу, по которому хранится имя героя (т.е. первый байт имени), число 0x60 (60h). Так Вы получите адрес, по которому хранится численность самого первого (левого) отряда в армии героя. Обозначим этот адрес как Addr
3. Установите брейкпоинт по этому адресу: bplm Addr
4. Теперь посетите героем Хижину крестьян.

Осталось только проанализировать код и изменить команду.


И еще я сейчас попробовал выставить брейкпоинт как вы тогда сказали, и у меня тоже получилось :smile21:
Игра действительно останавливается когда заходишь в хижинку крестьян и еще она останавливается
когда пытаешься распустить крестьян че сидят в у героя в первом отряде :smile1:
И еще мне интересно а как вы узнали про ту последовательность для хижинок 01 00 00 00 0B 00 00 00 00 00 00 00
Потому че я смотрю что выдает дебагер на брейкпоинте и ничего похожего на 01 00 00 00 0B 00 00 00 00 00 00 00 не видно :smile5:
Изображение
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5540
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2155 раз.

Re: Heroes2 - вставляем свои аватары

Сообщение AlexSpl » 10 авг 2015, 16:12

Благодаря брейкпоинту, мы только "высаживаемся" в окрестности той инструкции, которая выбирает тип монстров, доступных для найма во внешнем двеллинге. У меня - самая первая версия SW, ещё без защиты. Поэтому легко находим адрес в базе данных IDA и анализируем код, выполняющийся до этого, что и приводит к решению. Специально посмотрел DOS-овские версии PoL. В них присутствует защита, поэтому сначала нужно получить дамп инструкций в окрестности адреса, по которому случился останов, командой memdumpbin, затем дизассеблировать полученный дамп в IDA и проанализировать его. Чем грамотнее мы выберем брейкпоинт, тем легче будет найти инструкцию. В нашем случае нужная инструкция, которая загружает оффсет таблицы c ID монстров в регистр, находится очень быстро.
Вернуться к началу

offlineАватара пользователя
t800  
Ветеран
Ветеран
 
Сообщения: 982
Зарегистрирован: 22 июл 2015, 11:36
Пол: Не указан
Награды: 4
Наградной знак (1) Деревянный Щит (1) Золотой Меч (1) Серебряные Сапоги (1)
Поблагодарили: 191 раз.

Re: Heroes2 - вставляем свои аватары

Сообщение t800 » 10 авг 2015, 18:33

AlexSpl писал(а):

Благодаря брейкпоинту, мы только "высаживаемся" в окрестности той инструкции, которая выбирает тип монстров, доступных для найма во внешнем двеллинге. У меня - самая первая версия SW, ещё без защиты. Поэтому легко находим адрес в базе данных IDA и анализируем код, выполняющийся до этого, что и приводит к решению. Специально посмотрел DOS-овские версии PoL. В них присутствует защита, поэтому сначала нужно получить дамп инструкций в окрестности адреса, по которому случился останов, командой memdumpbin, затем дизассеблировать полученный дамп в IDA и проанализировать его. Чем грамотнее мы выберем брейкпоинт, тем легче будет найти инструкцию. В нашем случае нужная инструкция, которая загружает оффсет таблицы c ID монстров в регистр, находится очень быстро.


Как то не очень получается :smile22:

Сейчас все сделал по вашей инструкции

Выставил героя в одном ходе от хижинки. Сделал первый дамп, герой Ambrose, слово Ambrose нашел в дампе в Блоке 1433A0-1433A6 Сделал переход на 96 (dec) к текущему смещению оказался в 143400, Addr = 143400.
Установил BP на Addr: bplm 143400

Зашел в хижинку. Игра остановилась переключился в Debuger
Сделал второй дамр: memdumpbin ds:0 1000000

Открыл второй дамп в IDA. Она чето спросила про 16 бит или 32 бита.
Выбрал 16 бит. IDA дамп открыла

Перешел к адресу 143400 где брейкпойнт поставил

А там вот что :smile8:

Код: Выделить всё
seg000:1433FB                 db    0
seg000:1433FC                 db    1
seg000:1433FD                 db 0FFh
seg000:1433FE                 db 0FFh
seg000:1433FF                 db 0FFh
seg000:143400                 db  51h ; Q
seg000:143401                 db    0
seg000:143402                 db    5
seg000:143403                 db    0


На команды не похоже хотя в окошке Hex View-A вроде все правильно и Ambrose рядом там

И что делать? :smile24:
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5540
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2155 раз.

Re: Heroes2 - вставляем свои аватары

Сообщение AlexSpl » 10 авг 2015, 19:38

Для решения нашей задачи нам будет достаточно лишь кусочка распакованного кода в окрестности той инструкции, которая вызвала останов.

У меня теперь версия PoL 2.0. Инструкция, следующая за той, при выполнении которой случился останов: 0180:229E94 | mov eax, [ebp-3Ch]. Сделаем дамп кода в её окрестности: memdumpbin cs:220000 20000 (размер дампа выбран с запасом, но нам будут важны лишь ближайшие инструкции). Теперь загружаем полученный дамп в IDA (Various Files -> Binary/Raw File, процессор: metapc, код 32-битный). Затем ищем в дампе нашу команду (mov eax, [ebp-3Ch]): 8B 45 C4 66 83 60 04 07 (взял машинные коды двух первых инструкций, отображаемых в окне DOSBox Debugger, чтобы наверняка).

Если всё сделано правильно, то в окне IDA Вы увидите:

Код: Выделить всё
mov     eax, [ebp+var_3C]
and     word ptr [eax+4], 7

Теперь поднимаемся выше по коду и видим там следующие инструкции:

Код: Выделить всё
mov     ecx, 0Ah          ; кол-во элементов
lea     edi, [ebp+var_30] ; приёмник
mov     esi, 2C9308h      ; источник
rep movsd

Почему именно эти? Это и называется анализ :) В действительности необходимо посмотреть весь код по пути вверх и сделать выводы.

Теперь набираем в окне DOSBox Debugger: d ds:2C9308 и любуемся табличкой :)

 
Оказывается, указанные выше инструкции присутствуют (!) в экзешнике PoL, т.е. файл, получается, никак не запакован и не защищён. IDA почему-то не может найти точку входа (Entry Point) и дизассемблирует только заглушку DOS :smile5: Отсюда имеем сообщение "The input file has extra information at the end" и 16-разрядный код заглушки (DOS stub) на выходе. Возможно, баг IDA.
Последний раз редактировалось AlexSpl 11 авг 2015, 01:55, всего редактировалось 1 раз.
Вернуться к началу

offlineАватара пользователя
t800  
Ветеран
Ветеран
 
Сообщения: 982
Зарегистрирован: 22 июл 2015, 11:36
Пол: Не указан
Награды: 4
Наградной знак (1) Деревянный Щит (1) Золотой Меч (1) Серебряные Сапоги (1)
Поблагодарили: 191 раз.

Re: Heroes2 - вставляем свои аватары

Сообщение t800 » 11 авг 2015, 05:58

Открыл вчерашний сайв с Амброзом опять сделал дамп.
Отрыл в Нех и опять слово Ambrose нашел в дампе в Блоке 1433A0-1433A6 :smile5:

Сделал переход на 96 (dec) к текущему смещению и опять оказался в 143400
Addr = 143400, Установил BP на Addr: bplm 143400

Зашел в хижинку. Игра остановилась переключился в Debuger на командах

Код: Выделить всё
0180:22B110 8B45C4     mov eax,[ebp-003C]
0180:22B113 6683600407     and dword [eax+0004],0007


Сделал дамр: memdumpbin cs:220000 20000

Открыл в IDA. Стал иcкать строчку

8B 45 C4 66 83 60 04 07

Оказался в строчке c командами

Код: Выделить всё
seg000:0000B110                 mov     eax, [ebp-3Ch]
seg000:0000B113                 and     word ptr [eax+4], 7


Промотал наверх

Так у меня вот так

Цитата:
seg000:0000B093 ; ---------------------------------------------------------------------------
seg000:0000B093
seg000:0000B093 loc_B093: ; CODE XREF: seg000:0000B07Cj
seg000:0000B093 mov ecx, 0Ah
seg000:0000B098 lea edi, [ebp-30h]
seg000:0000B09B mov esi, 2CC208h
seg000:0000B0A0 rep movsd

seg000:0000B0A2 push 0FFFFFFFFh
seg000:0000B0A4 push 0
seg000:0000B0A6 push 0FFFFFFFFh
seg000:0000B0A8 push 0
seg000:0000B0AA push 0FFFFFFFFh
seg000:0000B0AC lea edx, [eax+17h]
seg000:0000B0AF mov ecx, 2AC629h
seg000:0000B0B4 mov ebx, 2
seg000:0000B0B9 mov eax, [ebp-34h]
seg000:0000B0BC call sub_A72D
seg000:0000B0C1 mov eax, ds:2DED70h
seg000:0000B0C6 cmp dword ptr [eax+5Ah], 7805h
seg000:0000B0CD jnz loc_9F95
seg000:0000B0D3 mov ebx, [ebp-8]
seg000:0000B0D6 shl ebx, 2
seg000:0000B0D9 mov edx, [ebx+ebp-30h]
seg000:0000B0DD mov esi, [ebp-38h]
seg000:0000B0E0 add esi, 65h ; 'e'
seg000:0000B0E3 mov eax, esi
seg000:0000B0E5 call sub_1520E
seg000:0000B0EA test eax, eax
seg000:0000B0EC jz short loc_B11D
seg000:0000B0EE mov eax, [ebp-3Ch]
seg000:0000B0F1 mov ax, [eax+4]
seg000:0000B0F5 shr ax, 3
seg000:0000B0F9 and eax, 0FFFFh
seg000:0000B0FE mov edx, [ebx+ebp-30h]
seg000:0000B102 mov ecx, 0FFFFFFFFh
seg000:0000B107 mov ebx, eax
seg000:0000B109 mov eax, esi
seg000:0000B10B call sub_1526A
seg000:0000B110 mov eax, [ebp-3Ch]
seg000:0000B113 and word ptr [eax+4], 7

seg000:0000B118 jmp loc_9F95
seg000:0000B11D ; ---------------------------------------------------------------------------


В точности как у вас не нашел


Код: Выделить всё
mov     ecx, 0Ah          ; кол-во элементов
lea     edi, [ebp+var_30] ; приёмник
mov     esi, 2C9308h      ; источник
rep movsd


Нашел похожее но с другими буквами

Код: Выделить всё
seg000:0000B093                 mov     ecx, 0Ah
seg000:0000B098                 lea     edi, [ebp-30h]
seg000:0000B09B                 mov     esi, 2CC208h
seg000:0000B0A0                 rep movsd


На всякий случай написал в DosBox Debuger d ds:2CC208

И попал в ту самую последовательность :smile21:

01 00 00 00 0B 00 00 00 00 00 00 00 15 00 00 00 15 00 00 00 14 00 00 00 26 00 00 00 0C 00 00 00 1D 00 00 00 2F 00 00 00

Изображение

А как вы узнали что это таблица и что она что-то меняет? :smile5:
Последний раз редактировалось t800 11 авг 2015, 07:40, всего редактировалось 1 раз.
Вернуться к началу

offlineАватара пользователя
t800  
Ветеран
Ветеран
 
Сообщения: 982
Зарегистрирован: 22 июл 2015, 11:36
Пол: Не указан
Награды: 4
Наградной знак (1) Деревянный Щит (1) Золотой Меч (1) Серебряные Сапоги (1)
Поблагодарили: 191 раз.

Re: Heroes2 - вставляем свои аватары

Сообщение t800 » 11 авг 2015, 06:37

И почему у вас

Код: Выделить всё
lea     edi, [ebp+var_30] ; приёмник



А у меня какой то :smile24:

Код: Выделить всё
lea edi, [ebp-30h]
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5540
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2155 раз.

Re: Heroes2 - вставляем свои аватары

Сообщение AlexSpl » 11 авг 2015, 09:58

Цитата:
И почему у вас

Это одно и то же (одна и та же инструкция). Просто для Вашего экзешника нужно было сделать дамп немного другого диапазона адресов. У меня получилось так, что начало процедуры попало в дамп, и IDA назначила символьные имена переменным, а у Вас начало дампа, наверное, оказалось внутри аналогичной процедуры. Но в данном случае это роли не играет.
Вернуться к началу

offlineАватара пользователя
t800  
Ветеран
Ветеран
 
Сообщения: 982
Зарегистрирован: 22 июл 2015, 11:36
Пол: Не указан
Награды: 4
Наградной знак (1) Деревянный Щит (1) Золотой Меч (1) Серебряные Сапоги (1)
Поблагодарили: 191 раз.

Re: Heroes2 - вставляем свои аватары

Сообщение t800 » 11 авг 2015, 10:16

А все таки интересно, а как вы поняли по командам

Код: Выделить всё
seg000:0000B093 ; ---------------------------------------------------------------------------
seg000:0000B093
seg000:0000B093 loc_B093: ; CODE XREF: seg000:0000B07Cj
seg000:0000B093 mov ecx, 0Ah
seg000:0000B098 lea edi, [ebp-30h]
seg000:0000B09B mov esi, 2CC208h
seg000:0000B0A0 rep movsd
seg000:0000B0A2 push 0FFFFFFFFh
seg000:0000B0A4 push 0
seg000:0000B0A6 push 0FFFFFFFFh
seg000:0000B0A8 push 0
seg000:0000B0AA push 0FFFFFFFFh
seg000:0000B0AC lea edx, [eax+17h]
seg000:0000B0AF mov ecx, 2AC629h
seg000:0000B0B4 mov ebx, 2
seg000:0000B0B9 mov eax, [ebp-34h]
seg000:0000B0BC call sub_A72D
seg000:0000B0C1 mov eax, ds:2DED70h
seg000:0000B0C6 cmp dword ptr [eax+5Ah], 7805h
seg000:0000B0CD jnz loc_9F95
seg000:0000B0D3 mov ebx, [ebp-8]
seg000:0000B0D6 shl ebx, 2
seg000:0000B0D9 mov edx, [ebx+ebp-30h]
seg000:0000B0DD mov esi, [ebp-38h]
seg000:0000B0E0 add esi, 65h ; 'e'
seg000:0000B0E3 mov eax, esi
seg000:0000B0E5 call sub_1520E
seg000:0000B0EA test eax, eax
seg000:0000B0EC jz short loc_B11D
seg000:0000B0EE mov eax, [ebp-3Ch]
seg000:0000B0F1 mov ax, [eax+4]
seg000:0000B0F5 shr ax, 3
seg000:0000B0F9 and eax, 0FFFFh
seg000:0000B0FE mov edx, [ebx+ebp-30h]
seg000:0000B102 mov ecx, 0FFFFFFFFh
seg000:0000B107 mov ebx, eax
seg000:0000B109 mov eax, esi
seg000:0000B10B call sub_1526A
seg000:0000B110 mov eax, [ebp-3Ch]
seg000:0000B113 and word ptr [eax+4], 7
seg000:0000B118 jmp loc_9F95


что игра берет номер крестьян из таблицы что лежит на 2CC208h :smile5:
Или вы заранее это знали? И просто искали ее адрес?

Просто я хочу сам попробовать что-нибудь еще в Heroes2.exe поменять например скорость крестьян :smile20: но не скажу что понял как это делать. Дампы делать вроде научился и значения искать и изменять в редакторе но почему надо менять именно это значение а не какое то другое честно не понял :smile24:
Вернуться к началу

Пред.След.

Вернуться в Техническая часть

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5