CreateRemoteThread из kernel-mode

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

  1. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    В "Process and Thread Functions" не вижу.
     
  2. Sherlock

    Sherlock New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2006
    Сообщения:
    28
    Т.е. имеется ввиду хуканье функций типа чтение файла/реестра? Чтобы внутри посмотреть тред какого процесса её вызвал, а потом заставить его выполнить CreateThread. В этом идея? А можно примерчик с рабочим кодом поглядеть?
     
  3. fr0b-p

    fr0b-p New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2006
    Сообщения:
    118
    >> Приложение может вообще не вызывать никаких апишных функций

    ага... еще может быть не запущено ни одного приложения :)) напомню что мой пример был не более как дополнение к уже перечисленным "всем путям"...

    >> В "Process and Thread Functions" не вижу

    да-да... я о том и писал :dntknw:

    >> Чтобы внутри посмотреть тред какого процесса её вызвал

    у каждого процесса свое адресное пространство
     
  4. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Sherlock
    rav прав. Код с RtlCreateUserThread не работал именно поэтому. Под Win2000 используется механизм "int 2eh", под WinXP - sysenter, поэтому там происходит зависание.
    С ZwCreateThread у тебя проблемы были по этой же причине. Надо брать адрес ZwCreateThread через SDT. (С RtlCreateUserThread не прокатит, потому что это не сервис)
     
  5. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    fr0b-p
    Испугался сразу про множество документированных способов и невнимательно прочитал :)
     
  6. fr0b-p

    fr0b-p New Member

    Публикаций:
    0
    Регистрация:
    1 окт 2006
    Сообщения:
    118
    >> Под Win2000 используется механизм "int 2eh", под WinXP - sysenter, поэтому там происходит зависание

    на самом деле в XP используется не sysenter а __оба__ механизма... и выбор за нами...
    Код (Text):
    1. ntdll.ZwCreateThread     B8 35000000        mov     eax, 35
    2. 7C90D7D7                 BA 0003FE7F        mov     edx, 7FFE0300
    3. 7C90D7DC                 FF12               call    near [edx]
    4. 7C90D7DE                 C2 2000            retn    20
    >> Испугался сразу про множество документированных способов

    документация разная... что-то написано в IFS но не в DDK.. что то тока на OSR и это уже гуд! какая-нибудь UlLogZombieConnection это да, полностью недокументирвано

    а возьмем общеизвечтный способ через CONTEXT... работа с ним документирована но сам способ считается хаком... (кста если не писать в эту структуру это общеизвестный способ ли нет ?:)
     
  7. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    Sherlock

    Да извиняюсь, не доконца прочитал. Итак в чужом процессе невозможно создать поток из драйвера ядра, поскольку мепирование памяти (регистр CR3) для каждого процесса user mode разный, и доступа к памяти пользователя в ином контексте получить используя что-то типа ZwCreateThread да еще из библиотеки ntdll.dll (она же доступна и разрабатывалась для использования в user mode), и второй вопрос - как передать параметры, ведь память процесса А на процесс Б автоматически не мепируется.
     
  8. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Создать можно без проблем (см. параметр ProcessHandle в ZwCreateProcess). Нельзя будет его зарегистрировать в csrss из-за странностей его реализации.
    Через стек. Стек ведь создается в адресном пространстве процесса Б
     
  9. Sherlock

    Sherlock New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2006
    Сообщения:
    28
    PROFi
    Я отказался от идеи создать поток напрямую. Главным образом потому, что мне нужно работать с юзермодным API. Вместо этого разделил задачу на две части:
    1. ищу нужный мне процесс ZwQuerySystemInformation, затем аллокирую в нём буфер в виртуальной памяти ZwAllocateVirtualMemory(..., PAGE_EXECUTE_READWRITE), записываю туда инжектируемый код.
    2. по аналогии с описанным здесь http://www.wasm.ru/article.php?article=CreateProcessKrnl (с) Cardinal приёмом нахожу в первом попавшемся на хук процессе kernel32.dll, OpenProcess и CreateRemoteThread. Затем заставляю процесс создать удалённый поток в моём процессе, подсовывая в качестве параметра адрес буфера с ранее записанным кодом.

    Единственное, почему-то на XP SP2 этот трюк не срабатывает, исходный код из статьи не работает тоже. Буду разбираться.
     
  10. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    Sherlock

    А кто тебе мешает написать библиотеку inject.dll см. выше мое сообщение от 24.10, и при старте в StartDLL этой библиотеки создать ветвь в инжектируемом поцессе, причем функцию CreateThread и все остальные будет импортировать эта библиотека.
    Самое важное - зать адрес LodadLybraryA остальное дело техники. А его узнать можно (см. Раскрутка стека обработки исключений)
     
  11. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    gilg

    Мы говорим о user mode или о kernel mode - в user mode ntdll.dll - работает в kernel mode - работает только 1/7 ее част да и то с оговорками.
     
  12. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Значительная часть (дабы не сказать вся, потому что лично не проверял) всей ntdll - просто вызов сервисов ядра. Многие из этих сервисов не экспортируются ядром (см. список в приложении у Неббета), но вызывать их никто не мешает. Когда идет речь о вызове нативных юзер-модных функций, как раз и подразумеваются такие сервисы.
    ZwCreateThread также входит в их число.

    ЗЫ: Так что если говорить совсем точно, юзер-модный код нигде из ядра и не вызывается. Это было бы криво + на 98% не работало бы на ОСях начиная с XP
     
  13. Sherlock

    Sherlock New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2006
    Сообщения:
    28
    Мешают 2 вещи: во-первых не хочется делать отдельную dll. А во-вторых, честно признаюсь, я просто не понял твоё решение.