Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.08.2012, 18:49   #1
LXandR
 
Регистрация: 09.08.2012
Сообщений: 4
По умолчанию Банальные вопросы про Апи Хуки.

Приветствую, форум.

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

Итак, задача: перехватить WmDrawText либо WMTextOut
Делать это собираюсь глобальным хуком. DLLка для инжекта есть, есть набор различных исходников, все, что нашел.

Главный вопрос: как заставить это все работать.

Any help would be appreciated.
Заранее, спасибо.
LXandR вне форума Ответить с цитированием
Старый 10.08.2012, 20:03   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Цитата:
Сообщение от LXandR Посмотреть сообщение
Главный вопрос: как заставить это все работать.
А как пробовали?
counter вне форума Ответить с цитированием
Старый 24.08.2012, 15:08   #3
LXandR
 
Регистрация: 09.08.2012
Сообщений: 4
По умолчанию

DLLка вот такая:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~
Код:
int (WINAPI * Real_DrawText)(HDC a0, LPCWSTR a1, int a2, LPRECT a3, UINT a4) = DrawTextW;

BOOL WINAPI Mine_DrawText(HDC hdc, LPCWSTR text,  int nCount, LPRECT lpRect, UINT uOptions)
{
   // ... Текст заменяющей функции не привожу для экономии места.
}

BOOL APIENTRY DllMain( HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved  )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        DetourTransactionBegin(); 
        DetourUpdateThread(GetCurrentThread());
        DetourAttach(&(PVOID&)Real_DrawText, Mine_DrawText);
        DetourTransactionCommit();
        break;

    case DLL_PROCESS_DETACH:
        DetourTransactionBegin(); 
        DetourUpdateThread(GetCurrentThread());
        DetourDetach(&(PVOID&)Real_DrawText, Mine_DrawText);
        DetourTransactionCommit();
        break;
    }

    return TRUE;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~

После этого надо бы, я так понимаю, создать exe-шник и сделать вот так:
Код:
int _tmain(int argc, _TCHAR* argv[])
{
		SetWindowsHookEx(WH_CBT, (HOOKPROC) CBTProc, g_hInstance, 0);
	return 0;
}
НО вот тут и начинаются непонятки, ибо банально не хватает знаний. Собственно на подставляемую ДЛЛку тут указывает функция CBTProc, которая ДЛЛ вызывать и должна. Но как конкретно - не понимаю.


Заранее спасибо за ответ.

Последний раз редактировалось Stilet; 25.08.2012 в 11:03.
LXandR вне форума Ответить с цитированием
Старый 24.08.2012, 17:22   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Вам надо сначала в ЕХЕ загрузить DLL, сохранив HINSTANCE, потом из него получить адрес вашей хук фунцкции и потом передать все ето в SetWindowsHookEx()

Только если у вас есть inject, зачем вам хук?
waleri вне форума Ответить с цитированием
Старый 25.08.2012, 04:23   #5
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Открываете OllyDbg, с помощью загружаете Ваш *.exe файл и находите там пустое место. Метод загрузки без экспортируемых функций прост. В дампе программы указываете имя вашего *.dll файла и естественно запоминаете адрес начало строки.

Код:
Push 0xXXXXXX ; Загружаете строку в Stack
CALL LoadLibraryA ; Затем вызываете функцию загрузки *.dll
JMP 0xYYYYYY ;  Здесь прыжок по адресу где первоначально стартовала ваша программа. В том случае если попытаетесь изменить точку входа в программу, вернутся в прежнее состояние откуда начиналась вся работа обязательно необходима.
После следующих операций необходимо все это сохранить и теперь можно будет пользоваться вашей *.dll и манипулировать *.exe приложение как Вам будет угодно.
Есть еще куча вариантов загрузки *.dll файлов (с изменением точки входа, без ее изменения).
Варианты с получением адресов экспортируемых функций, метод тоже на самом деле очень прост в использование.

Код:
Push 0xXXXXXX ; Начало адреса имени файла
CALL LoadLibraryA ; Загрузка *.dll
Push 0xYYYYYY ; Начало адреса имени экспортируемой функции
Push Eax ; Передаем первым параметром HMODULE полученной от LoadLibraryA
CALL GetProcAddress ; Получаем адрес данной экспортируемой функции
CALL Eax ; Переходим по полученному адресу (функция в *.dll)
JMP 0xZZZZZZ ; Первоначальная точка входа
Данная информация я думаю натолкнет Вас на мысли, дальше курите книжки или что-то другое.

Последний раз редактировалось coNsept; 25.08.2012 в 04:30.
coNsept вне форума Ответить с цитированием
Старый 25.08.2012, 11:37   #6
LXandR
 
Регистрация: 09.08.2012
Сообщений: 4
По умолчанию

coNsept,
Вижу страшные строки ассемблера)))
Да, это все, конечно, замечательно, спасибо вам большое, но в ассемблере я не силен.
Кроме того, насколько я знаю, мелкомягкая библиотека Detours и создана для того, чтобы не работать напрямую с ассемблерским кодом. Было бы время - разобрался бы, но мне, к сожалению с на данном этапе нужен результат.

waleri,
А подробнее можно?

Заранее спасибо за ответ.
LXandR вне форума Ответить с цитированием
Старый 25.08.2012, 13:31   #7
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

LXandR, обычно это делается примерно так:
DLL
Код:
// Procedure for setting hook
extern "C"  __declspec(dllexport)
BOOL  SetHook(bool enable)
{
	if(enable)
	{		
		if((hMouseHook=SetWindowsHookEx(WH_MOUSE,MouseProc,hMod,idThread))!=NULL)
				return true;
		return false;
	}
	else
	{
		if(hMouseHook)
			UnhookWindowsHookEx(hMouseHook);
	}
	return true;
}
EXE
Код:
hMod=LoadLibrary("hook.dll");
if(!hMod)
	MessageBox(hWnd,"Cann't load hook.dll","Error",MB_OK);
else
{
							 
	if((hookFunc= (pfHook)GetProcAddress(hMod,"SetHook"))!=NULL)
	{   
		if(hookFunc(true))
		{
				// хук установлен
                }		
        }
}
counter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопросы про INTERNET Trash Band Помощь студентам 3 27.12.2011 11:25
Вопросы про компонент HTTPRIO Anatai Компоненты Delphi 0 24.01.2011 13:13
Вопросы новичка про C++ k1r1ch C++ Builder 5 25.11.2009 15:11
Ошибка в неро апи Яр|/||< (^_^) Общие вопросы Delphi 3 07.09.2009 14:11
Банальные проблемы с кодировками и наборами символов. Killer_djon PHP 5 02.06.2009 14:38