инжект через APC. проблемы.

Тема в разделе "WASM.NT.KERNEL", создана пользователем krabz, 6 ноя 2010.

  1. krabz

    krabz New Member

    Публикаций:
    0
    Регистрация:
    26 май 2010
    Сообщения:
    135
    Приветствую!

    Задача такая: из драйвера внедрить и выполнить код во всех процессах, которые запущены на момент загрузки драйвера.

    Перечисляю процессы, для каждого нахожу поток, у которого ThreadState == StateWait, WaitReason == {DelayExecution | WrDelayExecution | UserRequest | WrUserRequest}. Данные из ZwQuerySystemInformation. Далее, патчу KTHREAD: Alertable = 1, затем KeStackAttachProcess, выделяю память через ZwAllocateVirtualMemory, записываю туда код, затем KeInitializeApc, KeInsertQueueApc, ну способ известен всем.

    Этот метод работает отлично, если таким образом внедрять код на этапе запуска процесса - в нотификаторе загрузки образа. И с большинством уже запущенных процессов прокатывает, но не со всеми. Удалось локализовать процесс, с которым не всё OK. Шелкод сведён к минимуму:
    Код (Text):
    1. int3
    2. xor eax, eax
    3. ret 12
    Останавливаемся на int 3, смотрим далее: ret 12 возвращает нас в ntdll.dll, где выполняется следующий код:
    Код (Text):
    1. push 1
    2. push edi
    3. call NtContinue
    И вот после вызова NtContinue происходит AV в функции RtlFreeHeap. Непонятно. Уж мой код точно не трогает Heap. И почему-то в большинстве случаев метод срабатывает.

    Я понимаю, что патчить KTHREAD не совсем хорошо, т.к. не зря же там флаг Alertable существует. Возможно, в некоторых случаях выполнение APC действительно недопустимо. Потоков у любого процесса несколько, поэтому можно выбрать тот, который не страшно и пропатчить. Вопрос: как?

    И также непонятно почему происходит AV. И как это связано с патчингом KTHREAD и доставкой APC. Ведь код внутри неё выполняется стабильно, а исключение возникает, очевидно, в родном коде процесса.

    У кого нибудь есть идеи?

    Заранее благодарю.
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    TrapFrame.Ip -> @Payload().