CreateRemoteThread - узнать ID процесса

Тема в разделе "WASM.BEGINNERS", создана пользователем HoShiMin, 18 мар 2017.

  1. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.454
    Адрес:
    Россия, Нижний Новгород
    Можно ли узнать ID процесса, создавшего поток через CreateRemoteThread, или как-то узнать, что в процессе поток создан "извне"?
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    нет

    EIP потока будет вне образа основного модуля процесса.
     
  3. comrade

    comrade Константин Ёпрст

    Публикаций:
    0
    Регистрация:
    16 сен 2002
    Сообщения:
    232
    Адрес:
    Russian Federation
    Возможно, только через специальный callback из ядра. Смотри PsSetCreateThreadNotifyRoutineEx.
     
  4. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.454
    Адрес:
    Россия, Нижний Новгород
    Хотелось бы через драйвер, вариант идеальный, но у пользователей зачастую нет прав админа и возможности их получить, чтобы его поставить - главная проблема в этом
     
  5. comrade

    comrade Константин Ёпрст

    Публикаций:
    0
    Регистрация:
    16 сен 2002
    Сообщения:
    232
    Адрес:
    Russian Federation
    Ответ полу-серьёзный:
    Возможности получит админ, даже на самых последних версиях Windows, полно :) Правда, только методом эксплуатации дыр в ядре (и их на данный день хватает). Google, Twitter, и отчёты с последних конференций по информационной безопасности (на пример, CanSecWest/Pwn2Own на прошлой неделе) даст вам знать многое. Вводим "windows kernel exploitation" в поисковик - тема глубокая и познавательная.
     
    Последнее редактирование: 20 мар 2017
  6. comrade

    comrade Константин Ёпрст

    Публикаций:
    0
    Регистрация:
    16 сен 2002
    Сообщения:
    232
    Адрес:
    Russian Federation
    Ещё вариант - создание сессии ETW с прослежкой KERNEL/BASE events (там должна быть информация о создание потоков). Увы, позитивен что запуск такой сессии тоже требует админских прав.
     
  7. Quatre_R_Winner

    Quatre_R_Winner Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2008
    Сообщения:
    66
    Как юзерспейсный вариант - ведём свой список локально созданных потоков. То есть сначала перечисляем все потоки, потом патчим функции типа CreateThread, чтобы они вносили соответствующие изменения в список, ну и регулярно сравниваем с реальным положением вещей. Или можно проверять точки начала исполнения (как предложил rmn), смотреть в каком модуле они находятся и дальше плясать от чужеродности модуля.
     
  8. Quatre_R_Winner

    Quatre_R_Winner Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2008
    Сообщения:
    66
    Вот тут ещё http://reverseengineering.stackexch...ck-if-it-has-been-injected-by-another-process есть следующее:


    Remotely created thread could be detected by several techniques:
    1. Periodically check if process threads were created by current process using NtQueryProcessInformation.
    2. For each thread check if it is running from the address space of the original executable and not from some orphaned memory page:
      1. NtQueryInformationThread
      2. Set second parameter to ThreadQuerySetWin32StartAddress
      3. GetModuleInformation - check if the thread starting address is in the range of each of the loaded modules and those modules are legit (by known list/by path).
      4. Check here too.
    3. Monitor thread creating API inside current process and also check if the creating PID belong to current process - NtQueryProcessInformation, CreateToolhelp32Snapshot.
    4. Monitor memory protection APIs (VirtualProtect) to detect if someone tries to modify your code and then check if that "someone" belongs to legit process address space.
    5. By keeping the list of legit loaded modules, one also can check if each thread in process belong to address space of a legit module from the list.
    6. Monitor LoadLibrary for a chance someone trying to load unknown module into your process.

      Исходя из этого могу предположить что PID для потока получить всё же можно
     
  9. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.454
    Адрес:
    Россия, Нижний Новгород
    А здесь что имеется в виду?
     
  10. Quatre_R_Winner

    Quatre_R_Winner Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2008
    Сообщения:
    66
    Да вот сам не пойму. В имеющейся у меня доке по этой функции (точнее NtQueryInformationProcess) нет способов получить подобную инфу. Но дока может быть не полной. NtQueryInformationThread тоже не очень помогает.
     
  11. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Есть кернел логгер, но он должен быть запущен при старте оси, тоесть нужен ребут, причём не известно как с этим в старших версиях системы(так как нужны привилегии(maintain_obj_type)..) и ребут - это никому не интересно).

    HoShiMin

    Вы пилите авера или античит(их есчо юзают ?) ?
     
  12. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.454
    Адрес:
    Россия, Нижний Новгород
    Античит =_=
    И вопрос в соседней теме про прерывание потока тоже для него. Драйвер юзать не вариант: у игроков почти никогда нет админских прав. А искать и использовать эксплойты слишком ненадёжно: эксплойты весь онлайн в казино проиграют.
     
    Indy_ нравится это.
  13. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    HoShiMin

    Я знаю что ачит, вы это на прошлом форуме говорили :preved:
    Я помню вас и ваши вопросы, потому что вы в основном эти интересности и поднимали..

    Сейчас не имеет значения драйвер(мод). Приложение элементарно может браться под супервизор, гипервизор; полностью или частично(по событиям). Учитывая мощности железа, всякий антидебаг и прочий изврат просто бессмысленный. Хотя теоретически это всё же весьма интересно.
     
  14. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.454
    Адрес:
    Россия, Нижний Новгород
    До хардкора с гипервизорами в той игрушке дело даже близко не доходит. Основная проблема - инъекции и последующая подгрузка классов через JNI. Отрубим инъекции - останутся джава-агенты, обрубающиеся через -XX:+DisableAttachMechanism. А вот что делать с инъекциями - до сих пор непонятно. Есть вариант забыть про инъекции и чекать классы через JNI/JVMTI, но снова вопрос - как отличить класс, подгруженный извне, от класса самой игрушки? Поэтому выбрал защищаться на нативном уровне, как более простой и предсказуемый
     
  15. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    HoShiMin

    Не имеет смысла какие то события предсказывать. Загрузиться и захватить управление можно как угодно. А если есчо и есть доступ к процессу, прямое RW или ядерный мод, то вообще ни о какой защите нельзя говорить. Защита не существует без метода обхода. Если же защита от дурака", тоесть запутать ньюби, то достаточно обычных кернел фильтров.

    Смена контекста - тред выбирается произвольно. Создайте ловушку - пустой тред и мониторьте смену контекста. Или можно использовать системные фичи - обнулить стек и вращаться, тогда при инжекте всё отвалится. Можно есчо много чего придумать, но это реально всё бесполезно.
     
  16. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.454
    Адрес:
    Россия, Нижний Новгород
    Кстати говоря, кернель-фильтры написаны. Использовал бы их с удовольствием, если бы не аудитория без админских прав, чтобы эти самые фильтры поставить. Ядерный мод и прямой RW даёт CheatEngine со своим драйвером (его собственный гипервизор в расчёт не беру - никто им пользоваться не умеет), но т.к. это джава, никто байтики в памяти не ищет, это осталось в прошлом: читы ставят через подгрузку классов средствами самой JVM. Поэтому надо или обрубить доступ к процессу из юзермода, или как-то узнать средствами самой JVM, что подгруженный класс чужеродный
     
  17. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.454
    Адрес:
    Россия, Нижний Новгород
    Маппинг либы -> CreateRemoteThread, от него не спасёт, разве нет?
     
  18. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    HoShiMin

    > Маппинг либы -> CreateRemoteThread, от него не спасёт, разве нет?

    Я имел ввиду смену контекста, то что выше упоминалось.

    > Поэтому надо или обрубить доступ к процессу из юзермода

    Я говорил что защиты без обхода её нет. Как только на вашу поделку обратят внимание, она сразу вскроется и будет обход. Более того я полагаю что корректно вы те же кернел фильтры написать не способны(это не ваша оценка, просто это крупнейшие корпорации даже не могут сделать, ошибки есть всегда).
     
  19. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.454
    Адрес:
    Россия, Нижний Новгород
    Ставлю каллбэки через ObRegisterCallbacks, убираю у хэндла моего процесса все права, этого хватает, но опять же - драйвер, а их нельзя...
     
  20. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    HoShiMin

    Ниочём короче. Да и вообще в юм защита не строится. Это возможно, но не тот уровень задачи и тех, кто её будет решать.