CreateRemoteThread из kernel-mode

Тема в разделе "WASM.NT.KERNEL", создана пользователем Sherlock, 19 окт 2006.

  1. Sherlock

    Sherlock New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2006
    Сообщения:
    28
    Доброго времени суток !

    Подскажите, плиз, можно ли из режима ядра создать поток в user-mode в чужом процессе. Хочу сделать инжект кода, но из драйвера. Аналога CreateRemoteThread в экспорте ntoskrnl.exe я не нашёл, ZwCreateThread из ntdll.dll почемуто ядром не экспортируется. Посоветуйте, пожалуйста, как можно выкрутиться.

    Заранее спасибо.
     
  2. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    Поиск по форуму => APC
     
  3. Sherlock

    Sherlock New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2006
    Сообщения:
    28
    Спасибо Вам, но не могли бы Вы меня-ламера в драйверном деле ткнуть в конкретные функции API? А также дать линки на доступное для среднего интеллекта чтиво по данной проблеме. Дело в том, что дравера {"hello world" не в счет} я не писал никогда, несмотря на многолетний опыт написания user-mod'ного кода под Win32.
     
  4. Sherlock

    Sherlock New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2006
    Сообщения:
    28
    По APC, поиск показал что нужно смотреть в сторону: KeAttachProcess -> KeInitializeApc -> KeInsertQueueApc ... Правильно ?

    Ещё вопрос, можно ли вызывать напрямую функции из ntdll.dll, которые ядром не экспортировались ? Например ту же ZwCreateThread. Если да, есть ли аналоги LoadLibrary / GetProcAddress для драйверов ?
     
  5. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    угу

    А что и самое главное куда вы будете грузить через LoadLibrary ?
    GetProcAddress аналогов нет, но можно вручную найти адреса которые интересуют. Примеры были на форуме.
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    ИМХО Шрайбер лучше =)
     
  7. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Можно. Либо через int <номер сервиса>, либо поиск адреса в ntdll.dll и вызов функции напрямую. Первый способ проще, и примеры также пробегали по форуму.

    Кстати, как раз у Шрайбера есть пример вызова ntdll-функций: "Dynamically binding to Ntdll.dll"
     
  8. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    gilg
    а под XP+ int xx будет работать?
     
  9. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    censored
    Под WinXP работает. Возможно, что не будет работать под WinXP на процах от AMD, но не проверял. Точно не будет работать под Win64, потому что там для вызова сервисов используется только syscall. Сам syscall из режима ядра вызывать нельзя.
    Там нужно вызывать функции по адресу, предварительно отмаппив все буферы на юзер-модные адреса.
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    censored
    угу.
     
  11. Sherlock

    Sherlock New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2006
    Сообщения:
    28
    Насчёт Шрайбера, в инете я нашёл pdf'ник. Но он большого размера, около 25 мегабайт. Качать долго, вдобавок очевидно что это отсканированный, а не от OCR'ный вариант. Кто-нибудь знает если ли где обычная текстовая версия этой книги ? Да, если кому нужно скан и ещё книги были обнаружены тут google.com

    Парочка глупых вопросов, sorry ... После вызова KeAttachProcess я могу делать чтение-запись в присоединенный процесс. При этом нахожусь в kernel-mode или в user ? Если в kernel, вызову ZwCreateThread поток будет работать в user-mode ?
     
  12. Sherlock

    Sherlock New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2006
    Сообщения:
    28
    Вы правы, глупость я написал. Скорее имелось ввиду аналог GetModuleHandle("kernel32.dll"). Чтобы потом имея хэндл библиотеки найти адрес нужной мне функции. Чтобы в конечном итоге вызвать её через APC. Вероятно в случае драйверов так не поступают, я же рассуждаю просто по-аналогии как бы я делал будучи в win32 приложении.
     
  13. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    В драйвере всегда kernel. В юзер-моде можно выполнить только юзер-модную APC
    Да
    В драйвере такое тоже вполне возможно. Нужно только установить правильный контекст через KeStackAttachProcess. Хендл можно найти через PEB процесса
     
  14. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    примерно так и поступают =)
    По крайне мере в вышеуказанном Шрайбере есть и поиск модулей и функций. Если качать долго, то скачай только примеры к книге, там всё есть.
     
  15. Sherlock

    Sherlock New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2006
    Сообщения:
    28
    На sysinternals пишут, что native вызовы сводятся к коду вида:

    Код (Text):
    1. mov    eax, индекс функции
    2. lea    edx, [esp+04]
    3. int    0x2E
    4. ret    ...
    Интересно, где-нибудь описано соответствие: название функции (например RtlCreateUserThread) - её индекс ?
     
  16. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    поищи, где то было, но можно определять в процессе выполнения, дизасмом аналогичных функций в ntdll.dll
     
  17. Sherlock

    Sherlock New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2006
    Сообщения:
    28
    Пробую работать через APC, инжект у меня выглядит так:

    1. получаю список процессов через ZwQuerySystemInformation
    2. перебираю все элементы типа SYSTEM_PROCESSES* pProcesses, ищу нужный процесс по имени, сравнивая pProcesses->ProcessName.Buffer с тем что мне нужно
    3. запоминаю id процесса и треда: pProcesses->ProcessId, pProcesses->Threads[0].ClientId.UniqueThread
    4. открываю процесс через ZwOpenProcess, создаю в нём место для кода через ZwAllocateVirtualMemoryhProc, &buf, ...) с параметром PAGE_EXECUTE_READWRITE
    5. цепляюсь к процессу, KeAttachProcess, копирую исполняемый код - memcpy(buf, ...)
    6. нахожу описатели PEPROCESS pEProcess и PETHREAD pThread через PsLookupProcessByProcessId и PsLookupThreadByThreadId.
    7. аллокирую место под PKAPC Apc = ExAllocatePool(...)
    8. инициализирую APC, KeInitializeApc(Apc, &pThread->Tcb, 0, NULL, NULL, buf, UserMode, NULL);
    9. ставлю в очередь: status = KeInsertQueueApc(Apc, NULL, NULL, UserMode);

    status == 1, но ... ничего не происходит. В качестве кода я просто записал последовательность из int3, т.е. "\xcc\xcc\xcc\xcc". По-идее если бы код выполнился, то программа юзера свалилась бы на брейкпойнте. Где я торможу ?!

    Есть гипотеза, что тред куда я пытаюсь поставиться в очередь - просто в не-alertable состоянии. Можно ли принудительно перевести тред в alertable?

    Спасибо всем кто сможет помочь.
     
  18. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    *((unsigned char *)pThread+0x4a)=1;
     
  19. Demon666

    Demon666 New Member

    Публикаций:
    0
    Регистрация:
    19 май 2006
    Сообщения:
    99
    Свен Шрайбер "Недокументированные возможности Windows 2000" Русское издание
    Размер 8,036 МБ, формат djvu
    +Исходники и откомпилированные примеры к книге Свена Шрайбера "Недокументированные возможности Windows 2000" ~500kb
    ссылька:
    xor 15

    P. S.
    %)
     
  20. fr0b-p

    fr0b-p New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2006
    Сообщения:
    118
    >> Можно ли принудительно перевести тред в alertable?

    может быть проще поставить АПЦ для всех тредов процесса ;)