KeUserModeCallback

Тема в разделе "WASM.BEGINNERS", создана пользователем link, 16 май 2009.

  1. link

    link Member

    Публикаций:
    0
    Регистрация:
    3 янв 2008
    Сообщения:
    52
    Можно ли загрузить свою dll с помощью KeUserModeCallback и CreateRemoteThread из режима ядра?
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ну попробуй) Если окажешься в контексте нормального потока, уведомленного csrss, то вроде бы да
     
  3. JCronos

    JCronos New Member

    Публикаций:
    0
    Регистрация:
    5 апр 2009
    Сообщения:
    98
    http://wasm.ru/forum/viewtopic.php?id=32231
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    То зло.
    1. Захват контекста без перехвата. Нужно искать PsSuspendProcess(). Далее из неё извлекаем PsGetNextProcessThread().
    - Вызываем PsSuspendProcess(), все потоки останавливаются.
    - Выделяем память в процессе и записываем туда обработчик.
    - Перечисляем потоки посредством PsGetNextProcessThread(), получаем контекст посредством PsGetContextThread(есть в экспорте), извлекаем из контекста указатель на стек, сохраняем его в юзермодном стеке(выполнять на PASSIVE_LEVEL, если запись в сторожевую страницу стека он будет в этом случае расширен и не обработанное исключение не возникнет), сохраняем тамже Eip, EFlags, Ss, Cs(формируем фрейм для возврата инструкцией Iretd, после отработки нашего обработчика выполняем возврат на прерванный код посредством этой инструкции, разумеется без смены DPL). Затем сохраняем изменённый контекст посредством PsSetContextThread.
    - Выполняем PsResumeProcess.
    - Наш обработчик вызывается в контексте всех рабочих потоков. Атомарно проверяем флажёк, если он взведён выполняем возврат, иначе взводим его и выполняем дальгейшую обработку, тем самым отклонив остальные вызовы.
    2. Захват контекстов используя сторожевые страницы.
    - Регистрируем диспетчер исключений.
    - Страница пямяти общая для всех потоков(например в секции кода нтдлл) помечается как сторожевая(GUARD).
    - Обрабатываем STATUS_GUARD_PAGE_VIOLATION. В контексте текущего потока изменяем Eip на наш код, формируем Iretd-фрейм в стеке для возврата. Выполняем возврат.
    - Исключение возникает однократно, после первого обращения к сторожевой странице атрибут PAGE_GUARD снимается автоматически.
     
  5. link

    link Member

    Публикаций:
    0
    Регистрация:
    3 янв 2008
    Сообщения:
    52
    Проще было сорс кинуть))) Чем псевдокодом писать
     
  6. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    Это anti-script kiddis protection. Если захочешь разобраться то разберешься, а если нужен готовый код то...
     
  7. link

    link Member

    Публикаций:
    0
    Регистрация:
    3 янв 2008
    Сообщения:
    52
    1-м способ возможно внедриить длл в любой процесс? И можешь ли кинуть ссылку про атомарные проверки!
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Да. Наш код выполняется в контексте полноценном. На счёт атомарных проверок:
    Код (Text):
    1. ;Все потоки перенаправлены на эту точку.
    2. ; - В стеке фрейм для возврата инструкцией Iretd.
    3. ; - Сохраняется все RGP.
    4. ; - Атомарный вызов обработчика.
    5. ; - Текущая страница доступна для записи.
    6.  
    7. THREAD_ENTRY_LOCK macro InterceptDispatcher
    8. Local Dt_, ThreadEntryLock
    9.     pushad
    10.     Call Dt_
    11. Dt_:
    12.     mov ecx,1
    13.     pop edx
    14.     xor eax,eax
    15.     lock cmpxchg dword ptr [edx + (offset ThreadEntryLock - offset Dt_)],ecx
    16.     .if Zero?
    17.     Call InterceptDispatcher
    18.     .endif
    19.     popad
    20.     iretd
    21. ThreadEntryLock BOOLEAN FALSE
    22. endm
    23.  
    24. THREAD_ENTRY macro
    25.     pushad
    26.     Call InterceptDispatcher
    27.     popad
    28.     iretd
    29. endm
    30.  
    31. ;THREAD_ENTRY_LOCK RemoteCallEntry
    32. ;RemoteCallEntry proc
    33. ;   [...]
     
  9. link

    link Member

    Публикаций:
    0
    Регистрация:
    3 янв 2008
    Сообщения:
    52
    Я так понял суть атомарной проверки в последовательном доступе каждого потока к процедуре?
     
  10. link

    link Member

    Публикаций:
    0
    Регистрация:
    3 янв 2008
    Сообщения:
    52
    Точнее в единственном доступе к коду! А вот этот весь код помещается в юзермодную память
     
  11. link

    link Member

    Публикаций:
    0
    Регистрация:
    3 янв 2008
    Сообщения:
    52
    А расположенные фреймы для возврата в текущее положение потока будут как распологаться в памяти? в каком то порядке или как?
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Код (Text):
    1. [Esp]:      Eip
    2. [Esp + 4]:  Cs
    3. [Esp + 8]:  EFlags
     
  13. link

    link Member

    Публикаций:
    0
    Регистрация:
    3 янв 2008
    Сообщения:
    52
    я просто до конца понять не могу, как мы узнаем какому потоку какой фрейм возвращать
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Нужно текущий юзермодный сохранить указатель на стек, флажки и Eip. Остальное обработчик сам в стеке сохранит - все RGP(pushad). А это мы из контекста извлекаем(для каждого потока вызывается PsGetContextThread).
     
  15. link

    link Member

    Публикаций:
    0
    Регистрация:
    3 янв 2008
    Сообщения:
    52
    Как найти PsSuspendProcess? NtSuspendProcess нашел через программку, попробывал запустить ничего не вышло
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    link
    Вторая вызывает первую. Дизассемблером
     
  17. link

    link Member

    Публикаций:
    0
    Регистрация:
    3 янв 2008
    Сообщения:
    52
    Как можно из секции PAGE заюзать эти функции драйвером?
     
  18. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    "Все" это какие - уточни.
     
  19. link

    link Member

    Публикаций:
    0
    Регистрация:
    3 янв 2008
    Сообщения:
    52
    в принципе лучше бы вообще знать как их оттуда можно пользовать. А интересуют PsGetNextProcessThread().PsSuspendProcess(), PsGetNextProcessThread
    PsResumeProcess.
     
  20. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    вы меня запутали). с чего должны быть ограничения на вызов функции при низком irql?)
    ограничения есть на некоторые функции при irql >= 2, но, поскольку у вас код в секции PAGE, то он (предполагается) будет вызван при irql < 2, а значит, что можно вызывать.