Объявления

Форум о Героях Меча и Магии и King's Bounty. Если Вы любите эти игры, мы будем рады видеть Вас в наших рядах. :smile2:
Для активации Вашей учетной записи необходимо написать письмо на почтовый ящик dumai-spb@mail.ru или vdv_forever@bk.ru с указанием зарегистрированного Вами ника

Как создать плагин для HD мода

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineАватара пользователя
AlexSpl
Эксперт
Эксперт
 
Сообщения: 3001
Зарегистрирован: 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)
Поблагодарили: 1363 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 05 авг 2017, 15:14

Да, писать *(int*)address = value; можно только в хуках. Тогда будет работать. Имею в виду writeable секции, с read-only тоже не прокатит, скорее всего. Нужно будет попробовать.

Цитата:
Там речь идёт о патче исполняемого файла на диске вручную.

Всё-таки обнанул. Image Base присутствует. Значит, речь идёт о памяти. Наверное, только в read-only секции нельзя напрямую писать.
Вернуться к началу

offlineBen80
Мастер
Мастер
 
Сообщения: 453
Зарегистрирован: 18 июн 2017, 06:49
Поблагодарили: 74 раз.

Re: Как создать плагин для HD мода

Сообщение Ben80 » 05 авг 2017, 15:44

А вот возвращаясь у хукам, куда контекст передается...
Откуда вы вообще знаете, в каком регистре что имеется ? Как ориентируетесь ?
Откуда взяли, что к ebp нужно именно 8 добавить ? Что эффект в EAX нужно поместить...

Пример:
int __stdcall spellSpecBonus(LoHook* h, HookContext* c)
{
switch ( *(int*)(c->ebp + 8) ) {
case 43:
case 44:
c->eax = 4;
break;

case 46:
c->eax = 3;
break;

default:
return EXEC_DEFAULT;
}

c->return_address = 0x4E62B3;
return NO_EXEC_DEFAULT;
}
Вернуться к началу

offlineBen80
Мастер
Мастер
 
Сообщения: 453
Зарегистрирован: 18 июн 2017, 06:49
Поблагодарили: 74 раз.

Re: Как создать плагин для HD мода

Сообщение Ben80 » 05 авг 2017, 15:46

А здесь почему-то, наоборот, вычитаем из ebp 8 в одной из строк...

int __stdcall applyMultiplier(LoHook* h, HookContext* c)
{
const double multiplier = 0.07;

if ( *(int*)(c->ebp + 8) == 20 ) { // Frost Ring?
*(double*)c->esp = *(double*)(c->ebp - 8) * multiplier;

c->return_address = 0x4E6326;
return NO_EXEC_DEFAULT;
}

return EXEC_DEFAULT; // иначе стандартный множитель
}
Вернуться к началу

offlineBen80
Мастер
Мастер
 
Сообщения: 453
Зарегистрирован: 18 июн 2017, 06:49
Поблагодарили: 74 раз.

Re: Как создать плагин для HD мода

Сообщение Ben80 » 05 авг 2017, 15:47

Выглядит, как магия :smile1:
Потому и интересно этим заниматься, в том числе...
Вернуться к началу

offlineАватара пользователя
AlexSpl
Эксперт
Эксперт
 
Сообщения: 3001
Зарегистрирован: 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)
Поблагодарили: 1363 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 05 авг 2017, 15:55

Если кратко, хук (LoHook) ставится на адрес в памяти. И вместо инструкции, которая находится по этому адресу, выполняется код хука. Неизменённый ("родной") контекст - это состояние (значения) регистров до выполнения первой инструкции (команды) хука. В хуке с контекстом (регистрами) можно делать почти всё что угодно. Подробней на примерах позже объясню.
Вернуться к началу

offlineBen80
Мастер
Мастер
 
Сообщения: 453
Зарегистрирован: 18 июн 2017, 06:49
Поблагодарили: 74 раз.

Re: Как создать плагин для HD мода

Сообщение Ben80 » 05 авг 2017, 16:50

switch ( *(int*)(c->ebp + 8) ) {

А, кажется понял, почему вы берете EBP+8, наверно, исходя из объявления процедуры:
int __thiscall HeroSpellSpecialityEffect(_Hero_ *this, int spell, int heroLevel, signed int effect)

ESP после вызова процедуры указывает на effect.
В начале процедуры ESP было скопировано в EBP.
EBP+4 - это будет heroLevel
EBP+8 - номер спелла

(поскольку инты занимают по 4 байта)
Вернуться к началу

offlineАватара пользователя
AlexSpl
Эксперт
Эксперт
 
Сообщения: 3001
Зарегистрирован: 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)
Поблагодарили: 1363 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 05 авг 2017, 17:00

Да, это аргументы, передаваемые функции через стек. В IDA они, а также локальные переменные в стеке перечислены сразу после сигнатуры функции.
Вернуться к началу

offlineBen80
Мастер
Мастер
 
Сообщения: 453
Зарегистрирован: 18 июн 2017, 06:49
Поблагодарили: 74 раз.

Re: Как создать плагин для HD мода

Сообщение Ben80 » 05 авг 2017, 17:01

004E62AC mov eax, ds:dword_0063EAA8[eax*4]

А здесь мы загружаем в EAX из dword_0063EAA8[eax*4] несколько целых чисел или одно ?
Если несколько, то, может быть это не совсем правильно ? -

"
switch ( *(int*)(c->ebp + 8) ) {
case 43:
case 44:
c->eax = 4;
break;
"

Может, и нам в хуке нужно в EAX несколько чисел загрузить ? (например, несколько четверок)
Вернуться к началу

offlineАватара пользователя
AlexSpl
Эксперт
Эксперт
 
Сообщения: 3001
Зарегистрирован: 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)
Поблагодарили: 1363 раз.

Re: Как создать плагин для HD мода

Сообщение AlexSpl » 05 авг 2017, 17:04

Одно число dword с индексом eax из таблицы по адресу 63EAA8h.

Это выбор из таблицы (массива) эффекта заклинания. ID закла выступает в качестве индекса.

Edit: Извиняюсь, уровень существа, конечно, в качестве индекса выступает :smile14:
Вернуться к началу

offlineBen80
Мастер
Мастер
 
Сообщения: 453
Зарегистрирован: 18 июн 2017, 06:49
Поблагодарили: 74 раз.

Re: Как создать плагин для HD мода

Сообщение Ben80 » 05 авг 2017, 17:16

*(double*)c->esp = *(double*)(c->ebp - 8) * multiplier;

А тут c->ebp - 8 - это у нас уровень героя ?
В начале процедуры у ИДА подсказка
heroLevel = dword ptr 0Ch

Может, нам брать c->ebp + 0Сh
?

Провокационные вопросы, но по другому не знаю, как въехать побыстрее :smile1:
Вернуться к началу

Пред.След.

Вернуться в Общий раздел

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

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