Я делал прогу для W2000 SP(2). Но к сожалению по ряду причин она не переносимая. Ещё раз. Какая у тебя ОС ?
Проблема в том, что один адресс я не смог идентифицировать по имени. Тоесть он зависит от версии ОС и сервис-пака. Разве что ты сольёш дебаг символы и определишь симв.идентификатор этого адресса. Подозреваю что это внутрення переменная . Код (Text): typedef struct _TABLE_DESCRIPTOR_USER { PDWORD pObject; PDWORD TlsArray; BYTE Type; BYTE Flag; WORD CountNumber; } TABLE_DESCRIPTOR_USER, *PTABLE_DESCRIPTOR_USER, **PPTABLE_DESCRIPTOR_USER; typedef struct _OBJECT_USER_HOOK { DWORD dwHANDLE_HOOK; DWORD dwReference;//?? PDWORD TlsArray; PDWORD DesktopObject;//?? DWORD dwCurrentAddrStruct; DWORD uknow1; DWORD dwTypeHOOK; //Тип хука. Вибираешь для клавы. DWORD dwProc; //Адресс процедуры. DWORD uknow2; DWORD dwIndexMasAtom; //Самое интересное. } OBJECT_USER_HOOK, *POBJECT_USER_HOOK, **PPOBJECT_USER_HOOK; Структуры, что описывают хуки. 1) _TABLE_DESCRIPTOR_USER лежит по адрессу (у меня) 0x0A020000C. 2) Бегаешь по ней и ищешь Type == 5. Это хук. 3) Указатель pObject ссылается на OBJECT_USER_HOOK 4) С первого элемента TlsArray получаешь указаль на ETHREAD (а там Id процесса и потока). 5) А вот тут закавыка. dwIndexMasAtom если "-1" - то хук в проге. А если нет... Существует как известно две таблицы глобальных атомов - ntoskrnl и win32k. Точно сказать не могу, но это поле видимо или ещё одна внутренняя табличка или тупой масив (не помню). Если не "-1", то это индекс в таблице. У меня таблица по адрессу 0x0A018A2E0. Код (Text): typedef struct _ARRAY_ATOM_HOOKS_DLL { WORD atom[60]; } ARRAY_ATOM_HOOKS_DLL, *PARRAY_ATOM_HOOKS_DLL, **PPARRAY_ATOM_HOOKS_DLL; Значения элементов в этой таблице - атомы win32k.sys. По сути это текстовые строки - полный путь к DLL. Идентифицировать эту заразу можно или с юзер режима GetClipboardFormatName или с кернела RtlQueryAtomInAtomTable.
IceStudent помог символами отладки. Загадочный масив называется - _aatomSysLoaded. В XP SP(1) лежит по адрессу 0xBF9973C0. Теоретически, можно сделать универсальный механизм, который вытягивает символ отладки, и говорит об адрессе масива драйверу. Кстати, вот окошко проги для отлова хуков. Правда работает утилитка пока ещё на W2K. _1231652058__hook.gif
Мне ведь известен хендл хука: OBJECT_USER_HOOK->dwHANDLE_HOOK Вот и вызываю UnhookWindowsHookEx( dwHOOK ); со значением выбранного хендела.
Я тут с помощью NtObjects v2.9 смотрел на XP. Структура OBJECT_USER_HOOK страшно покорёжилась. Нужно заново её реверсировать. Из всех полей узнал только тип хука. Короче нужно брать Айс.
Мне ведь известен хендл хука: OBJECT_USER_HOOK->dwHANDLE_HOOK Вот и вызываю UnhookWindowsHookEx( dwHOOK ); со значением выбранного хендела. мдя, не разглядел сразу :-(( сэнкс
Итак. Даная утилита работает под Win2K SP(2) и WinXP SP(1). На остальных не проверял, поэтому работа на других ОС с другими сервис-паками заблокирована. Прога получает список глобальных хуков методом описаным выше. Размер 105 кб. http://rapidshare.de/files/9434063/AntiKeyLog.zip.html