Гайд Хукаем функций используя предоставляемую Valve функцией

Модератор форума
Модератор
Статус
Оффлайн
Регистрация
19 Май 2018
Сообщения
954
Реакции[?]
1,067
Поинты[?]
20K
С введением в CS:GO "Доверенного режима", в игре теперь установлены хуки на LdrLoadDll, NtOpenFile, LoadLibraryExW (он уже был, но хукается еще раз), PeekMessageW. Эти хуки ставятся следующим образом (тут нет LdrLoadDll, так как он ставится в GameOverlayRenderer.dll, представленные ниже хуки ставятся в csgo.exe):
1602511092729.png

Соответственно, можно использовать для хуков своего чита эту функцию

Функция имеет соглашение __fastcall, первый аргумент - адрес функции, которую требуется хукнуть, второй - адрес функции, на которую мы заменяем. Возвращаемое значение - адрес оригинала

1602511446219.png

Имеется один нюанс - анхук не предусмотрен (или я не нашел, да и мне собственно до пизды), поэтому его напишем сами

Класс нашего хука будет иметь 2 приватных переменных - адрес функции, которую мы хукаем, и адрес оригинала

C++:
class CHook
{
private:
    LPVOID m_pOriginalFunction;
    LPVOID m_pAddress;
}
Функции для хука/хука виртуальной функции из таблицы/получения оригинала в нужном typename (мне лень вспоминать как это переводится, извините):

C++:
    public:
    bool Setup( LPVOID m_pFunction, LPVOID m_pDetour )
    {
        m_pAddress = m_pFunction;

        typedef LPVOID( __fastcall* HookFunction_t )( LPVOID, LPVOID );
        static HookFunction_t m_pHookFunction = reinterpret_cast< HookFunction_t >( Utils::FindPattern( "csgo.exe", "55 8B EC 83 EC 08 53 51" ) );

        m_pOriginalFunction = m_pHookFunction( m_pFunction, m_pDetour );
        return m_pOriginalFunction != nullptr;
    }

    bool SetupVirtual( LPVOID m_pTable, int m_nIndex, LPVOID m_pDetour )
    {
        return Setup( *reinterpret_cast< LPVOID** >( m_pTable )[ m_nIndex ], m_pDetour );
    }

    template< typename T >
    __forceinline T GetOriginal( )
    {
        return m_pOriginalFunction;
    }
Анхук реализовывается просто - снимаем протект в размере 5 байт с адреса функции (который мы сохранили при хуке), копируем 5 байт из адреса оригинала на адрес функции, возвращаем протект, очищаем кэш 5 инструкций на этом адресе
C++:
    bool Shutdown( )
    {
        DWORD m_dwOriginalProtection = 0;
        if ( !VirtualProtect( m_pAddress, 5, PAGE_EXECUTE_READWRITE, &m_dwOriginalProtection ) )
            return false;

        memcpy( m_pAddress, m_pOriginalFunction, 5 );

        if ( !VirtualProtect( m_pAddress, 5, m_dwOriginalProtection, &m_dwOriginalProtection ) )
            return false;

        FlushInstructionCache( INVALID_HANDLE_VALUE, m_pAddress, 5 );
        
        return true;
    }
C++:
class CHook
{
private:
    LPVOID m_pOriginalFunction;
    LPVOID m_pAddress;

public:
    bool Setup( LPVOID m_pFunction, LPVOID m_pDetour )
    {
        m_pAddress = m_pFunction;

        typedef LPVOID( __fastcall* HookFunction_t )( LPVOID, LPVOID );
        static HookFunction_t m_pHookFunction = reinterpret_cast< HookFunction_t >( Utils::FindPattern( "csgo.exe", "55 8B EC 83 EC 08 53 51" ) );

        m_pOriginalFunction = m_pHookFunction( m_pFunction, m_pDetour );
        return m_pOriginalFunction != nullptr;
    }

    bool SetupVirtual( LPVOID m_pTable, int m_nIndex, LPVOID m_pDetour )
    {
        return Setup( *reinterpret_cast< LPVOID** >( m_pTable )[ m_nIndex ], m_pDetour );
    }

    template< typename T >
    __forceinline T GetOriginal( )
    {
        return m_pOriginalFunction;
    }

    bool Shutdown( )
    {
        DWORD m_dwOriginalProtection = 0;
        if ( !VirtualProtect( m_pAddress, 5, PAGE_EXECUTE_READWRITE, &m_dwOriginalProtection ) )
            return false;

        memcpy( m_pAddress, m_pOriginalFunction, 5 );

        if ( !VirtualProtect( m_pAddress, 5, m_dwOriginalProtection, &m_dwOriginalProtection ) )
            return false;

        FlushInstructionCache( INVALID_HANDLE_VALUE, m_pAddress, 5 );
        
        return true;
    }
};
 
героин
Пользователь
Статус
Оффлайн
Регистрация
13 Сен 2019
Сообщения
301
Реакции[?]
75
Поинты[?]
1K
7хорошо спасибо бро буду пастить использовать пригодится люблю понравилось вот вальве лохи согласны?????7
 
f3mb0y
Участник
Статус
Оффлайн
Регистрация
14 Фев 2017
Сообщения
625
Реакции[?]
291
Поинты[?]
1K
А теперь проверяем область памяти (> ntdll) тоооо
Кстати странно, что у них в ГОР своя либа хуков, но они свою тянут в бинарь игры...
 
Модератор форума
Модератор
Статус
Оффлайн
Регистрация
19 Май 2018
Сообщения
954
Реакции[?]
1,067
Поинты[?]
20K
А теперь проверяем область памяти (> ntdll) тоооо
там страшно, оно тревожит мою психику, не надо туда смотреть
Кстати странно, что у них в ГОР своя либа хуков, но они свою тянут в бинарь игры...
ну на сколько я знаю, оверлей можно отключить в стиме, и по логике эта длл не должна грузиться.....
да и думаю разрабы кс не имеют доступа к коду оверлея, хоть это и одна контора, но все же разные подразделения
 
Сверху Снизу