Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

DF2 :: ФОРУМЫ _ Heroes II _ Редактирование кода игры

Автор: t800 18 Mar 2016, 12:25

Предлагаю писать сюда инструкции по редактированию кода игры Heroes of Might and Magic II


Для почина!

Чтобы при посадке-высадке на(из) корабля, не обнулялся ход для Версии HMM2 от Буки
Надо заменить следующие байты по указанным адресам.

Код
Посадка героя игрока-человека:
3C9BD: 90 90 90 90 90 90 90
Высадка героя игрока-человека:
3C85E: 90 90 90 90 90 90 90

Посадка героя AI:
44F3D: 90 90 90 90 90 90 90
Высадка героя AI:
44E58: 90 90 90 90 90 90 90

Автор: hippocamus 20 Mar 2016, 00:37

Ну, nop'ами позабивать - это, конечно, супер!
Уж лучше тогда открыть тему вроде "Инженерного анализа", как в 3-ке - и там просто писать адреса функций.

Автор: t800 20 Mar 2016, 08:25

Цитата(hippocamus @ 20 Mar 2016, 03:37) *
Ну, nop'ами позабивать - это, конечно, супер!
Уж лучше тогда открыть тему вроде "Инженерного анализа", как в 3-ке - и там просто писать адреса функций.



Можно и адреса! Если знаешь какие можешь сюда написать!

От себя могу добавить следующее:

Вербовка кабанов на карте приключенний вместо крестьян (Для Версии HMM2 от Буки)


Код
По адресу 43EDB замените машинную команду C7 45 DC 00 00 00 00 на C7 45 DC 27 00 00 00


И тогда вместо крестьян будут присоединяться кабаны







Разумеется, придётся исправить все тексты, чтобы они соответствовали тому факту, что к армии героя присоединяются не крестьяне, а кабаны!

Автор: t800 21 Mar 2016, 16:30

Цитата(hippocamus @ 20 Mar 2016, 03:37) *
Уж лучше тогда открыть тему вроде "Инженерного анализа", как в 3-ке - и там просто писать адреса функций.


Кстати вот скопировал сейчас из IDA http://wiki.kvkozyrev.org/_media/list.zip

Думаете это много кому поможет? Я думаю так что людям нужна понятная инструкция! Открыть там то и сделать так то! Вот!
Думаете людям нужные адреса функций с их описаниями? Ну вот у человека положим есть адреса с именами функций! Потому что их
кто-нибудь выложил (см. выше) ни и как ему поменять хижину гоблинов на башенку фениксов на карте приключений?

Автор: feanor 21 Mar 2016, 17:25

Эхехе, проблема с двойкой в том, что у людей разные сильно разные экзешники же. У кого-то голд, у кого-то бука, кто-то вообще на досовской версии играе.

Цитата
Думаете это много кому поможет?

Это - нет, потому что нужны как минимум адреса. Имена сами по себе любопытны, но практически бесполезны.
Впрочем, https://dl.dropbox.com/u/61759222/HoMM/Heroes2W.c - увы, это 2.0, для 2.1 надо делать что-то типа поиска по сигнатурам

Цитата
Я думаю так что людям нужна понятная инструкция! Открыть там то и сделать так то! Вот!
Думаете людям нужные адреса функций с их описаниями?
Да-да, а "сделать так-то" берется из воздуха.

Автор: t800 21 Mar 2016, 18:06

Цитата(feanor @ 21 Mar 2016, 20:25) *
Цитата
Думаете это много кому поможет?

Это - нет, потому что нужны как минимум адреса.


Ну вобще то я список с адресами выложил

Цитата
hero::AddSpell(int,int) 0046CA8B
hero::ApplyBattleLossTemps(void) 0046D821
hero::ApplyBattleWinTemps(void) 0046D5CD
hero::CalcMobility(void) 0046C526
hero::CheckAnduranPieces(int) 00470779
hero::CheckLevel(void) 0046D83F
hero::CreatureTypeCount(int) 00470404
hero::Deallocate(int) 0046CEE8
hero::Dismiss(void) 0046CE8B
hero::DoSSLevelDialog(int,int) 00470685
hero::GetArmyStrengths(ulong * const) 0046C4B5
hero::GetExperience(int) 0046D46F
hero::GetLevel(int) 0046D50D
hero::GetNthSS(int) 004704CC
hero::GetNthSpell(int,int) 0046C86C
hero::GetNumSpells(int) 0046C931
hero::GetOccupiedTown(void) 0047052A
hero::GetSSLevel(int) 004705C2
hero::GiveSS(int,int) 00470345
hero::HasArtifact(int) 0046C4CD
hero::HasSpell(int) 0046C79D
hero::HeroScreenUpdate(void) 0046CB33
hero::NumArtifacts(void) 0046E067
hero::Read(int,signed char) 0046C40F
hero::SetSS(int,int) 004701E1
hero::Stats(int) 0047057B
hero::TakeSS(int,int) 0047024B
hero::UpdateArmies(void) 0046CBDB
hero::UpgradeCreatures(int,int) 0047046E
hero::UseSpell(int) 0046CA01
hero::ViewArtifact(int,int,int) 0046CDF0
hero::ViewStat(int,int) 0046CDAD
hero::Write(int,signed char) 0046C462
hero::hero(void) 0046C3A0

и т.д.


Но ни адреса ни имена фукций не дают ответа ни как изменить хижину гоблинов на хижинку фениксов
и понятной инструкции как это сделать. Вот!

Цитата
Имена сами по себе любопытны, но практически бесполезны.
Впрочем, https://dl.dropbox.com/u/61759222/HoMM/Heroes2W.c - увы, это 2.0, для 2.1 надо делать что-то типа поиска по сигнатурам


По сигнатурам это вы говорите сделать для 2.0 а потом искать такие же байты в 2.1?


Автор: t800 21 Mar 2016, 21:03

Цитата(t800 @ 21 Mar 2016, 21:06) *
Но ни адреса ни имена фукций не дают ответа ни как изменить хижину гоблинов на хижинку фениксов
и понятной инструкции как это сделать. Вот!


ЗЫ вобще я знаю как это сделать (чтоб были фениксы вместо гоблинов) и уже сделал



Но если бы мне не показали как это делать я бы ничего не сделал! Вот!

ЗЗЫ А когда покажут оно всегда просто поэтому для того и тема чтобы если кто что знает мог показать. Например я знаю что-нибудь. Например как редактировать вербовку на карте приключений или про чтоб IDA при запуске не ругалась надо клавитуру переключить на английский язык, а кто-то знает про что то другое и пусть тоже пишет здесь в теме. Для этого и тема. Вот!

Автор: nosferatu 21 Mar 2016, 22:09

Цитата(t800 @ 21 Mar 2016, 21:03) *
Цитата(t800 @ 21 Mar 2016, 21:06) *
Но ни адреса ни имена фукций не дают ответа ни как изменить хижину гоблинов на хижинку фениксов
и понятной инструкции как это сделать, например.


ЗЫ Вообще, я знаю как это сделать (чтобы были фениксы вместо гоблинов) и уже сделал.

Но если бы мне не показали, как это делать я бы ничего не сделал, например!

ЗЗЫ А когда покажут, оно всегда просто, поэтому для того и тема чтобы, если кто что знает, мог показать. Например, я знаю что-нибудь. Например, как редактировать вербовку на карте приключений или про чтоб IDA при запуске не ругалась, надо клавитуру переключить на английский язык, а кто-то знает про что-то другое и пусть тоже пишет здесь в теме. Для этого и тема, например.

Так куда забавнее. spider.gif
А вообще, молодец, что пытаешься в этом разобраться.

Автор: AlexSpl 21 Mar 2016, 23:02

Цитата
Кстати вот скопировал сейчас из IDA список всех функциий с адресами

Думаете это много кому поможет?

Поможет, конечно. Экзешник с сигнатурами оригинальных функций и переменных - это как манна небесная для реверсера. Уже давно таким владею и перенёс все сигнатуры в базу для русской версии игры (2.1). Если бы у команды HotA такой был, всё бы делалось на порядок быстрее. А может он есть, но если есть, то я не в курсе.

Кстати, если скачать скрипты для IDA от Atli Gudmundsson'а (pe_sections.idc и pe_write.idc) и прописать DISPLAY_PATCH_SUBMENU = YES в конфиге idagui.cfg, то можно патчить прямо в IDA (можно сразу на ассемблере писать код) и на выходе получать работающий экзешник.

Автор: t800 23 Mar 2016, 09:30

Цитата(AlexSpl @ 22 Mar 2016, 02:02) *
Цитата
Кстати вот скопировал сейчас из IDA список всех функциий с адресами

Думаете это много кому поможет?

Поможет, конечно. Экзешник с сигнатурами оригинальных функций и переменных - это как манна небесная для реверсера. Уже давно таким владею и перенёс все сигнатуры в базу для русской версии игры (2.1). Если бы у команды HotA такой был, всё бы делалось на порядок быстрее. А может он есть, но если есть, то я не в курсе.

Кстати, если скачать скрипты для IDA от Atli Gudmundsson'а (pe_sections.idc и pe_write.idc) и прописать DISPLAY_PATCH_SUBMENU = YES в конфиге idagui.cfg, то можно патчить прямо в IDA (можно сразу на ассемблере писать код) и на выходе получать работающий экзешник.


Скрипты от Atli Gudmundsson'а я поставил, хотя у меня какой то глюк с IDA-вским дебагером никак не могу
совладать толи он глючит толи я что-то не понимаю (с dosbox-вским дебагером как то проще - поставил BP
игру выкинуло в дебагер - нажал продолжить игра пошла дальше) а тут толи глюк толи я что-то не понимаю

Я решил убрать рекламаную заставку, потому что она меня злит! И отнимает время при запуске игры.
Я сделал посик по слову intro нашел в коде функции где оно есть. Поставил там BP запустил игру чтобы проверить там ли я поставил BP или нет. Игра остановилась, выкинула в IDA на BP но сделать так чтоб она продолжилась у меня почему то не получилось. Я нажал продолжить, а игра как стояла так и стоит, пришлось убить. См. на видео



Это у меня глюк или я что-то не так делаю?

Автор: AlexSpl 23 Mar 2016, 20:55

1. Переключитесь в оконный режим (наверняка Вы не видите сообщение об исключении)
2. Взаимодействуйте с игрой (возможно Вам требуется пропустить заставку и т.п.)
3. Если нет острой необходимости выбирайте Attach to process... вместо Start Process
4. Options -> Demangled names... -> Names

Цитата
Ну, nop'ами позабивать - это, конечно, супер!

А чем ещё забивать? smile.gif jmp $+2? jmp $+5? Мы ведь не гонимся за скоростью? А по-хорошему в таких случаях нужно делать так:
Код
Length Assembly Byte Sequence
2 bytes 66 NOP 66 90H
3 bytes NOP DWORD ptr [EAX] 0F 1F 00H
4 bytes NOP DWORD ptr [EAX + 00H] 0F 1F 40 00H
5 bytes NOP DWORD ptr [EAX + EAX*1 + 00H] 0F 1F 44 00 00H
6 bytes 66 NOP DWORD ptr [EAX + EAX*1 + 00H] 66 0F 1F 44 00 00H
7 bytes NOP DWORD ptr [EAX + 00000000H] 0F 1F 80 00 00 00 00H
8 bytes NOP DWORD ptr [EAX + EAX*1 + 00000000H] 0F 1F 84 00 00 00 00 00H
9 bytes 66 NOP DWORD ptr [EAX + EAX*1 + 00000000H] 66 0F 1F 84 00 00 00 00 00H

Автор: t800 24 Mar 2016, 08:18

Цитата(AlexSpl @ 23 Mar 2016, 23:55) *
1. Переключитесь в оконный режим (наверняка Вы не видите сообщение об исключении)
2. Взаимодействуйте с игрой (возможно Вам требуется пропустить заставку и т.п.)


Точно! Это был глюк связанный запуском Heroes2.exe с полноэкранным режимом и XP в Virtualbox!
и если запускать Heroe2.exe с ключом /F4 в оконном режиме такого глюка нет.

Но все равно у меня никак не получается победить IDA-вский дебагер
У дебагера есть кнопки Pause Process и Continue я в нужном мне месте игры нажал
"Pause Process" игра остановилась но когда захотел глянуть в каком мест кода
она остановилась IDA меня выкинула в непонятное окошко с надписью IDA-view EIP
А строчку где я остановился в окошке где код так и не подчеркнула



Так как мне попасть в нужную мне функицю в коде при выполнении которой
я сделал онстановку программы когда нажимаю Pause Process ? Или так просто мне туда не попасть?

Автор: t800 24 Mar 2016, 11:52

Цитата(AlexSpl @ 22 Mar 2016, 02:02) *
Кстати, если скачать скрипты для IDA от Atli Gudmundsson'а (pe_sections.idc и pe_write.idc) и прописать DISPLAY_PATCH_SUBMENU = YES в конфиге idagui.cfg, то можно патчить прямо в IDA (можно сразу на ассемблере писать код) и на выходе получать работающий экзешник.



Кстати что-то не патчит у меня IDA. Вроде и скрипты поставил и меню Patch показывает и байты меняются, но почему то только в базе! а когда запускаю дебагер говорит что мол файл мол отличается от пропатченной базы и просто запускает оригинальный экзешник.

ЗЫ А когда кликаю меню Edit ->Patch program->Assеmble пишет: Command "Assemble" failed

Автор: AlexSpl 24 Mar 2016, 17:07

Цитата
Кстати что-то не патчит у меня IDA. Вроде и скрипты поставил и меню Patch показывает и байты меняются, но почему то только в базе! а когда запускаю дебагер говорит что мол файл мол отличается от пропатченной базы и просто запускает оригинальный экзешник.

Естественно, только в базе. Пока вы не запустите pe_write.idc.

Цитата
ЗЫ А когда кликаю меню Edit ->Patch program->Assеmble пишет: Command "Assemble" failed

А какую команду Вы пишете и куда?

Автор: t800 24 Mar 2016, 18:21

Цитата(AlexSpl @ 24 Mar 2016, 20:07) *
Цитата
Кстати что-то не патчит у меня IDA. Вроде и скрипты поставил и меню Patch показывает и байты меняются, но почему то только в базе! а когда запускаю дебагер говорит что мол файл мол отличается от пропатченной базы и просто запускает оригинальный экзешник.

Естественно, только в базе. Пока вы не запустите pe_write.idc.


Наверное он у меня плохо работал потому что почему то не патчил и кроме Assemble других пунктов в меню не показывал, поэтому я разозлислся на эту IDA 5.0 (у ней еще справка не работала) и сейчас поставил IDA 6.8 и у ней под Assemble появился пункт меню "Apply patches to input file" и она вроде что-то стала патчить

Цитата
Цитата
ЗЫ А когда кликаю меню Edit ->Patch program->Assеmble пишет: Command "Assemble" failed

А какую команду Вы пишете и куда?


Я поставил курсор на функцию где нашел слово INTRO и решил вместо всех команд что там были поставить команду NOP (сначала я просто пытался функцию удалить но это не получалось) счас но изменить функию на NOP вроде бы получилось и даже EXE-ник перезаписался, но правда при запуске игры заругался что что-то там ему стало плохо,



Но хотя бы вроде команды поменяла! Осталось только разобратьс какие точно команды в функции NOP-ми надо забивать чтобы игра не рушилась а просто пропускала заставку. А то я ее полностью NOP-ами забил, и даже случайно штуп десять лишних написал, наверное потому игра и не смогла запустится.

Форум Invision Power Board (http://nulled.cc)
© Invision Power Services (http://nulled.cc)