Модератор форума
-
Автор темы
- #1
С введением в CS:GO "Доверенного режима", в игре теперь установлены хуки на LdrLoadDll, NtOpenFile, LoadLibraryExW (он уже был, но хукается еще раз), PeekMessageW. Эти хуки ставятся следующим образом (тут нет LdrLoadDll, так как он ставится в GameOverlayRenderer.dll, представленные ниже хуки ставятся в csgo.exe):
Соответственно, можно использовать для хуков своего чита эту функцию
Функция имеет соглашение __fastcall, первый аргумент - адрес функции, которую требуется хукнуть, второй - адрес функции, на которую мы заменяем. Возвращаемое значение - адрес оригинала
Имеется один нюанс - анхук не предусмотрен (или я не нашел, да и мне собственно до пизды), поэтому его напишем сами
Класс нашего хука будет иметь 2 приватных переменных - адрес функции, которую мы хукаем, и адрес оригинала
Функции для хука/хука виртуальной функции из таблицы/получения оригинала в нужном typename (мне лень вспоминать как это переводится, извините):
Анхук реализовывается просто - снимаем протект в размере 5 байт с адреса функции (который мы сохранили при хуке), копируем 5 байт из адреса оригинала на адрес функции, возвращаем протект, очищаем кэш 5 инструкций на этом адресе
Соответственно, можно использовать для хуков своего чита эту функцию
Функция имеет соглашение __fastcall, первый аргумент - адрес функции, которую требуется хукнуть, второй - адрес функции, на которую мы заменяем. Возвращаемое значение - адрес оригинала
Имеется один нюанс - анхук не предусмотрен (или я не нашел, да и мне собственно до пизды), поэтому его напишем сами
Класс нашего хука будет иметь 2 приватных переменных - адрес функции, которую мы хукаем, и адрес оригинала
C++:
class CHook
{
private:
LPVOID m_pOriginalFunction;
LPVOID m_pAddress;
}
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;
}
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;
}
};