Re[4]: проблемы с глобальным перехватом
От: nkaipov  
Дата: 28.10.04 03:41
Оценка:
Здравствуйте, 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 functions
    if ((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);
        }
    }
}
Re: Методы перехвата API-вызовов в Win32
От: fractal_glider  
Дата: 29.10.04 04:15
Оценка:
Здравствуйте, Игорь В. Филимонов, Вы писали:

...
...
...


не знаю, может я самый настоящий валенок, но после компилирования DriveType2 на Windows XP,
и заменой последнего аргумента в DT2_HookAllApps на thread id процесса у которого я хочу
перехватывать API, SetWindowsHookEx (внутри ентой DT2_HookAllApps) постоянно возвращает
NULL, с GetLastError

@ERR,hr 0x00000057 The parameter is incorrect.
Re: Методы перехвата API-вызовов в Win32
От: Аноним  
Дата: 14.01.05 14:05
Оценка: 3 (1)
Здравствуйте, Игорь В. Филимонов.

Прочитал Вашу статью, попробовал, собрал — и о чудо —
программа работает.
Пошёл дальше — попробовал перехватить дпугие API-функции —
и опять — сработало.
Но вот моя проблема: решил вместо GUI-вой программы, написать
консольное приложение, а именно — прогу в формате "службы Windows NT".
Сама моя служба работает, а вот если из этой службы вызвать функцию
из DLL-ки установки хука, то хук ставится, но ведёт себя странно, т.е.
SetWindowsHookEx возвращает не NULL, но хукирующая функция то ли не вызывается,
то ли вызывается, но очень очень редко. Перехват API-функция естесственно, тоже
не срабатывает.
Вопрос: с чем это может быть связано? Может быть нельзя функцию установки хука
вызывать из консольного приложения или службы Windows ?
Re[2]: Методы перехвата API-вызовов в Win32
От: SergH Россия  
Дата: 13.02.05 14:41
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Игорь В. Филимонов.


А>Прочитал Вашу статью, попробовал, собрал — и о чудо -

А>программа работает.
А>Пошёл дальше — попробовал перехватить дпугие API-функции -
А>и опять — сработало.
А>Но вот моя проблема: решил вместо GUI-вой программы, написать
А>консольное приложение, а именно — прогу в формате "службы Windows NT".
А>Сама моя служба работает, а вот если из этой службы вызвать функцию
А>из DLL-ки установки хука, то хук ставится, но ведёт себя странно, т.е.
А>SetWindowsHookEx возвращает не NULL, но хукирующая функция то ли не вызывается,
А>то ли вызывается, но очень очень редко. Перехват API-функция естесственно, тоже
А>не срабатывает.
А>Вопрос: с чем это может быть связано? Может быть нельзя функцию установки хука
А>вызывать из консольного приложения или службы Windows ?

Служба (если не стоит флаг разрешения взаимодействия с пользователем) запускается на другой оконной станции и десктопе (объекты Window Station и Desktop, см MSDN), а хуки действуют только в пределах десктопа. Кстати, это действует и обратно, т.е., поставив хук в обычном приложении нельзя внедриться в службу и перехватить там функцию.

Ограничение технологи, ничего не поделаешь... Но из обычного консольного приложения должно работать.
Делай что должно, и будь что будет
Re[3]: Методы перехвата API-вызовов в Win32
От: SPeller  
Дата: 13.05.09 09:35
Оценка:
Здравствуйте,
Поместил пример из статьи класса CAPIHook в длл, экспортнул функцию установки хука. И пытаюсь перехватывать, вызывая функцию установки хука из приложения. Работает не всегда. Например, MessageBoxA — не перехватывает, а MessageBoxW — перехватывает. В чем может быть проблема?
Re[4]: Методы перехвата API-вызовов в Win32
От: SergH Россия  
Дата: 13.05.09 10:41
Оценка:
Здравствуйте, SPeller, Вы писали:

SP>Поместил пример из статьи класса CAPIHook в длл, экспортнул функцию установки хука. И пытаюсь перехватывать, вызывая функцию установки хука из приложения. Работает не всегда. Например, MessageBoxA — не перехватывает, а MessageBoxW — перехватывает. В чем может быть проблема?


Какие-нибудь подробности?
Какая ОС, как именно проверялось?
Делай что должно, и будь что будет
Re[5]: Методы перехвата API-вызовов в Win32
От: SPeller  
Дата: 13.05.09 23:24
Оценка:
SH>Какие-нибудь подробности?
SH>Какая ОС, как именно проверялось?

Ось ХП СП3. Вызов из Дельфи 2009 при создании формы. При установке хука на MessageBoxA он вроде устанавливается, возвращает адрес оригинала, но при вызове функции функция перехватчик не отрабатывает, вызов идет в оригинальную функцию.
Re[6]: Методы перехвата API-вызовов в Win32
От: SergH Россия  
Дата: 13.05.09 23:35
Оценка:
Здравствуйте, SPeller, Вы писали:

SP>Ось ХП СП3. Вызов из Дельфи 2009 при создании формы. При установке хука на MessageBoxA он вроде устанавливается, возвращает адрес оригинала, но при вызове функции функция перехватчик не отрабатывает, вызов идет в оригинальную функцию.


Я бы предположил, что хитрый дельфи вызывает MessageBoxW в любом случае. Для проверки нужно перехватить обе и посмотреть, среагирует ли хоть один.
Другой вариант -- перейти на метод перехвата, исправляющий код функции (там, где Detours используется).
Делай что должно, и будь что будет
Re[7]: Методы перехвата API-вызовов в Win32
От: SPeller  
Дата: 14.05.09 01:10
Оценка:
Я нашел причину Дело в том же, о чем пишется в статье про дельфийский компилятор. Только деле еще красивее. MessageBoxA имеет 3 точки импорта. Закомментировал строку
return;  // We did it, get out

в методе CAPIHook::ReplaceIATEntryInOneMod и всё заработало Ну, не умеет дельфийский компилятор объединять импорты.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.