• Ищем качественного (не новичок) разработчиков Xenforo для этого форума! В идеале, чтобы ты был фулл стек программистом. Если у тебя есть что показать, то свяжись с нами по контактным данным: https://t.me/DREDD

Вопрос C++ MinHook - Как можно хукнуть виртуальную функцию?

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
25 Окт 2024
Сообщения
4
Реакции
0
У меня есть адрес функции 140FB3BF0, я хочу хукнуть его при помощи MinHook, но не получается это сделать. Вывожу обычный текст, вот скриншот функции:

Пожалуйста, авторизуйтесь для просмотра ссылки.

А так же вот скриншот, как я пытаюсь это сделать:
Пожалуйста, авторизуйтесь для просмотра ссылки.


И после того, как я вхожу в игру и дожидаюсь момента, где эта функция используется у меня не происходит ничего. Так же, если посмотреть псевдокод, то эта функция вызывается, но виртуально:

if ( CGameStartup::sm_pFramework->Init(CGameStartup::sm_pFramework, startupParams) )

Мне нужно понять, как можно перехватить виртуальную функцию, другие функцие которые вызываются при помощи CALL - работают, а именно виртуальные нет. Подскажите, может есть статьи или где и куда копать?
 
MH_CreateHook(pointer_to_vtable + function_offset_in_bytes, ...)

ты мне лучше вот что расскажи: ты когда вот с таким
1729927231731.png

неймингом на форум заходишь - у тебя соски не твердеют? вообще не страшно?
 
ты мне лучше вот что расскажи: ты когда вот с таким Посмотреть вложение 288744
неймингом на форум заходишь - у тебя соски не твердеют? вообще не страшно?

ахаха, да не) я просто устал присваивать значения разным классам, поэтому начал уже использовать на похрен
 
У меня есть адрес функции 140FB3BF0, я хочу хукнуть его при помощи MinHook, но не получается это сделать. Вывожу обычный текст, вот скриншот функции:

Пожалуйста, авторизуйтесь для просмотра ссылки.

А так же вот скриншот, как я пытаюсь это сделать:
Пожалуйста, авторизуйтесь для просмотра ссылки.


И после того, как я вхожу в игру и дожидаюсь момента, где эта функция используется у меня не происходит ничего. Так же, если посмотреть псевдокод, то эта функция вызывается, но виртуально:

if ( CGameStartup::sm_pFramework->Init(CGameStartup::sm_pFramework, startupParams) )

Мне нужно понять, как можно перехватить виртуальную функцию, другие функцие которые вызываются при помощи CALL - работают, а именно виртуальные нет. Подскажите, может есть статьи или где и куда копать?
Ты получаешся просто долбишся в её адрес, а там вроде ещё дереференс надо делать или чёт такое, короче вот функция, можешь ей воспользоватся
code:
Expand Collapse Copy
template<typename T>
T vfunc(void* pTable, int index)
{
    PDWORD* VTablePointer = (PDWORD*)pTable;
    if (!VTablePointer)
        return T();
    PDWORD VTableFunctionBase = *VTablePointer;
    DWORD dwAddress = VTableFunctionBase[index];
    return (T)(dwAddress);
}

int main()
{
    MH_CreateHook(vfunc<LPVOID>(device_ptr, 42), &Hooked::end_scene, reinterpret_cast<LPVOID*>(&oEndScene));
}

Ну либо можешь воспользоваться VMT хуками
неплохой вариант (
Пожалуйста, авторизуйтесь для просмотра ссылки.
)
 
Ты получаешся просто долбишся в её адрес, а там вроде ещё дереференс надо делать или чёт такое, короче вот функция, можешь ей воспользоватся
code:
Expand Collapse Copy
template<typename T>
T vfunc(void* pTable, int index)
{
    PDWORD* VTablePointer = (PDWORD*)pTable;
    if (!VTablePointer)
        return T();
    PDWORD VTableFunctionBase = *VTablePointer;
    DWORD dwAddress = VTableFunctionBase[index];
    return (T)(dwAddress);
}

int main()
{
    MH_CreateHook(vfunc<LPVOID>(device_ptr, 42), &Hooked::end_scene, reinterpret_cast<LPVOID*>(&oEndScene));
}

Ну либо можешь воспользоваться VMT хуками
неплохой вариант (
Пожалуйста, авторизуйтесь для просмотра ссылки.
)
Привет, я глянул по CE он вроде хукает, ну comment есть, но в консоли не выдает то, что я написал.
 
Ты получаешся просто долбишся в её адрес, а там вроде ещё дереференс надо делать или чёт такое, короче вот функция, можешь ей воспользоватся
code:
Expand Collapse Copy
template<typename T>
T vfunc(void* pTable, int index)
{
    PDWORD* VTablePointer = (PDWORD*)pTable;
    if (!VTablePointer)
        return T();
    PDWORD VTableFunctionBase = *VTablePointer;
    DWORD dwAddress = VTableFunctionBase[index];
    return (T)(dwAddress);
}

int main()
{
    MH_CreateHook(vfunc<LPVOID>(device_ptr, 42), &Hooked::end_scene, reinterpret_cast<LPVOID*>(&oEndScene));
}

Ну либо можешь воспользоваться VMT хуками
неплохой вариант (
Пожалуйста, авторизуйтесь для просмотра ссылки.
)
И можешь расписать пример как это можно использовать? Т.е что такое device_ptr, EndScene, я так понимаю device_ptr - это адрес? А Hooked::end_scene это заголовок функции, которую я хукаю?
 
MH_CreateHook(pointer_to_vtable + function_offset_in_bytes, ...)

ты мне лучше вот что расскажи: ты когда вот с таким Посмотреть вложение 288744
неймингом на форум заходишь - у тебя соски не твердеют? вообще не страшно?
Ты не шаришь? Такой нейминг придумали что бы RTTI не спалил че за фанка!!
 
И можешь расписать пример как это можно использовать? Т.е что такое device_ptr, EndScene, я так понимаю device_ptr - это адрес? А Hooked::end_scene это заголовок функции, которую я хукаю?
device_ptr это указатель на vtable IDirect3DDevice9*
exam:
Expand Collapse Copy
    const auto device_ptr = reinterpret_cast<IDirect3DDevice9*>(
        Utilities::PatternScan("shaderapidx9.dll", "A1 ? ? ? ? 8D 53 08") + 1);
&Hooked::EndScene - ну и так должно быть понятно, наша функция для обработки
&oEndScene - адрес оригинального endscene
 
Назад
Сверху Снизу