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

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

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

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


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

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

Мне нужно понять, как можно перехватить виртуальную функцию, другие функцие которые вызываются при помощи CALL - работают, а именно виртуальные нет. Подскажите, может есть статьи или где и куда копать?
 
Эксперт
Статус
Оффлайн
Регистрация
29 Мар 2021
Сообщения
1,591
Реакции[?]
603
Поинты[?]
42K
MH_CreateHook(pointer_to_vtable + function_offset_in_bytes, ...)

ты мне лучше вот что расскажи: ты когда вот с таким 1729927231731.png
неймингом на форум заходишь - у тебя соски не твердеют? вообще не страшно?
 
Начинающий
Статус
Оффлайн
Регистрация
25 Окт 2024
Сообщения
4
Реакции[?]
0
Поинты[?]
0
ты мне лучше вот что расскажи: ты когда вот с таким Посмотреть вложение 288744
неймингом на форум заходишь - у тебя соски не твердеют? вообще не страшно?
ахаха, да не) я просто устал присваивать значения разным классам, поэтому начал уже использовать на похрен
 
unbound
Пользователь
Статус
Оффлайн
Регистрация
27 Окт 2019
Сообщения
269
Реакции[?]
90
Поинты[?]
60K
У меня есть адрес функции 140FB3BF0, я хочу хукнуть его при помощи MinHook, но не получается это сделать. Вывожу обычный текст, вот скриншот функции:

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

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


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

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

Мне нужно понять, как можно перехватить виртуальную функцию, другие функцие которые вызываются при помощи CALL - работают, а именно виртуальные нет. Подскажите, может есть статьи или где и куда копать?
Ты получаешся просто долбишся в её адрес, а там вроде ещё дереференс надо делать или чёт такое, короче вот функция, можешь ей воспользоватся
code:
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 хуками
неплохой вариант (
Пожалуйста, авторизуйтесь для просмотра ссылки.
)
 
Начинающий
Статус
Оффлайн
Регистрация
25 Окт 2024
Сообщения
4
Реакции[?]
0
Поинты[?]
0
Ты получаешся просто долбишся в её адрес, а там вроде ещё дереференс надо делать или чёт такое, короче вот функция, можешь ей воспользоватся
code:
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 есть, но в консоли не выдает то, что я написал.
 
Начинающий
Статус
Оффлайн
Регистрация
25 Окт 2024
Сообщения
4
Реакции[?]
0
Поинты[?]
0
Ты получаешся просто долбишся в её адрес, а там вроде ещё дереференс надо делать или чёт такое, короче вот функция, можешь ей воспользоватся
code:
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 это заголовок функции, которую я хукаю?
 
На самом деле я Zodiak
Участник
Статус
Оффлайн
Регистрация
22 Дек 2020
Сообщения
1,008
Реакции[?]
181
Поинты[?]
68K
MH_CreateHook(pointer_to_vtable + function_offset_in_bytes, ...)

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