CreateRemoteThread из kernel-mode

Discussion in 'WASM.NT.KERNEL' started by Sherlock, Oct 19, 2006.

  1. Sherlock

    Sherlock New Member

    Blog Posts:
    0
    Доброго времени суток !

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

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

    MegaZu New Member

    Blog Posts:
    0
    Поиск по форуму => APC
     
  3. Sherlock

    Sherlock New Member

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

    Sherlock New Member

    Blog Posts:
    0
    По APC, поиск показал что нужно смотреть в сторону: KeAttachProcess -> KeInitializeApc -> KeInsertQueueApc ... Правильно ?

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

    MegaZu New Member

    Blog Posts:
    0
    угу

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

    n0name New Member

    Blog Posts:
    0
    ИМХО Шрайбер лучше =)
     
  7. gilg

    gilg New Member

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

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

    censored New Member

    Blog Posts:
    0
    gilg
    а под XP+ int xx будет работать?
     
  9. gilg

    gilg New Member

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

    n0name New Member

    Blog Posts:
    0
    censored
    угу.
     
  11. Sherlock

    Sherlock New Member

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

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

    Sherlock New Member

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

    gilg New Member

    Blog Posts:
    0
    В драйвере всегда kernel. В юзер-моде можно выполнить только юзер-модную APC
    Да
    В драйвере такое тоже вполне возможно. Нужно только установить правильный контекст через KeStackAttachProcess. Хендл можно найти через PEB процесса
     
  14. n0name

    n0name New Member

    Blog Posts:
    0
    примерно так и поступают =)
    По крайне мере в вышеуказанном Шрайбере есть и поиск модулей и функций. Если качать долго, то скачай только примеры к книге, там всё есть.
     
  15. Sherlock

    Sherlock New Member

    Blog Posts:
    0
    На sysinternals пишут, что native вызовы сводятся к коду вида:

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

    n0name New Member

    Blog Posts:
    0
    поищи, где то было, но можно определять в процессе выполнения, дизасмом аналогичных функций в ntdll.dll
     
  17. Sherlock

    Sherlock New Member

    Blog Posts:
    0
    Пробую работать через 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

    Blog Posts:
    0
    *((unsigned char *)pThread+0x4a)=1;
     
  19. Demon666

    Demon666 New Member

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

    P. S.
    %)
     
  20. fr0b-p

    fr0b-p New Member

    Blog Posts:
    0
    >> Можно ли принудительно перевести тред в alertable?

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