Перейти к содержанию

Как правильно хукать и как переделать хук


Гость hasio

Рекомендуемые сообщения

Вопрос: как исправить или переделать алгоритм хука, а точнее как правильно хукать. Видел уроки про джампы адресов, но тут совсем иначе.

Скрытый текст

--Хук:
	pPanelHook = new CVMTHookManager( ( PDWORD* ) pPanel );
	oPaintTraverse = ( PaintTraverse_ )pPanelHook->dwHookMethod( ( DWORD )PaintTraverse_Hooked1, 41 );
--Код методов:
CVMTHookManager* pPanelHook;
CVMTHookManager* pCreatMoveHook;
--Код класса:
class CVMTHookManager
{
public:
	CVMTHookManager( void )
	{
		memset( this, 0, sizeof( CVMTHookManager ) );
	}

	CVMTHookManager( PDWORD* ppdwClassBase )
	{
		bInitialize( ppdwClassBase );
	}

	~CVMTHookManager( void )
	{
		UnHook();
	}
	bool bInitialize( PDWORD* ppdwClassBase )
	{
		m_ppdwClassBase = ppdwClassBase;
		m_pdwOldVMT = *ppdwClassBase;
		m_dwVMTSize = dwGetVMTCount( *ppdwClassBase );
		m_pdwNewVMT = new DWORD[ m_dwVMTSize ];
		memcpy( m_pdwNewVMT, m_pdwOldVMT, sizeof( DWORD ) * m_dwVMTSize );
		*ppdwClassBase = m_pdwNewVMT;
		return true;
	}
	bool bInitialize( PDWORD** pppdwClassBase ) // fix for pp
	{
		return bInitialize( *pppdwClassBase );
	}

	void UnHook( void )
	{
		if ( m_ppdwClassBase )
		{
			*m_ppdwClassBase = m_pdwOldVMT;
		}
	}

	void ReHook( void )
	{
		if ( m_ppdwClassBase )
		{
			*m_ppdwClassBase = m_pdwNewVMT;
		}
	}

	int iGetFuncCount( void )
	{
		return ( int ) m_dwVMTSize;
	}

	DWORD dwGetMethodAddress( int Index )
	{
		if ( Index >= 0 && Index <= ( int )m_dwVMTSize && m_pdwOldVMT != NULL )
		{
			return m_pdwOldVMT[ Index ];
		}
		return NULL;
	}

	PDWORD pdwGetOldVMT( void )
	{
		return m_pdwOldVMT;
	}

	DWORD dwHookMethod( DWORD dwNewFunc, unsigned int iIndex )
	{
		if ( m_pdwNewVMT && m_pdwOldVMT && iIndex <= m_dwVMTSize && iIndex >= 0 )
		{
			m_pdwNewVMT[ iIndex ] = dwNewFunc;
			return m_pdwOldVMT[ iIndex ];
		}

		return NULL;
	}

private:
	DWORD dwGetVMTCount( PDWORD pdwVMT )
	{
		DWORD dwIndex = 0;

		for ( dwIndex = 0; pdwVMT[ dwIndex ]; dwIndex++ )
		{
			if ( IsBadCodePtr( ( FARPROC ) pdwVMT[ dwIndex ] ) )
			{
				break;
			}
		}
		return dwIndex;
	}
	PDWORD*	m_ppdwClassBase;
	PDWORD	m_pdwNewVMT, m_pdwOldVMT;
	DWORD	m_dwVMTSize;
};

 

// Читаем правила. На первый раз устное предупреждение. Garik66

Ссылка на комментарий
Поделиться на другие сайты

Это даже не полный исходник, почитай тему там откуда копировал код, там все написано.

39 минуты назад, hasio сказал:

а точнее как правильно хукать

 

Объявляешь прототип функции, после вызываешь функцию из виртуальной таблицы по индексу и передаешь аргументы.

Изменено пользователем partoftheworlD
Ссылка на комментарий
Поделиться на другие сайты

11 минуту назад, partoftheworlD сказал:

Это даже не полный исходник, почитай тему там откуда копировал код, там все написано.

Этот код взят с агнлоязычного форума, где в ответах только спасибо. Поэтому пытаюсь разобратся сам. Дело в том, что код рабочий, просто античит палит хук. Чтобы не быть забаненым античитом, нужно переписать хук, а что да как, в этом вопрос.

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, hasio сказал:

Поэтому пытаюсь разобратся сам. Дело в том, что код рабочий, просто античит палит хук.

 

Код 2014 года, за это время вак обновили и с начала 2016 конца 2015 года он палит любые хуки.

Ссылка на комментарий
Поделиться на другие сайты

Зачем тебе эти усложнения в виде хуков.

1. Эти хуки очень просто вычисляет античит - банан

2. Чит становится internal - намного проще найти матрицу и сделать external

3. Ну и самый главный аргумент - ты будешь вместо простого чтения адресов, использовать еще и запись в память игры.

Esp к примеру можно сделать с помощью обычного чтения адресов - external (+ не заметно чита при записи)

Изменено пользователем roma91212
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.