
PoC-реализация для динамического маскирования стеков вызовов с помощью таймеров.
Этот репозиторий демонстрирует PoC-технику для динамической подмены стеков вызовов с помощью таймеров. Перед засыпанием нашего импланта мы можем поставить в очередь таймеры, чтобы перезаписать его стек вызовов поддельным, а затем восстановить исходный стек перед возобновлением выполнения. Таким образом, точно так же, как мы можем маскировать память, принадлежащую нашему импланту, во время сна, мы можем маскировать и стек вызовов нашего главного потока.
Полное техническое описание см. в сопутствующем посте в блоге здесь: https://www.cobaltstrike.com/blog/behind-the-mask-spoofing-call-stacks-dynamically-with-timers/.
По умолчанию PoC имитирует статический стек вызовов, взятый из spoolsv.exe:

Если указан флаг --dynamic, CallStackMasker перечислит все доступные потоки, найдет поток в нужном состоянии (WaitForSingleObjectEx) и имитирует его стек вызовов и стартовый адрес. Это продемонстрировано ниже:

NB: В качестве предостережения, этот PoC был протестирован на следующей сборке Windows:
22h2 (19045.2486)
Он не тестировался на других версиях и может не работать на других сборках Windows.