
Доказательство концепции, демонстрирующее обратные вызовы инструментирования на Windows 10 21h1 с использованием переменной TLS для обеспечения перехвата всех системных вызовов.
Инструментационные обратные вызовы — это довольно интересная недокументированная часть Windows. Весь код в этом репозитории распространяется по лицензии MIT. В этом репозитории используется стиль C++ с отступами от Google.
PR приветствуются, если вы нашли проблемы, ошибки или считаете, что следует добавить какую-то конкретную функцию.
Инструментационные обратные вызовы позволяют обрабатывать все системные вызовы (и исключения!), отправленные процессом, на который вы установили обратный вызов.
Конечно, каждый системный вызов будет перехвачен, поэтому во время выполнения обратного вызова обычно не следует выполнять внутри него никаких дополнительных системных вызовов, если только вы не хотите попасть в бесконечную рекурсию.
Это сильно ограничило бы то, что можно сделать внутри обратного вызова, или, по крайней мере, поставило бы некую задачу проектирования, но в следующем абзаце вы увидите достаточно элегантное решение проблемы.
Оно не идеально, так как злоумышленник может намеренно установить переменную для отключения обратного вызова, но для целей анализа это почти идеально.
Одним из решений этой проблемы может быть установка флага true/false, включающего и отключающего аналитические возможности обратного вызова, что позволяет пропускать все системные вызовы, если другой системный вызов уже обрабатывается.
Однако это позволит пропускать большинство системных вызовов.
Этот репозиторий, напротив, решает проблему невозможности выполнения системных вызовов внутри обратного вызова, устанавливая TLS-зависимую переменную, что гарантирует обработку системных вызовов от всех потоков, при этом имея возможность вызывать их самостоятельно. Единственные системные вызовы, которые мы пропустим, — это те, которые мы выполняем внутри обратного вызова, и которые (в большинстве ситуаций, например, при анализе программного обеспечения) нам, скорее всего, не важны.
У инструментационных обратных вызовов много возможных применений; одно из них — для защиты от читов: можно анализировать системные вызовы, поступающие от процесса, и определять, исходят ли они из незаконного адресного пространства или используются в неблаговидных целях, без необходимости заполнять системные DLL байт-патчами и хуками.
Также их можно использовать для получения возможности выполнять код внутри процесса: если вы можете выделить и записать память, а затем установить информацию о процессе, вы сможете захватить поток, выполняющий системный вызов, заставив его вызвать ваш обратный вызов.
Конечно, я не одобряю использование любого кода из этого или моих других репозиториев для разработки читерского или вредоносного ПО.
То, что вы делаете с этим, — ваша собственная ответственность.