Где сохраняется контекст потока и можно ли получить к нему программный доступ (без изменения ядра)?

#windows #multithreading #kernel #scheduler

Вопрос:

Переключение контекста Windows

Планировщик поддерживает очередь исполняемых потоков для каждого уровня приоритета. Они известны как готовые потоки. Когда процессор становится доступным, система выполняет переключение контекста. Шаги при переключении контекста следующие:

  • Сохраните контекст потока, который только что завершил выполнение.
  • Поместите поток, который только что завершил выполнение, в конец очереди для его приоритета.
  • Найдите очередь с наивысшим приоритетом, содержащую готовые потоки.
  • Удалите поток во главе очереди, загрузите его контекст и выполните его.

Я еще мало знаю об этой теме, поэтому не знаю, как развить свой вопрос. Где сохраняется контекст потока и можно ли получить к нему доступ (редактировать: читать) программно (без изменения ядра)?

Комментарии:

1. Из любопытства, как вы думаете, что могла бы сделать ваша программа, если бы она могла изменять контексты своих собственных приостановленных потоков?

2. @SolomonSlow, возможно, не изменит, просто прочтет для целей сканирования. Инструменты кибербезопасности.

3. Хмм… Я удаляю свой предыдущий комментарий. Я не очень ясно обдумывал этот вопрос. Вполне вероятно, что в Windows есть API отладки . (Как еще отладчик может работать в ОС с защищенным режимом?) Я не знаю, где бы вы это искали, но, вероятно, это то, что вам нужно.

4. @SolomonSlow это так, но как вредоносные, так и неопасные программы пытаются предотвратить отладку, легко обнаружить, что отладчик подключен.

5. AFAIK, контекст потока хранится в структурах данных ядра, и вы не можете получить к нему прямой доступ без привилегированных прав и, скорее всего, не с земли пользователя. Я не знаком с ядром Windows, но модули ядра Linux могут легко получить доступ к информации о расписании, поэтому я думаю, что службы Windows в режиме ядра тоже могли бы это сделать.

Ответ №1:

Если у вас есть дескриптор потока с необходимыми правами доступа, вы можете приостановить поток, а затем позвонить GetThreadContext . Когда поток запущен, значения находятся в реальных регистрах процессора, когда он не запущен, контекст хранится в памяти, недоступной из пользовательского режима.

Контекст хранит значения различных регистров процессора, он полезен только отладчикам и расширенным функциям, таким как ввод кода и регистрация ошибок.