Вопрос Краш при возврате хукнутой функции lock cursor

Пользователь
Статус
Оффлайн
Регистрация
5 Фев 2018
Сообщения
134
Реакции[?]
33
Поинты[?]
0
курсор лочится нормально,но при обратном локе сразу краш(раньше вообще просто картинка зависала)
C++:
ISurface* g_VGuiSurface = utl->get_interface<ISurface>(utl->get_module_factory(GetModuleHandleW(L"vguimatsurface.dll")),
"VGUI_Surface031"); - iSurface

Код:
vmt->init(g_VGuiSurface);

        vmt->hook(hkLockCursor, index::LockCursor);
hkLockCursor = 67;
мои хуки -
Код:
void VmtManager::init(void* className)

{

    count = 0;

    base = nullptr;

    _new = nullptr;

    _orig = nullptr;

    base = (DWORD**)className;//с класса в неподписанный массив указателей (DWORD, DWORD* - massiv; DWORD** - pointers massive;

    do {

        count++;

    } while (reinterpret_cast<uintptr_t*>(*base)[count] != NULL);//ПОДСЧЕТ ФУНКЦИЙ, ЕСЛИ ФУНКЦИЯ == 0 - это неправильный индекс

    _orig = (uintptr_t*)*base;// оригинал всего класса

    _new = new DWORD[sizeof(DWORD) * count];//создание контейнера в блока памяти, равному всему классу бейс.

    memcpy(_new, _orig, sizeof(DWORD) * count);

}

void VmtManager::hook(void* hkFuncName, int index)

{

    DWORD old;

    VirtualProtect(base, sizeof(DWORD), PAGE_EXECUTE_READWRITE, &old);

    _new[index] = (uintptr_t)(hkFuncName);

    *base = _new;

    VirtualProtect(base, sizeof(DWORD), old, &old);

}
хук локКурсора -
Код:
long __stdcall hkLockCursor(void* _this)

{

    static bool initCheck = false;

    static auto hkLockCursorOrig = vmt->originalFunc<decltype(&hkLockCursor)>(index::LockCursor);//orig func

    if (booleans::initMenu)

    {

        initCheck = true;

        g_VGuiSurface->UnlockCursor();

    //    sFunc.g_InputSystem->ResetInputState();

    }

    else

    {

        if (initCheck)

        {

            return hkLockCursorOrig(g_VGuiSurface);

        }

     

    }

}

вообще хз что делать, уже все перепробовал. Дебаг вообще странно себя ведет. он крашится еще на паттерн скане для хука энд сцены(она норм хукается и отрисовывается, так же, как и ресет)
 
Последнее редактирование:
Хули ты сидишь?
Начинающий
Статус
Оффлайн
Регистрация
7 Дек 2019
Сообщения
72
Реакции[?]
10
Поинты[?]
0
Это по любому до сих пор актуально, так что...

Во-первых, не очень понимаю смысл init чека
Во-вторых, проверь индекс функции UnlockCursor (67) в интерфейсе
В-третьих, хук должен быть типа void, а не long (хотя на это наверное похуй)

hooks.h:
    using LockCursorFn = void(__thiscall*)(void*) noexcept;
    inline LockCursorFn LockCursorOriginal = nullptr;
    void __stdcall LockCursor() noexcept;
Сам хук:
void __stdcall hooks::LockCursor() noexcept
{
    if (USettings.open)
    {
        interfaces::surface->UnlockCursor();
        interfaces::inputSystem->ResetInputState();
        return;
    }
    LockCursorOriginal(interfaces::surface);
}
PS. а вообще лучше юзать минхук, чтобы не ебать мозг
 
Сверху Снизу