ZwCreateThread

Тема в разделе "WASM.BEGINNERS", создана пользователем nnsa, 10 июн 2017.

  1. nnsa

    nnsa New Member

    Публикаций:
    0
    Регистрация:
    10 июн 2017
    Сообщения:
    7
    Всем привет!)
    И у меня очень не стандартный вопрос по C++
    есть программа на примеp notepad.exe и мне нужно по заданию ее закрыть, но сделать это нужно при помощи отлова ZwCreateThread..

    и вот как мне получить "ZwCreateThread" и убить процесс по нему?
     
  2. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    Пока конечно вопросов масса, в том числе и уровень реализации, но общий сценарий такой - перехват ZwCreateThread, например, сплайсингом. И далее мониторить имя из OBJECT_ATTRIBUTES. И когда приходит блокнот, возвращать ошибку. И кстати, ZwCreateThread не может ничего закрыть, он только может дать не создать.
     
  3. Indy_

    Indy_ Well-Known Member

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

    > И далее мониторить имя из OBJECT_ATTRIBUTES.

    Там указывается имя обьекта, а не файловый путь. Потоки обычно не именуются. Можно использовать GetProcessImageFileName/QueryFullProcessImageName(). Либо получить слепок процессов и в нём найти имя процесса, можно через RtlQueryProcessDebugInformation(). Либо открыть процесс и прочитать PEB.ProcessParameters, если в текущем процессе поток создаётся, то напрямую прочитать данный блок.

    nnsa,

    Та функция не завершает процессы, а создаёт потоки. Опишите нормально тз.
     
  4. drem1lin

    drem1lin Member

    Публикаций:
    0
    Регистрация:
    17 мар 2009
    Сообщения:
    300
    спасибо, у меня было сомнение куда все таки имя попадет
     
  5. nnsa

    nnsa New Member

    Публикаций:
    0
    Регистрация:
    10 июн 2017
    Сообщения:
    7
    в с++ очень далекий
    в задании мне нужно убивать программу, но не про ее процессу потому его можно переименовать и функция уже не справиться.
    в интернете вычитал что можно как то зная ZwCreateThread не дать программе запуститься..
     
  6. Indy_

    Indy_ Well-Known Member

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

    Бред какой то. Дайте внятное описание задачи.

    drem1lin,

    В нт любой обьект может быть именован, тогда это глобальный в системе обьект и возможен доступ к нему по имени. Процессы и потоки так же могут именоваться. Но это никогда не используется. Вы можите создать глобальный именованный обьект, к примеру секцию или евент, что бы использовать его в IPC или из ядра. Для потоков такое не имеет смысла, хотя это обьект и возможно именование.
     
  7. Indy_

    Indy_ Well-Known Member

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

    nnsa New Member

    Публикаций:
    0
    Регистрация:
    10 июн 2017
    Сообщения:
    7
    да мне хотя бы обнаружить его..
     
  9. Indy_

    Indy_ Well-Known Member

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

    Откуда вы взяли тз ?
    Вам кто то сообщил про этот сервис, поставил задачу. Опишите наконец исходную задачу, вы понимаете что спрашиваете полный бред ?
    Это лаб работа ?
    Дайте необходимую инфу для решения.
     
  10. nnsa

    nnsa New Member

    Публикаций:
    0
    Регистрация:
    10 июн 2017
    Сообщения:
    7
    можно сказать что лаб работа)

    нужно составить функцию которая запрещает запуск программы, но не по имени процесса, а по другому какому-то методу.
     
  11. Indy_

    Indy_ Well-Known Member

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

    Какому методу, в настройках оси покопайтесь, можно много чего там отключить. Почему вы решили что тут экстрасенсы и вашу задачу я должен как то угадать.

    Топик ниочём, закрыть; автора отправить учить матчасть!
     
  12. nnsa

    nnsa New Member

    Публикаций:
    0
    Регистрация:
    10 июн 2017
    Сообщения:
    7
    мат часть это хорошо)

    а вот как это можно сделать? можно хотя бы один примерчик, дальше я думаю сам пойму)
     
  13. Indy_

    Indy_ Well-Known Member

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

    Отложить исполнение сервиса - создать поток остановленным, испортить в контексте стек и запустить поток. Приложение будет убито ядром. Если в юм возникает ошибка типо #AV ядро проверяет целостность стека, если он не валид процесс прибивается. В последних версиях системы введено множество защиты, попытка вызова многих сервисов приводит к прибиванию процесса при невалид стеке. Но задача явно не про это.
     
  14. nnsa

    nnsa New Member

    Публикаций:
    0
    Регистрация:
    10 июн 2017
    Сообщения:
    7
    Это как раз то что нужно!)
    А можете на пример набросать на примере notepad.exe?
    Если у Вас конечно же есть время))
     
  15. Indy_

    Indy_ Well-Known Member

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

    Обработка ошибки(исключения) ядром выполняется на стеке потока. Если при обращении к стеку возникает ошибка, тоесть он не доступен - инвалиден, тогда обработать ошибку невозможно и единственное что остаётся - прибить процесс.

    > можете на пример набросать на примере notepad.exe?

    Элементарный механизм. Запрашиваете контекст потока, устанавливаете там rEsp < 10K, ресумите тред, приложение будет убито. Но для таких целей есть непосредственно сервис NtTerminateProcess/Thread.

    Не понимаю зачем это.
     
  16. nnsa

    nnsa New Member

    Публикаций:
    0
    Регистрация:
    10 июн 2017
    Сообщения:
    7
    Если процесс переименовать, то TerminateProcess уже не подойдёт
     
  17. Indy_

    Indy_ Well-Known Member

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

    Процесс это обьект, как и любой другой, такова архитектура - обращение к любому обьекту происходит через ссылку на него(км) или описатель(юм). Нет понятия имени, нт это не линуксы.
     
  18. LostFish

    LostFish Member

    Публикаций:
    0
    Регистрация:
    23 фев 2017
    Сообщения:
    26
    и там тоже вроде такого нету