Внедрение длл через QueueUserAPC

Тема в разделе "WASM.WIN32", создана пользователем coocky, 16 апр 2008.

  1. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Привет.Подскажите плиз-вот есть на рутките такая статья https://www.rootkit.com/newsread.php?newsid=715
    Однако там записывается шелкод в память.

    Подскажите плиз,как можно через QueueUserAPC загрузить длл в процесс
    1. без шелкода.
    2.В уже запущенный процесс (по ссылке в запускаемый)
    Возможно ли это?
    Т.е хочется обойти глюкавый метод Рихтера через запуск удаленного потока.Все твердят об QueueUserAPC,однако примера нигде не видел,кроме приведденого..
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    В теории все просто. Ищешь описатель процесса, открываешь его, перечисляешь потоки, посылаешь апц, одному из потоку (а лучше всем сразу).

    Тока есть заморочки с Alertable состоянием потока и еще с ядерной переменной потока (в KTHREAD) UserApcPending
    Про это можно почитать тут:
    http://www.ddj.com/windows/184416590;jsessionid=NA2WVOAB01OLAQSNDLRCKHSCJUNN2JVN?pgno=1
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Плохой способ, даже вообже не применимый. Поток может находится в состоянии ожидания с запретом на обработку очереди потока. Точка обработчика APC таже что и нового потока - KiUserApcDispatcher. Возникнут проблемы с синхронизацией. Да темболее внедрять модуль!
    Наилучший способ - перехват через механизм исключений или хуком выхода из сервиса(KiFastSystemCallRet). Исходники давно выложены.
     
  4. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    Clerk
    Не будет никаких проблем. Ибо модуль загружается 1 раз. Остальные вызовы пройдут в фалиед - ничего страшного.
    Если ты видишь там проблемы - обоснуй их конкретно.

    Я реализовывал такое и могу сказать на 100 процентов что он рабочий (по крайней мере в моей реализации) И в 64 битной винде.
     
  5. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Э..Сорри..Я вообще из юзермоде собираюсь все это делать..
    немного не понял.Где можно прочитать и юзер ли моде это? :)
    Что-то везде куча исходников,однако проблема инжекта (нормального и рабочего из юзермоде)
    все еще остается актуальной,судя по вопросам на форуме...
     
  6. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    coocky
    Я тебе про юзермод говорил, в плане теории.
    А про ядро - это тебе для общего развития. Я просто в ядре исследовал механизмы и реализовывал.
     
  7. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Подскажите плиз,что передавать в QueueUserAPC-описатель одного из потоков процесса,а в другой?
     
  8. JamesB

    JamesB New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2008
    Сообщения:
    66
    без шеллкода - добавляй АПЦ с адресом LoadLibraryA и с адресом строки как аргументом
    в запущеный процесс - у процесса должны быть потоки, ожидающие в alertable состоянии. Либо когда перейдут - выполнится АПЦ. Ссылку уже дали

    адрес обработчика APC
    хендл открытого с правами THREAD_SET_CONTEXT потока
    аргумент, который будет передан обработчику

    а вообще это обертка для NtQueueApcThread
    http://msdn2.microsoft.com/en-us/library/ms684954(VS.85).aspx
     
  9. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    Смотри в мсдн есть описание этой функции
    Просто надо тебе открыть процесс на полный доступ и открыть описатель его потока (допустим тот который в состоянии Running)
     
  10. JamesB

    JamesB New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2008
    Сообщения:
    66
    зачем процесс то открывать?
     
  11. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    JamesB
    Таких потоков может не быть вовсе. Это исключение чем правило.) Так что тут прийдется подумать как из юзермода перевести его в алертейбл (смотри неббета NtAlertThread, копай туда)
     
  12. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    JamesB
    А процесс открывать чтоб получить доступ к его потокам. Хотя может хватит только полученного хендла.
    Но возможно не хватит прав.. Не пробовал так
     
  13. JamesB

    JamesB New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2008
    Сообщения:
    66
    Ясное дело, и очень редко, когда есть такие потоки (алертейбл), но у explorer'а хотя бы 1 такой поток всегда есть по-любому)
    А вот перевести поток в алертейбл - насколько я знаю невозможно вообще. NtAlertThread ничего не делает почему-то. Где почитать?)

    нужен только хендл потока, открытого с правами THREAD_SET_CONTEXT и всё...
    что бы перечислять потоки процесс открывать не нужно
     
  14. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    JamesB спасибо,я все найду и QueueUserAPC я юзаю у себя в прогах частенько.
    Там три параметра-APCProc-которая должна быть поставлена в очередь,хендл потока,в очередь которого должна быть поставлена APCProc и указатель на дополнительные параметры.
    Я так понял первый параметр адрес LoadLibrary,второй хендл потока, третий-аргумент для LoadLibrary?
     
  15. JamesB

    JamesB New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2008
    Сообщения:
    66
    Ну да
     
  16. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    JamesB
    Не делает потому надо делать SleepEx(..., Alertable)
    А в чужом потоке такого нет. И апц прийдет только когда из кернела установить UserApcPending . При чем KiInsertQueueApc (если я не ошибаюсь) Ставит его по дефолту этот pending если поток = Alertable)
     
  17. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Э!!! Мужики,вы про меня забыли совсем.Я потерялся в ваших спорах! :))))
    Ище подскажи те все же правильный подход (или попробую все варианты) Какой хендл потока мен передавать во второй аргумент? Где ,а главное как правильно его получить? Имеет ли значение-процесс запускаемый или уже запущеный? В чем будет заключаться разница подходов? Согласен на ссылки и схематическое обьяснение (код не прошу:) ) Только плиз,без особого сленга ;)
     
  18. JamesB

    JamesB New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2008
    Сообщения:
    66
    TermoSINteZ,
    Дык само собой) Я про то и говорю, что никак не заставишь поток стать алертным, пока он сам не захочет. Имеется ввиду конечно, такими средствами, которые менее "палевны" для современных проактивных защит, чем сама NtQueueApcThread ... т.е. про ядро и инжект можно не говорить

    да... у меня где-то есть кодес, где делается так (разумеется, из ядра)

    PETHREAD Thread;
    Thread->Tcb.Alertable = TRUE;
    Thread->Tcb.ApcState.KernelApcPending = TRUE;
    Thread->Tcb.ApcState.UserApcPending = TRUE;

    перечисляешь все потоки, принадлежащие процессу, в который будешь "это делать"
    каждый открываешь с правами THREAD_SET_CONTEXT и хендл передаешь вторым параметром... куда уж подробнее?)
    перечислить можно через toolhelp api (Thread32First,Thread32Next), а можно сразу через NtQuerySystemInformation
     
  19. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Все.Сэнкс! :) Просто в ходе дискусии я потерялся.
    А насчет запущеного процесса и запускаемого-нет разницы?
    И это,ваши дискуссии про Alertable_ность тоже можно пропустить? :)
     
  20. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.568
    Адрес:
    Russia
    coocky
    Короче в двух словах.
    есть три состояния - Alertable, Alerted, UserApcPending
    Функции делающие Alert - они просто устанавливают или проверяют состояние Alerted
    а Alertable может устанавливать тока поток сам (тот же SleepEx()) ну либо из кернела.
    А так же есть UserApcPending - она непосредственно влияет на апц. Если у потока оно не установлено - то пофиг на все остальные флаги - апц не обработается.

    Хендл потока (любого запущеного, при этот проверив находится ли он в состоянии Алертейбле). Иначе бессмысленно слать