Alertable Thread

Тема в разделе "WASM.BEGINNERS", создана пользователем Pantamas, 1 мар 2012.

  1. Pantamas

    Pantamas New Member

    Публикаций:
    0
    Регистрация:
    23 фев 2012
    Сообщения:
    23
    А можно как-нибудь из user-mode узнать содержит ли процесс alertable потоки?
     
  2. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Pantamas
    А вы пробывали поиск юзать ?
    http://www.wasm.ru/forum/viewtopic.php?id=41001
     
  3. Pantamas

    Pantamas New Member

    Публикаций:
    0
    Регистрация:
    23 фев 2012
    Сообщения:
    23
    shchetinin
    В том топике ровным счётом никакой конкретики...Например,как узнать вообще из Process Explorer,что процесс имеет alertable потоки?
    Или получается,что из user-mode невозможно определить alertable потоки?
     
  4. Lunar_

    Lunar_ New Member

    Публикаций:
    0
    Регистрация:
    3 май 2011
    Сообщения:
    53
    Только методом анализа стека. Штатными средствами нельзя, обходных путей/извращенных хаков, скорее всего, нет. Поле "ядерное". Хотя, мейби, какой-нибудь гуру виндовой архитектуры и напишет что-то.
    В php process hacker даже есть пример кода
    http://processhacker.sourceforge.net/doc/anawait_8c_source.html
     
  5. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    Pantamas
    Можно определить - поставить в очередь APC. Если доставится, значит alertable-wait :)

    Это также не надёжно, как и искать потоки для исполнения в их контексте кода. Потоки могут простаивать в данном случае и не имеет значения что они ждут. Нормально из юзермода это свой поток создать.
     
  6. Lunar_

    Lunar_ New Member

    Публикаций:
    0
    Регистрация:
    3 май 2011
    Сообщения:
    53
    APC добавится в любом случае, QueueUserAPC() всегда будет возвращать TRUE.
    А о том, запустилось ли оно ты не узнаешь.
     
  7. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    Lunar_
    Если мой код выполнился в APC, значит он запустился.
     
  8. Lunar_

    Lunar_ New Member

    Публикаций:
    0
    Регистрация:
    3 май 2011
    Сообщения:
    53
    Ну его тогда инжектить нужно. Решение из категории анализа стека.
     
  9. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    Lunar_
    Он записан заранее. Для этого и управление передаётся через апк. А танцы с бубном вокруг стека совершенно не нужны. Далее смысла юзать апк вообще нет. Некоторые аверы, как например ZA не фильтруют доставку апк, так же как и прямую запись через NtWriteVM. Другие аверы, как например клиф мониторят доставку апк и прочие способы смены Ip, но делают это криво, посему ничем апк не лучше, чем прямая смена контекста:
    Код (Text):
    1. .text:000400E8 PtOpenThread:
    2. .text:000400E8                 mov     edi, edi
    3. .text:000400EA                 push    ebp
    4. .text:000400EB                 mov     ebp, esp
    5. .text:000400ED                 and     esp, 0FFFFFFF8h
    6. .text:000400F0                 sub     esp, 0Ch
    7. .text:000400F3                 push    ebx
    8. .text:000400F4                 push    esi
    9. .text:000400F5                 push    edi
    10. .text:000400F6                 xor     edi, edi
    11. .text:000400F8                 mov     [esp+10h], edi
    12. .text:000400FC                 xor     ebx, ebx
    13. .text:000400FE                 call    ds:ExGetPreviousMode
    14. .text:00040104                 push    dword ptr [ebp+14h]
    15. .text:00040107                 test    al, al
    16. .text:00040109                 jnz     short loc_4011F
    17. .text:0004010B                 push    dword ptr [ebp+10h]
    18. .text:0004010E                 push    dword ptr [ebp+0Ch]
    19. .text:00040111                 push    dword ptr [ebp+8]
    20. .text:00040114                 call    pNtOpenThread
    21. .text:0004011A                 jmp     loc_401E5
    22. .text:0004011F ; ---------------------------------------------------------------------------
    23. .text:0004011F
    24. .text:0004011F loc_4011F:
    25. .text:0004011F                 push    8
    26. .text:00040121                 pop     ecx
    27. .text:00040122                 call    ProbeForReadAndCopyToBuffer ; SEH; (CONTEXT.rEcx:Length, IN PVOID Buffer):PVOID
    28. .text:00040127                 mov     esi, eax
    29. .text:00040129                 cmp     esi, edi
    30. .text:0004012B                 jz      loc_401B5
    31.             ...
    32. .text:000401B5 loc_401B5:
    33. .text:000401B5
    34. .text:000401B5                 test    byte ptr [esp+10h], 1Ch
    35. .text:000401BA                 jz      short loc_401C3
    36. .text:000401BC                 mov     esi, 0C0000022h
    37. .text:000401C1                 jmp     short loc_401D7
    38. .text:000401C3 ; ---------------------------------------------------------------------------
    39. .text:000401C3
    40. .text:000401C3 loc_401C3:
    41. .text:000401C3                 push    dword ptr [ebp+14h]
    42. .text:000401C6                 push    dword ptr [ebp+10h]
    43. .text:000401C9                 push    dword ptr [ebp+0Ch]
    44. .text:000401CC                 push    dword ptr [ebp+8]
    45. .text:000401CF                 call    pNtOpenThread
    46. .text:000401D5                 mov     esi, eax
    - если ProbeForReadAndCopyToBuffer() завершиться с ошибкой, то будет вызван оригинальная нтапи. Эта процедура защищена сех и юзает ProbeForRead(). Передаём страницу помеченную как гвард, это приведёт к вызову оригинальной апи.
    Чисто теоретически мб это и интересно. Если небыло возврата из сервиса для доставки других апк, то Eax в т-фрейме не изменён и содержит Id сервиса, который был в стабе загружен. Посему берём его из контекста, в блоке case прибавляем к Esp смещение в зависимости от сервиса и достаём со стека аргумент, разрешающий алетрабельное ожидание. Хотя можно и адрес возврата в стаб взять со стека.
     
  10. Pantamas

    Pantamas New Member

    Публикаций:
    0
    Регистрация:
    23 фев 2012
    Сообщения:
    23
    Просто читал про ZeroAccess и там было написано,что он использует внедрение при помощи QueueUserAPC() в svchost.exe...Как он это делает хз...
     
  11. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Pantamas
    Во первых инжект через QueueUserAPC без смыселен(Проще CreateRemoteThread) и то и другое паливо.
    Во вторых не гарантий что поток таки войдет в состояние Alertable, для это нкжен вайт с Altertable true.
     
  12. Pantamas

    Pantamas New Member

    Публикаций:
    0
    Регистрация:
    23 фев 2012
    Сообщения:
    23
    То есть приходим к выводу о том,что использование APC бесполезно и не даёт никаких преимуществ...

    А как можно определить принадлежность потока модулю - т.е,как узнать,что поток THREAD1 запущен из модуля MODULE1,может API есть какие,я новенький в теме;)
     
  13. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Pantamas
    Call stack посмотреть ...
     
  14. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    Pantamas
    Повторяюсь - апк смысла не имеет в качестве инжекта. А зероаццесс очень плохой пример, это пример как не следует кодить малварь.
     
  15. Pantamas

    Pantamas New Member

    Публикаций:
    0
    Регистрация:
    23 фев 2012
    Сообщения:
    23
    Malfoy,а можете привести пример,как стоит кодить малварь?
     
  16. fasmotol

    fasmotol New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2011
    Сообщения:
    10
    Pantamas, у svchost'a могут быть alertable потоки, на свинье это, вроде бы даже факт. Думаю ЗироЭссэс тупо просто перебирает потоки и шлёт apc, ожидая отклика. Хотя по палевности с CreateRemoteThread одинакого, как и сказали...
     
  17. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    fasmotol
    О чём вы говорите, какая палевность есчо. Забудьте про проты, нет таких больше програм.
     
  18. Pantamas

    Pantamas New Member

    Публикаций:
    0
    Регистрация:
    23 фев 2012
    Сообщения:
    23
    Malfoy
    А можно подробнее о "забудьте про проты, нет таких больше програм"?
    И какой на Ваш взгляд наиболее подходящий способ инжекта?
     
  19. Malfoy

    Malfoy New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2012
    Сообщения:
    698
    Pantamas
    По мойму инжект нужно делать так(из юзермодов):
    1. Определяем прот, заюзав SHDE.
    2. Выбираем прототипы из базы для рк атаки на прот.
    3. Выполняем рк атаку на апи, через которые выполняем инжект. Это зависит от прота.
    4. Посылаем IOCTL для остановки прота, добавления себя в его списки(рега клиента), либо впрыскиваемся в доверенный процесс, в идеале в процесс фаера.