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


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

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

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1318
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

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

Сообщение Ben80 » 23 янв 2019, 16:38

AlexSpl писал(а):

Интересно, а можно ли из своего плагина менять другой плагин вообще? Как-то не приходилось сталкиваться.


Мне приходилось только применять Undo на хуки либо WriteHexCode (или Patch, не помню точно) - когда Undo почему-то не проходило (вроде, это была еще 3+ версия HD мода с некоторыми fixed патчами). В современных версиях HD мода Undo, наверно, должно всегда получаться.
А по поводу патчинга плагинов - сомневаюсь, ведь у Dll кода адреса в памяти могут меняться от запуска к запуску ? Или нет ?
Вернуться к началу

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

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

Сообщение AlexSpl » 23 янв 2019, 16:41

Цитата:
А по поводу патчинга плагинов - сомневаюсь, ведь у Dll кода адреса в памяти могут меняться от запуска к запуску ? Или нет ?

Да. Но адрес получить можно, если dll уже загружена в память. Будет ли работать такой патч, даже если мы правильно укажем адрес во WriteByte(), например?
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1318
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

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

Сообщение Ben80 » 23 янв 2019, 16:55

Проблема еще и в изменении адресов при обновлении HD мода.
Вернуться к началу

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

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

Сообщение AlexSpl » 23 янв 2019, 17:39

Потестил. HW_SOD.dll загружается после пользовательских плагинов. Хендл = 0, что означает, что библиотека не загружена (тут хук, который выводит окошко с адресом, на начало нового дня).

Код: Выделить всё
#define _CRT_SECURE_NO_WARNINGS
#include "HotA\homm3.h"

Patcher* _P;
PatcherInstance* _PI;
static _bool_ plugin_On = 0;

HMODULE hHW_SOD;

int __stdcall showAddress(LoHook* h, HookContext* c)
{
    sprintf(o_TextBuffer, "HW_SOD.dll is loaded at %08X", (int)hHW_SOD);
    CALL_12(void, __fastcall, 0x4F6C00, o_TextBuffer, 1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0);

    return EXEC_DEFAULT;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    if ( DLL_PROCESS_ATTACH == ul_reason_for_call )
    {
        if ( !plugin_On )
        {
            plugin_On = 1;
            _P = GetPatcher();
            _PI = _P->CreateInstance("HD.Plugin.TestDllPatch");
           
            hHW_SOD = GetModuleHandleA("HW_SOD.dll");
            _PI->WriteLoHook(0x450BFE, showAddress);
        }
    }

    return TRUE;
}


patcher_x86.dll загружается до пользовательских плагинов и поэтому можно получить его хендл (переименуйте имя модуля).
Вернуться к началу

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

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

Сообщение AlexSpl » 23 янв 2019, 18:26

А вот из хука получить адрес HW_SOD.dll уже можно:

Код: Выделить всё
#define _CRT_SECURE_NO_WARNINGS
#include "HotA\homm3.h"

Patcher* _P;
PatcherInstance* _PI;
static _bool_ plugin_On = 0;

int __stdcall showAddress(LoHook* h, HookContext* c)
{
    HMODULE hHW_SOD = GetModuleHandleA("HW_SOD.dll");
           
    sprintf(o_TextBuffer, "HW_SOD.dll is loaded at %08X", (int)hHW_SOD);
    CALL_12(void, __fastcall, 0x4F6C00, o_TextBuffer, 1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0);

    return EXEC_DEFAULT;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    if ( DLL_PROCESS_ATTACH == ul_reason_for_call )
    {
        if ( !plugin_On )
        {
            plugin_On = 1;
            _P = GetPatcher();
            _PI = _P->CreateInstance("HD.Plugin.TestDllPatch");

            _PI->WriteLoHook(0x450BFE, showAddress);
        }
    }

    return TRUE;
}


И если хук поставить прям перед воспроизведением роликов или куда-то ещё в начало, то, думаю, и пропатчить из хука тоже будет возможно (может, не средствами патчера, а например, с помощью WriteProcessMemory), но что там с правами на запись... В любом случае, это уже извращение :smile1:
Вернуться к началу

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

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

Сообщение AlexSpl » 23 янв 2019, 19:25

Работает :smile11:

Код: Выделить всё
#define _CRT_SECURE_NO_WARNINGS
#include "HotA\homm3.h"

Patcher* _P;
PatcherInstance* _PI;
static _bool_ plugin_On = 0;

int __stdcall patchDll(LoHook* h, HookContext* c)
{
    HMODULE hHW_SOD = GetModuleHandleA("HW_SOD.dll");

    char MageGuildPatch = 0xEB;
    SIZE_T BytesWritten;
    int DllPatchAddress = (int)hHW_SOD + 0xFE2C;
    WriteProcessMemory(GetCurrentProcess(), (LPVOID)DllPatchAddress, &MageGuildPatch, 1, &BytesWritten);

    return EXEC_DEFAULT;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    if ( DLL_PROCESS_ATTACH == ul_reason_for_call )
    {
        if ( !plugin_On )
        {
            plugin_On = 1;
            _P = GetPatcher();
            _PI = _P->CreateInstance("HD.Plugin.TestDllPatch");

            _PI->WriteLoHook(0x598510 /* перед загрузкой .vid */, patchDll);
        }
    }

    return TRUE;
}


Теперь осталось проверить, можно ли WriteProcessMemory() заменить патчем: _PI->WriteByte(DllPatchAddress, 0xEB);
Последний раз редактировалось AlexSpl 23 янв 2019, 19:46, всего редактировалось 2 раз(а).
Вернуться к началу

offlineBen80  
имя: Сергей
Эксперт
Эксперт
 
Сообщения: 1318
Зарегистрирован: 18 июн 2017, 06:49
Пол: Не указан
Поблагодарили: 336 раз.

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

Сообщение Ben80 » 23 янв 2019, 19:35

Здорово, но в следующих релизах HD мода будет не 0xFE2C, а что-нибудь другое, возможно.
Вернуться к началу

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

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

Сообщение AlexSpl » 23 янв 2019, 19:47

Согласен. Но HW_SOD.dll вряд ли будет меняться (в отличие от библиотек HotA).

И вообще, если собрались играть по таким правилам, то почему просто не отредактировать HW_SOD.dll? Там один байт поменять. Но, как видите, и плагином тоже можно.
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

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

Сообщение as239 » 24 янв 2019, 05:55

AlexSpl писал(а):

Работает :smile11:

Код: Выделить всё
#define _CRT_SECURE_NO_WARNINGS
#include "HotA\homm3.h"

Patcher* _P;
PatcherInstance* _PI;
static _bool_ plugin_On = 0;

int __stdcall patchDll(LoHook* h, HookContext* c)
{
    HMODULE hHW_SOD = GetModuleHandleA("HW_SOD.dll");

    char MageGuildPatch = 0xEB;
    SIZE_T BytesWritten;
    int DllPatchAddress = (int)hHW_SOD + 0xFE2C;
    WriteProcessMemory(GetCurrentProcess(), (LPVOID)DllPatchAddress, &MageGuildPatch, 1, &BytesWritten);

    return EXEC_DEFAULT;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    if ( DLL_PROCESS_ATTACH == ul_reason_for_call )
    {
        if ( !plugin_On )
        {
            plugin_On = 1;
            _P = GetPatcher();
            _PI = _P->CreateInstance("HD.Plugin.TestDllPatch");

            _PI->WriteLoHook(0x598510 /* перед загрузкой .vid */, patchDll);
        }
    }

    return TRUE;
}


Теперь осталось проверить, можно ли WriteProcessMemory() заменить патчем: _PI->WriteByte(DllPatchAddress, 0xEB);


Супер! :smile20: Проверил все работает как нужно. Огромное спасибо!
Вернуться к началу

offlineas239  
имя: Анатолий
Ветеран
Ветеран
 
Сообщения: 527
Зарегистрирован: 29 дек 2018, 14:17
Пол: Мужчина
Поблагодарили: 38 раз.

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

Сообщение as239 » 24 янв 2019, 06:01

AlexSpl писал(а):

Согласен. Но HW_SOD.dll вряд ли будет меняться (в отличие от библиотек HotA).

И вообще, если собрались играть по таким правилам, то почему просто не отредактировать HW_SOD.dll? Там один байт поменять. Но, как видите, и плагином тоже можно.


Я выкладываю мод на HW, где большое сетевое сообщество.
Если выложить пропатченную dll, некоторые нечистоплотные личности могут не устоять и будут играть с ней, в то время как соперник будет играть с обычной dll.
И это очень сложно будет потом выявить.
Вернуться к началу

Пред.След.

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

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

Сейчас этот форум просматривают: Yandex [bot] и гости: 2

cron