Всем привет!) И у меня очень не стандартный вопрос по C++ есть программа на примеp notepad.exe и мне нужно по заданию ее закрыть, но сделать это нужно при помощи отлова ZwCreateThread.. и вот как мне получить "ZwCreateThread" и убить процесс по нему?
Пока конечно вопросов масса, в том числе и уровень реализации, но общий сценарий такой - перехват ZwCreateThread, например, сплайсингом. И далее мониторить имя из OBJECT_ATTRIBUTES. И когда приходит блокнот, возвращать ошибку. И кстати, ZwCreateThread не может ничего закрыть, он только может дать не создать.
drem1lin, > И далее мониторить имя из OBJECT_ATTRIBUTES. Там указывается имя обьекта, а не файловый путь. Потоки обычно не именуются. Можно использовать GetProcessImageFileName/QueryFullProcessImageName(). Либо получить слепок процессов и в нём найти имя процесса, можно через RtlQueryProcessDebugInformation(). Либо открыть процесс и прочитать PEB.ProcessParameters, если в текущем процессе поток создаётся, то напрямую прочитать данный блок. nnsa, Та функция не завершает процессы, а создаёт потоки. Опишите нормально тз.
в с++ очень далекий в задании мне нужно убивать программу, но не про ее процессу потому его можно переименовать и функция уже не справиться. в интернете вычитал что можно как то зная ZwCreateThread не дать программе запуститься..
nnsa, Бред какой то. Дайте внятное описание задачи. drem1lin, В нт любой обьект может быть именован, тогда это глобальный в системе обьект и возможен доступ к нему по имени. Процессы и потоки так же могут именоваться. Но это никогда не используется. Вы можите создать глобальный именованный обьект, к примеру секцию или евент, что бы использовать его в IPC или из ядра. Для потоков такое не имеет смысла, хотя это обьект и возможно именование.
Косвенным путём можно завершить процесс через этот сервис - задать не валидный стек, тогда ядро прибьёт процесс. Но это грязный хак, результат исполнения - критическая ошибка.
nnsa, Откуда вы взяли тз ? Вам кто то сообщил про этот сервис, поставил задачу. Опишите наконец исходную задачу, вы понимаете что спрашиваете полный бред ? Это лаб работа ? Дайте необходимую инфу для решения.
можно сказать что лаб работа) нужно составить функцию которая запрещает запуск программы, но не по имени процесса, а по другому какому-то методу.
nnsa, Какому методу, в настройках оси покопайтесь, можно много чего там отключить. Почему вы решили что тут экстрасенсы и вашу задачу я должен как то угадать. Топик ниочём, закрыть; автора отправить учить матчасть!
мат часть это хорошо) а вот как это можно сделать? можно хотя бы один примерчик, дальше я думаю сам пойму)
nnsa, Отложить исполнение сервиса - создать поток остановленным, испортить в контексте стек и запустить поток. Приложение будет убито ядром. Если в юм возникает ошибка типо #AV ядро проверяет целостность стека, если он не валид процесс прибивается. В последних версиях системы введено множество защиты, попытка вызова многих сервисов приводит к прибиванию процесса при невалид стеке. Но задача явно не про это.
Это как раз то что нужно!) А можете на пример набросать на примере notepad.exe? Если у Вас конечно же есть время))
nnsa, Обработка ошибки(исключения) ядром выполняется на стеке потока. Если при обращении к стеку возникает ошибка, тоесть он не доступен - инвалиден, тогда обработать ошибку невозможно и единственное что остаётся - прибить процесс. > можете на пример набросать на примере notepad.exe? Элементарный механизм. Запрашиваете контекст потока, устанавливаете там rEsp < 10K, ресумите тред, приложение будет убито. Но для таких целей есть непосредственно сервис NtTerminateProcess/Thread. Не понимаю зачем это.
nnsa, Процесс это обьект, как и любой другой, такова архитектура - обращение к любому обьекту происходит через ссылку на него(км) или описатель(юм). Нет понятия имени, нт это не линуксы.