Форум программистов, компьютерный форум, киберфорум
Программирование драйверов
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 26.08.2013
Сообщений: 161
1

Хук на ZwEnumerateKey

29.04.2017, 23:09. Показов 1003. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, помогите советом.

Есть у меня один драйвер, который перехватывает функцию ZwEnumerateKey и скрывает определенные ключи в реестре. Все работает отлично, но недавно повнимательнее решил посмотреть в отладчике на его работу. Выяснил, что к этой функции могут обращаться из разных потоков и мне просто очень везло, что ключи скрываются в моей ветке. Решил это исправить.

Для этих целей придумал следующий механизм: инициализировать Generic Table (которая будет хранить индекс ключа перебора) и помещать в него указатель ((int)keyHandle) функций ZwCreateKey, ZwOpenKey, а в функции ZwClose удалять запись из Generic Table по keyHandle. В ZwEnumerateKey по keyHandle обращаться к Generic Table и извлекать соответствующие индексы для скрытия ключей.

PS: хуки на ZwCreateKey, ZwOpenKey, ZwClose будут добавлены, работать должно только на Windows XP.

Скажите, это жизнеспособный вариант или глупость?

Спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.04.2017, 23:09
Ответы с готовыми решениями:

Хук
Добрый день. Питаюсь отправить админу письмо при публикации поста пример (...

Хук
MSG msg; while(GetMessage(&msg,NULL,0,0)) TranslateMessage(&msg), DispatchMessage(&msg);...

Хук клавиатуры
вот хороший клавиатурный хук, который я использую для отлова клавиши PrtSc(код ниже). При...

Хук клавиатуры
Доброго времени суток, я пытаюсь сделать хук клавиатуры столкнулся с таким вопросом. Как сделать...

13
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
30.04.2017, 08:39 2
Цитата Сообщение от shtuceron Посмотреть сообщение
Скажите, это жизнеспособный вариант или глупость?
Почему глупость? Это вполне нормальный подход. Я бы даже сказал - традиционный.
Разумеется, доступ к generic table должен быть синхронизирован.

Только кроме ZwCreateKey и ZwOpenKey надо и все остальное перехватывать,
что может создавать хэндлы реестра, например ZwDuplicateObject.
0
0 / 0 / 0
Регистрация: 26.08.2013
Сообщений: 161
01.05.2017, 17:28  [ТС] 3
Цитата Сообщение от Убежденный Посмотреть сообщение
Только кроме ZwCreateKey и ZwOpenKey надо и все остальное перехватывать,
что может создавать хэндлы реестра, например ZwDuplicateObject.
Скажите, а есть ли где-нибудь источник всех остальных функций которые надо перехватывать? Согласно документации указано всего две (ZwCreateKey, ZwOpenKey).
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
01.05.2017, 21:57 4
Ну можно, например, посмотреть все Nt/Zw-экспорты из ntdll.dll и по их именам
определить, какие работают с реестром и какие приводят к открытию или
созданию или дуплицированию хэндла.
0
0 / 0 / 0
Регистрация: 26.08.2013
Сообщений: 161
03.05.2017, 12:24  [ТС] 5
Цитата Сообщение от Убежденный Посмотреть сообщение
Ну можно, например, посмотреть все Nt/Zw-экспорты из ntdll.dll и по их именам
определить, какие работают с реестром и какие приводят к открытию или
созданию или дуплицированию хэндла.
А правильно ли я понимаю, что функция закрытия хэндла всегда ZwClose? В хуке ZwClose после удаления хэндла из Generic Table количество элементов таблицы не равно нулю, даже после бездействия системы около 30 минут.

Значит ли это, что хэндл кто-то держит?

Добавлено через 2 минуты
После закрытия всех окон и ожидания в 30 минут количество элементов в Generic Table равно 1.

Добавлено через 24 минуты
На всякий случай привожу код очистки Generic Table:

C++
1
2
3
4
5
6
7
8
9
ExAcquireFastMutex(&keyHandleMutex);
        
pSelectedKeyHandleContext = (KEY_HANDLE_CONTEXT *)RtlLookupElementGenericTable(&keyHandleGenericTable, 
                                                                                       &keyHandleContext);
 
if (pSelectedKeyHandleContext != NULL)
      RtlDeleteElementGenericTable(&keyHandleGenericTable, pSelectedKeyHandleContext);
 
ExReleaseFastMutex(&keyHandleMutex);
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
03.05.2017, 13:11 6
Цитата Сообщение от shtuceron Посмотреть сообщение
А правильно ли я понимаю, что функция закрытия хэндла всегда ZwClose?
Нет
ZwDuplicateObject тоже умеет закрывать хэндлы.

Цитата Сообщение от shtuceron Посмотреть сообщение
В хуке ZwClose после удаления хэндла из Generic Table количество элементов таблицы не равно нулю, даже после бездействия системы около 30 минут.
Значит ли это, что хэндл кто-то держит?
Возможно.
Но это обычно не является проблемой. Главное, чтобы это не было утечкой...
0
0 / 0 / 0
Регистрация: 26.08.2013
Сообщений: 161
03.05.2017, 13:22  [ТС] 7
Цитата Сообщение от Убежденный Посмотреть сообщение
ZwDuplicateObject тоже умеет закрывать хэндлы.
А она закрывает только "свои" (порожденные) хэндлы или для нее нет никакой разницы что закрывать?

Добавлено через 3 минуты
Цитата Сообщение от Убежденный Посмотреть сообщение
Возможно.
Хочется воспользоваться функцией ObReferenceObjectByHandle для того чтобы узнать используется хэндл или нет. Это подходящее решение?
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
03.05.2017, 15:49 8
Цитата Сообщение от shtuceron Посмотреть сообщение
А она закрывает только "свои" (порожденные) хэндлы или для нее нет никакой разницы что закрывать?
Что значит "свои"?

Цитата Сообщение от shtuceron Посмотреть сообщение
Хочется воспользоваться функцией ObReferenceObjectByHandle для того чтобы узнать используется хэндл или нет. Это подходящее решение?
Хочешь узнать, открыт ли хэндл или нет?
Лучше в отладчике попробовать команду !handle
0
0 / 0 / 0
Регистрация: 26.08.2013
Сообщений: 161
03.05.2017, 16:16  [ТС] 9
Цитата Сообщение от Убежденный Посмотреть сообщение
Что значит "свои"?
Созданные с помощью ZwDuplicateObject

Цитата Сообщение от Убежденный Посмотреть сообщение
Лучше в отладчике попробовать команду !handle
Спасибо!
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
03.05.2017, 16:19 10
Цитата Сообщение от shtuceron Посмотреть сообщение
Созданные с помощью ZwDuplicateObject
ZwDuplicateObject создает хэндл-дубликат. И может при этом закрыть исходный хэндл.
См. ее описание в MSDN.
0
0 / 0 / 0
Регистрация: 26.08.2013
Сообщений: 161
05.05.2017, 11:42  [ТС] 11
Можете еще, пожалуйста, ответить на один детский вопрос?

При поиске элемента из Generic Table (функция RtlLookupElementGenericTable), нужно производить синхронизацию. Нужно ли оставаться в этом состоянии при работе с найденным элементом?

Достаточно ли этого:
C
1
2
3
4
5
6
ExAcquireFastMutex(&keyHandleMutex);
pSelectedKeyHandleContext = (KEY_HANDLE_CONTEXT *)RtlLookupElementGenericTable(&keyHandleGenericTable, &keyHandleContext);
ExReleaseFastMutex(&keyHandleMutex);
 
if (pSelectedKeyHandleContext != NULL)
     ...
Или правильно делать так:
C
1
2
3
4
5
6
7
ExAcquireFastMutex(&keyHandleMutex);
pSelectedKeyHandleContext = (KEY_HANDLE_CONTEXT *)RtlLookupElementGenericTable(&keyHandleGenericTable, &keyHandleContext);
 
if (pSelectedKeyHandleContext != NULL)
     ...
 
ExReleaseFastMutex(&keyHandleMutex);
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
05.05.2017, 11:53 12
Представь такой случай: поток А извлек pSelectedKeyHandleContext и освободил mutex.
И сразу после этого поток Б вызвал ZwClose, т.е. item был удален из table, а память
освобождена. И как только поток А попытается работать с этим item-ом, получим
расстрел памяти.
1
0 / 0 / 0
Регистрация: 26.08.2013
Сообщений: 161
05.05.2017, 12:18  [ТС] 13
Все понял, спасибо.

Добавлено через 3 минуты
А если функция рекурсивно вызывается?

Добавлено через 18 минут
Я бы даже не так спросил... Можно ли как-нибудь проверить, захвачен ли mutex или нет?
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
05.05.2017, 13:20 14
Цитата Сообщение от shtuceron Посмотреть сообщение
Я бы даже не так спросил... Можно ли как-нибудь проверить, захвачен ли mutex или нет?
Можно флажок какой-нибудь использовать.
Причем я бы писал туда ETHREAD потока, который захватил мьютекс.
Это удобно при диагностике различных дедлоков.
0
05.05.2017, 13:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.05.2017, 13:20
Помогаю со студенческими работами здесь

Хук на C# (Hook on C#)
добрый день. знаю на форуме много тем про всякие хуки клавиатуры или мыши, но вирусные программы...

Хук клавиатуры
Нужно написать глобальный хук для клавиатуры. Сам хук у меня уже есть, но не могу никак проверить...

Сложный хук
Доброго времени уважаемые люди) На тему хуков много написано и спрошено, всё перерыл, клава и мышка...

Хук на клавиатуру
Как собственно реализуется? И тяжело ли реализовать что-то вроде punto switcher-а ( только...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru