Цитата:
Всё-таки обнанул. Image Base присутствует. Значит, речь идёт о памяти. Наверное, только в read-only секции нельзя напрямую писать.
Объявления |
---|
Друзья, если не получается зарегистрироваться, напишите на почту vdv_forever@bk.ru. Я оторву свою задницу от всех дел и обязательно Вас активирую! Добро пожаловать на геройский форум! |
Re: Как создать плагин для HD модаДа, писать *(int*)address = value; можно только в хуках. Тогда будет работать. Имею в виду writeable секции, с read-only тоже не прокатит, скорее всего. Нужно будет попробовать.
Цитата: Всё-таки обнанул. Image Base присутствует. Значит, речь идёт о памяти. Наверное, только в read-only секции нельзя напрямую писать. |
Re: Как создать плагин для HD модаА вот возвращаясь у хукам, куда контекст передается...
Откуда вы вообще знаете, в каком регистре что имеется ? Как ориентируетесь ? Откуда взяли, что к 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; } |
Re: Как создать плагин для HD модаА здесь почему-то, наоборот, вычитаем из 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; // иначе стандартный множитель } |
Re: Как создать плагин для HD модаВыглядит, как магия
Потому и интересно этим заниматься, в том числе... |
Re: Как создать плагин для HD модаЕсли кратко, хук (LoHook) ставится на адрес в памяти. И вместо инструкции, которая находится по этому адресу, выполняется код хука. Неизменённый ("родной") контекст - это состояние (значения) регистров до выполнения первой инструкции (команды) хука. В хуке с контекстом (регистрами) можно делать почти всё что угодно. Подробней на примерах позже объясню.
|
Re: Как создать плагин для HD мода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 байта) |
Re: Как создать плагин для HD модаДа, это аргументы, передаваемые функции через стек. В IDA они, а также локальные переменные в стеке перечислены сразу после сигнатуры функции.
|
Re: Как создать плагин для HD мода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 несколько чисел загрузить ? (например, несколько четверок) |
Re: Как создать плагин для HD модаОдно число dword с индексом eax из таблицы по адресу 63EAA8h.
Это выбор из таблицы (массива) эффекта заклинания. Edit: Извиняюсь, уровень существа, конечно, в качестве индекса выступает |
Re: Как создать плагин для HD мода*(double*)c->esp = *(double*)(c->ebp - 8) * multiplier;
А тут c->ebp - 8 - это у нас уровень героя ? В начале процедуры у ИДА подсказка heroLevel = dword ptr 0Ch Может, нам брать c->ebp + 0Сh ? Провокационные вопросы, но по другому не знаю, как въехать побыстрее |
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10