Приветствую! Задача такая: из драйвера внедрить и выполнить код во всех процессах, которые запущены на момент загрузки драйвера. Перечисляю процессы, для каждого нахожу поток, у которого ThreadState == StateWait, WaitReason == {DelayExecution | WrDelayExecution | UserRequest | WrUserRequest}. Данные из ZwQuerySystemInformation. Далее, патчу KTHREAD: Alertable = 1, затем KeStackAttachProcess, выделяю память через ZwAllocateVirtualMemory, записываю туда код, затем KeInitializeApc, KeInsertQueueApc, ну способ известен всем. Этот метод работает отлично, если таким образом внедрять код на этапе запуска процесса - в нотификаторе загрузки образа. И с большинством уже запущенных процессов прокатывает, но не со всеми. Удалось локализовать процесс, с которым не всё OK. Шелкод сведён к минимуму: Код (Text): int3 xor eax, eax ret 12 Останавливаемся на int 3, смотрим далее: ret 12 возвращает нас в ntdll.dll, где выполняется следующий код: Код (Text): push 1 push edi call NtContinue И вот после вызова NtContinue происходит AV в функции RtlFreeHeap. Непонятно. Уж мой код точно не трогает Heap. И почему-то в большинстве случаев метод срабатывает. Я понимаю, что патчить KTHREAD не совсем хорошо, т.к. не зря же там флаг Alertable существует. Возможно, в некоторых случаях выполнение APC действительно недопустимо. Потоков у любого процесса несколько, поэтому можно выбрать тот, который не страшно и пропатчить. Вопрос: как? И также непонятно почему происходит AV. И как это связано с патчингом KTHREAD и доставкой APC. Ведь код внутри неё выполняется стабильно, а исключение возникает, очевидно, в родном коде процесса. У кого нибудь есть идеи? Заранее благодарю.