CreateRemoteThread из kernel-mode

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

  1. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    KeAttachProcess работает, так как иначе она бы валилась в бсод

    Win2000 под VmWare. Погоняю под XP сегодня попозже или завтра
     
  2. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Сто пудов, под XP виснет. И ничего умного по этому поводу в голову не приходит
     
  3. Sherlock

    Sherlock New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2006
    Сообщения:
    28
    Уже хорошо, что проблема воспроизводится. Я посмотрел, файл с тестовой прожкой был неоднократно скачан. Может ещё люди присоединятся к обсуждению вопроса, дабы кризис идей не наступил. Тема ведь интересная и не широко исследованная. Я во всяком случае готового решения не нашёл.
     
  4. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Принципиальное решение понятно - вручную создавать стек, инициализировать контекст и вызывать ZwCreateThread, как в примере у Неббета. Его код, не считая регистрации в csrss, полностью рабочий во всех виндах в любом режиме. Интересно, почему падает RtlCreateUserThread. Она делает в точности то, что написано в первом предложении. Под Win2000 она даже не проверяет аргументы. Получается, что она претерпела изменения под XP. Вообще, если основная цель - все-таки написать рабочее приложение, пользуй ZwCreateThread. С ней все проще и понятней, хотя и чуть больше гемор...я
     
  5. Sherlock

    Sherlock New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2006
    Сообщения:
    28
    Здесь http://www.wasm.ru/forum/files/_1687450158__CreateThread.c есть пример, фактически то, что написано у Неббета. Я не смог этот код заставить работать даже в юзер-моде. Вызов ZwCreateThread тупо виснет. И у меня нет уверенности, что при работе в kernel пример заработает.
     
  6. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Код немного странноватый, но это мелочи. Для начала следует попробовать передавать ZwCreateThread вместо NULL инициализированную нулями структуру OBJECT_ATTRIBUTES. Плюс если EntryPoint потока не объявлена как naked и ожидает параметр, нужно поставить
    Код (Text):
    1. context.Esp = (ULONG)stack.ExpandableStackBase - 8
    В остальном вроде похоже на рабочий код
     
  7. Sherlock

    Sherlock New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2006
    Сообщения:
    28
    В аттаче мной правленный CreateThread.c
    Добавляю файл в проект alert'а,

    extern "C" HANDLE CreateUserThread(
    IN HANDLE hProcess,
    IN PVOID EntryPoint,
    IN ULONG RegEax,
    IN ULONG RegEbx
    );

    и вызов CreateUserThread(hProc, CallbackProc, 0, 0); Виснем на ZwCreateThread. Проверялось на XP SP2.
     
  8. n0name

    n0name New Member

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

    Sherlock New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2006
    Сообщения:
    28
    Архив не открывается, CRC error.
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    перезалил, теперь в zip
     
  11. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    Sherlock
    Обязательно драйвер должен работать в памяти мепируемой для инжектируемого процесса (уж CR3 точно не равен 39000h)
    Шаг 1 сбросить WP (write protect) флаг процессора
    Шаг 2 файл мепируестся полностью, а заголовок после мепирования можно изменять
    поэтому ищем (предварительно перехватив int 0Eh) "MZ" инжектируемого процесса
    туда и помещаем следующий код:
    Шаг 3
    Код (Text):
    1. call metka
    2. db "inject.dll",0
    3. metka:
    4. call LodadLybraryA
    5. stop:  jmp stop
    Шаг 4 уже из загружаемой библиотеки сообщаем драйверу что пора опять запускать приложение (т.е. восстанавливаем все что меняли и переходим на точку в которой возникло прерывание инжектируемого процесса)
     
  12. Sherlock

    Sherlock New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2006
    Сообщения:
    28
    Спасибо, я почитал. Однако статья не пролила свет на трабл с зависанием при вызове RtlCreateUserThread в kernel mode под XP. Работа с ZwCreateThread там тоже не показана, к сожалению.
     
  13. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    В приложении выдержка из кода, полностью рабочего на Win2000 и WinXP как из юзер-мода, так и из кернела (естественно, без возможности вызова юзер-модных функций). Вызывая ZwCreateThread из ядра, нужно отмаппить все буферы на юзер-модную память
     
  14. fr0b-p

    fr0b-p New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2006
    Сообщения:
    118
    >> Принципиальное решение понятно - вручную создавать стек, инициализировать контекст и вызывать ZwCreateThread, как в примере у Неббета

    достаточно заставить подходящий юзер тред выполнить CreateThread. путей этому множество в т.ч. документированных... тем более из ядра. какие есть проблемы не использовать эту простую возможность?
     
  15. rav

    rav New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2004
    Сообщения:
    159
    Адрес:
    Москва
    А как это, интересно, вы собрались через sysenter перейти из ring0 в ring0?
     
  16. Sherlock

    Sherlock New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2006
    Сообщения:
    28
    Спасибо, попробую. Хотя имхо этот код даже компилироваться не должен. Например, там объявлено PCONTEXT ctx86; т.е.
    ctx86 это указатель. Тем не менее заполняются поля структуры почему-то через точку
    ctx86.ContextFlags = CONTEXT_FULL_X86;
    ctx86.SegGs = 0;
    ctx86.SegFs = 0x38;

    Ты сам-то этот код проверял ?
     
  17. Sherlock

    Sherlock New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2006
    Сообщения:
    28
    Сорри за глупый вопрос, ... а как это сделать? APC не предлагать, поскольку далеко не факт что в процессе имеется тред в alertable состоянии. Какие ещё варианты существуют?
     
  18. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    rav
    Никак. Функция должна вызываться по адресу в ntoskrnl. Адрес найти можно через SDT

    Sherlock
    Я определения переменных из другого места выдирал, поэтому могут быть неточности. Сам по себе код 100% рабочий.

    В том-то и дело, что таких путей всего 3. Документированных нет вообще. APC, например, недокументированы. Еще два: создать поток, что здесь и обсуждается, и изменить контекст выполняющегося потока через ZwSetContextThread. Проблем там гораздо больше, чем в этом способе
     
  19. fr0b-p

    fr0b-p New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2006
    Сообщения:
    118
    >> А как это, интересно, вы собрались через sysenter перейти из ring0 в ring0?

    я написал "юзер тред", то есть имелось ввиду что тред в момент вызова функции будет не в ядре.

    >> APC, например, недокументированы

    например, 2я ссылка из гугла http://www.microsoft.com/msj/0799/nerd/nerd0799.aspx

    >> В том-то и дело, что таких путей всего 3

    3й общеизвестный способ вызвать CreateThread это падч часто вызываемой функции, здесь же обсуждается все сделать руками.

    так же добавлю, что CreateThread (и далее по цепочке) не единственный способ создавать треды (это есть в MSDN)
     
  20. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Приложение может вообще не вызывать никаких апишных функций. Кстати, в этом примере поток создается как раз в контексте такого приложения
    Цитата из этой статьи:
    Asynchronous procedure calls (APCs), which are not documented in the Windows NT DDK, but are partially present in the ever-tremendous NTDDK.H file (see Figure3), almost fit the bill... They are used extensively throughout Windows NT, but are not well represented outside the confines of Microsoft® code. Although no DDK documentation exists, APCs make cameo appearances in the ReadFileEx and WriteFileEx Win32 API calls.