0 / 0 / 0
Регистрация: 26.08.2013
Сообщений: 161
|
|
1 | |
Хук на ZwEnumerateKey29.04.2017, 23:09. Показов 1003. Ответов 13
Метки нет (Все метки)
Добрый день, помогите советом.
Есть у меня один драйвер, который перехватывает функцию ZwEnumerateKey и скрывает определенные ключи в реестре. Все работает отлично, но недавно повнимательнее решил посмотреть в отладчике на его работу. Выяснил, что к этой функции могут обращаться из разных потоков и мне просто очень везло, что ключи скрываются в моей ветке. Решил это исправить. Для этих целей придумал следующий механизм: инициализировать Generic Table (которая будет хранить индекс ключа перебора) и помещать в него указатель ((int)keyHandle) функций ZwCreateKey, ZwOpenKey, а в функции ZwClose удалять запись из Generic Table по keyHandle. В ZwEnumerateKey по keyHandle обращаться к Generic Table и извлекать соответствующие индексы для скрытия ключей. PS: хуки на ZwCreateKey, ZwOpenKey, ZwClose будут добавлены, работать должно только на Windows XP. Скажите, это жизнеспособный вариант или глупость? Спасибо.
0
|
29.04.2017, 23:09 | |
Ответы с готовыми решениями:
13
Хук Хук Хук клавиатуры Хук клавиатуры |
Ушел с форума
|
|
30.04.2017, 08:39 | 2 |
Почему глупость? Это вполне нормальный подход. Я бы даже сказал - традиционный.
Разумеется, доступ к generic table должен быть синхронизирован. Только кроме ZwCreateKey и ZwOpenKey надо и все остальное перехватывать, что может создавать хэндлы реестра, например ZwDuplicateObject.
0
|
0 / 0 / 0
Регистрация: 26.08.2013
Сообщений: 161
|
|
01.05.2017, 17:28 [ТС] | 3 |
Скажите, а есть ли где-нибудь источник всех остальных функций которые надо перехватывать? Согласно документации указано всего две (ZwCreateKey, ZwOpenKey).
0
|
Ушел с форума
|
|
01.05.2017, 21:57 | 4 |
Ну можно, например, посмотреть все Nt/Zw-экспорты из ntdll.dll и по их именам
определить, какие работают с реестром и какие приводят к открытию или созданию или дуплицированию хэндла.
0
|
0 / 0 / 0
Регистрация: 26.08.2013
Сообщений: 161
|
||||||
03.05.2017, 12:24 [ТС] | 5 | |||||
А правильно ли я понимаю, что функция закрытия хэндла всегда ZwClose? В хуке ZwClose после удаления хэндла из Generic Table количество элементов таблицы не равно нулю, даже после бездействия системы около 30 минут.
Значит ли это, что хэндл кто-то держит? Добавлено через 2 минуты После закрытия всех окон и ожидания в 30 минут количество элементов в Generic Table равно 1. Добавлено через 24 минуты На всякий случай привожу код очистки Generic Table:
0
|
Ушел с форума
|
|
03.05.2017, 13:11 | 6 |
Нет
ZwDuplicateObject тоже умеет закрывать хэндлы. Возможно. Но это обычно не является проблемой. Главное, чтобы это не было утечкой...
0
|
0 / 0 / 0
Регистрация: 26.08.2013
Сообщений: 161
|
|
03.05.2017, 13:22 [ТС] | 7 |
А она закрывает только "свои" (порожденные) хэндлы или для нее нет никакой разницы что закрывать?
Добавлено через 3 минуты Хочется воспользоваться функцией ObReferenceObjectByHandle для того чтобы узнать используется хэндл или нет. Это подходящее решение?
0
|
Ушел с форума
|
|
03.05.2017, 15:49 | 8 |
Что значит "свои"?
Хочешь узнать, открыт ли хэндл или нет? Лучше в отладчике попробовать команду !handle
0
|
0 / 0 / 0
Регистрация: 26.08.2013
Сообщений: 161
|
|
03.05.2017, 16:16 [ТС] | 9 |
0
|
Ушел с форума
|
|
03.05.2017, 16:19 | 10 |
ZwDuplicateObject создает хэндл-дубликат. И может при этом закрыть исходный хэндл.
См. ее описание в MSDN.
0
|
0 / 0 / 0
Регистрация: 26.08.2013
Сообщений: 161
|
|||||||||||
05.05.2017, 11:42 [ТС] | 11 | ||||||||||
Можете еще, пожалуйста, ответить на один детский вопрос?
При поиске элемента из Generic Table (функция RtlLookupElementGenericTable), нужно производить синхронизацию. Нужно ли оставаться в этом состоянии при работе с найденным элементом? Достаточно ли этого:
0
|
Ушел с форума
|
|
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
|
Ушел с форума
|
|
05.05.2017, 13:20 | 14 |
Можно флажок какой-нибудь использовать.
Причем я бы писал туда ETHREAD потока, который захватил мьютекс. Это удобно при диагностике различных дедлоков.
0
|
05.05.2017, 13:20 | |
05.05.2017, 13:20 | |
Помогаю со студенческими работами здесь
14
Хук на C# (Hook on C#) Хук клавиатуры Сложный хук Хук на клавиатуру Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |