Здравствуйте, lastwalrus, Вы писали:
L>Имеется три машины... L>win2k sp4(точно не уверен), всё работает... L>winXP sp2 — валится StackOverFlow в методе LoadLibraryExW( там грузится в процесс еще одна DT2lib.dll, L>и дальше следующий вызов LoadLibraryExW приводит к зацикливанию..)
В коде примера ошибка. Он не дружит с повторным вызовом LoadLibrary
для Dll перехватчика. Вот работоспособный вариант.
void CAPIHook::FixupNewlyLoadedModule(HMODULE hmod, DWORD dwFlags)
{
// If a new module is loaded, hook the hooked functionsif ((hmod != NULL) && ((dwFlags & LOAD_LIBRARY_AS_DATAFILE) == 0)) {
const HMODULE hmodThisMod = ModuleFromAddress(ReplaceIATEntryInAllMods); // Добавленоfor (CAPIHook* p = sm_pHead; p != NULL; p = p->m_pNext) {
if (p->m_fExcludeAPIHookMod && hmodThisMod == hmod) continue; // Добавлено
ReplaceIATEntryInOneMod(p->m_pszCalleeModName, p->m_pfnOrig, p->m_pfnHook, hmod);
}
}
}
не знаю, может я самый настоящий валенок, но после компилирования DriveType2 на Windows XP,
и заменой последнего аргумента в DT2_HookAllApps на thread id процесса у которого я хочу
перехватывать API, SetWindowsHookEx (внутри ентой DT2_HookAllApps) постоянно возвращает
NULL, с GetLastError
Прочитал Вашу статью, попробовал, собрал — и о чудо —
программа работает.
Пошёл дальше — попробовал перехватить дпугие API-функции —
и опять — сработало.
Но вот моя проблема: решил вместо GUI-вой программы, написать
консольное приложение, а именно — прогу в формате "службы Windows NT".
Сама моя служба работает, а вот если из этой службы вызвать функцию
из DLL-ки установки хука, то хук ставится, но ведёт себя странно, т.е.
SetWindowsHookEx возвращает не NULL, но хукирующая функция то ли не вызывается,
то ли вызывается, но очень очень редко. Перехват API-функция естесственно, тоже
не срабатывает.
Вопрос: с чем это может быть связано? Может быть нельзя функцию установки хука
вызывать из консольного приложения или службы Windows ?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Игорь В. Филимонов.
А>Прочитал Вашу статью, попробовал, собрал — и о чудо - А>программа работает. А>Пошёл дальше — попробовал перехватить дпугие API-функции - А>и опять — сработало. А>Но вот моя проблема: решил вместо GUI-вой программы, написать А>консольное приложение, а именно — прогу в формате "службы Windows NT". А>Сама моя служба работает, а вот если из этой службы вызвать функцию А>из DLL-ки установки хука, то хук ставится, но ведёт себя странно, т.е. А>SetWindowsHookEx возвращает не NULL, но хукирующая функция то ли не вызывается, А>то ли вызывается, но очень очень редко. Перехват API-функция естесственно, тоже А>не срабатывает. А>Вопрос: с чем это может быть связано? Может быть нельзя функцию установки хука А>вызывать из консольного приложения или службы Windows ?
Служба (если не стоит флаг разрешения взаимодействия с пользователем) запускается на другой оконной станции и десктопе (объекты Window Station и Desktop, см MSDN), а хуки действуют только в пределах десктопа. Кстати, это действует и обратно, т.е., поставив хук в обычном приложении нельзя внедриться в службу и перехватить там функцию.
Ограничение технологи, ничего не поделаешь... Но из обычного консольного приложения должно работать.
Здравствуйте,
Поместил пример из статьи класса CAPIHook в длл, экспортнул функцию установки хука. И пытаюсь перехватывать, вызывая функцию установки хука из приложения. Работает не всегда. Например, MessageBoxA — не перехватывает, а MessageBoxW — перехватывает. В чем может быть проблема?
Здравствуйте, SPeller, Вы писали:
SP>Поместил пример из статьи класса CAPIHook в длл, экспортнул функцию установки хука. И пытаюсь перехватывать, вызывая функцию установки хука из приложения. Работает не всегда. Например, MessageBoxA — не перехватывает, а MessageBoxW — перехватывает. В чем может быть проблема?
Какие-нибудь подробности?
Какая ОС, как именно проверялось?
SH>Какие-нибудь подробности? SH>Какая ОС, как именно проверялось?
Ось ХП СП3. Вызов из Дельфи 2009 при создании формы. При установке хука на MessageBoxA он вроде устанавливается, возвращает адрес оригинала, но при вызове функции функция перехватчик не отрабатывает, вызов идет в оригинальную функцию.
Здравствуйте, SPeller, Вы писали:
SP>Ось ХП СП3. Вызов из Дельфи 2009 при создании формы. При установке хука на MessageBoxA он вроде устанавливается, возвращает адрес оригинала, но при вызове функции функция перехватчик не отрабатывает, вызов идет в оригинальную функцию.
Я бы предположил, что хитрый дельфи вызывает MessageBoxW в любом случае. Для проверки нужно перехватить обе и посмотреть, среагирует ли хоть один.
Другой вариант -- перейти на метод перехвата, исправляющий код функции (там, где Detours используется).
Я нашел причину Дело в том же, о чем пишется в статье про дельфийский компилятор. Только деле еще красивее. MessageBoxA имеет 3 точки импорта. Закомментировал строку
return; // We did it, get out
в методе CAPIHook::ReplaceIATEntryInOneMod и всё заработало Ну, не умеет дельфийский компилятор объединять импорты.