Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
3 / 3 / 2
Регистрация: 27.06.2013
Сообщений: 96

Не работает безопасное завершение дочерних процессов с использованием CreateRemoteThread

19.07.2016, 19:35. Показов 1342. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Необходимо завершать процесс и все его дочерние процессы в программе на Microsoft Visual C++
Используется немного измененный код.
Функция для безопасного завершения процесса по этой ссылке.
http://hyacinth.byus.net/moniw... ateProcess
И функция KillProcessTree для рекурсивного завершения дочерних процессов по этой ссылке:
Завершение процесса и его дочерних процессов
Если не удается завершить процесс с помощью функции SafeTerminateProcess, завершаю его с помощью функции TerminateProcess.
Завершение процессов работает, но для дочерних процессов отладка показывает, что в большинстве случаев не работает функция SafeTerminateProcess, и в результате вызывается функция TerminateProcess.
Появляется одна из двух ошибок (если не было первой, в большинстве случаев появляется вторая).
Функция GetExitCodeProcess получает ExitCode для дочернего процесса, равный нулю.
Или бывает вторая ошибка hRT == null с ошибкой код 0x5 - Access Denied.
Если сделать следующий код, вместо нее появляется ошибка Error unknown revision 0x519

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
PSECURITY_DESCRIPTOR pSD;
pSD = (PSECURITY_DESCRIPTOR)LocalAlloc(LPTR,
            SECURITY_DESCRIPTOR_MIN_LENGTH);
 
        SECURITY_ATTRIBUTES sa;
        sa.nLength = sizeof (SECURITY_ATTRIBUTES);
        sa.lpSecurityDescriptor = pSD;
        sa.bInheritHandle = TRUE;
 
hRT = CreateRemoteThread((bDup) ? hProcessDup : hProcess,
            &sa,
            0,
            (LPTHREAD_START_ROUTINE)pfnExitProc,
            (PVOID)uExitCode, 0, &dwTID);
Если делать несколько попыток заврешения того же процесса с помощью SafeTerminateProcess, это не помогает. Можно ли исправить эти 2 ошибки и сделать, чтобы функция SafeTerminateProcess всегда завершала дочерние процессы?


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
BOOL SafeTerminateProcess(HANDLE hProcess, UINT uExitCode)
{
    DWORD dwTID, dwCode, dwErr = 0;
    HANDLE hProcessDup = INVALID_HANDLE_VALUE;
    HANDLE hRT = NULL;
    HINSTANCE hKernel = GetModuleHandle(_T("kernel32"));
    BOOL bSuccess = FALSE;
    BOOL bDup = DuplicateHandle(GetCurrentProcess(),
        hProcess,
        GetCurrentProcess(),
        &hProcessDup,
        PROCESS_ALL_ACCESS,
        FALSE,
        0);
 
    if (GetExitCodeProcess((bDup) ? hProcessDup : hProcess, &dwCode) &&  
(dwCode == STILL_ACTIVE))
    {
        FARPROC pfnExitProc;
        pfnExitProc = GetProcAddress(hKernel, "ExitProcess");
        hRT = CreateRemoteThread((bDup) ? hProcessDup : hProcess,
            NULL,
            0,
            (LPTHREAD_START_ROUTINE)pfnExitProc,
            (PVOID)uExitCode, 0, &dwTID);
 
        if (hRT == NULL) dwErr = GetLastError();
    }
    else
    {
        dwErr = ERROR_PROCESS_ABORTED;
    }
    if (hRT)
    {
        WaitForSingleObject((bDup) ? hProcessDup : hProcess, (DWORD) 
10);
        CloseHandle(hRT);
        bSuccess = TRUE;
    }
    if (bDup)
        CloseHandle(hProcessDup);
    if (!bSuccess)
        SetLastError(dwErr);
    return bSuccess;
}
 
bool KillProcessTree(DWORD myprocID, DWORD dwTimeout)
{
    bool bRet = true;
    HANDLE hWnd;
    PROCESSENTRY32 pe;
 
    memset(&pe, 0, sizeof(PROCESSENTRY32));
    pe.dwSize = sizeof(PROCESSENTRY32);
 
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 
    if (Process32First(hSnap, &pe))
    {
        BOOL bContinue = TRUE;
 
        while (bContinue)
        {
            if (pe.th32ParentProcessID == myprocID)
            {
 
                KillProcessTree(pe.th32ProcessID, dwTimeout);
 
                HANDLE hChildProc = OpenProcess 
(PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID);
 
                if (hChildProc)
                {
 
                    if (WaitForSingleObject(hChildProc,  
dwTimeout) == WAIT_OBJECT_0)
                        bRet = true;
                    else
                    {   
                             bRet =  
SafeTerminateProcess(hChildProc, 0);
                        if (!bRet)
                            bRet =  
TerminateProcess(hChildProc, 0);
                    }
                    CloseHandle(hChildProc);
                }
            }
            bContinue = Process32Next(hSnap, &pe);
        }
 
        HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE,  
myprocID);
 
        if (hProc)
        {
            if (!SafeTerminateProcess(hProc, 0))
                TerminateProcess(hProc, 0);
            CloseHandle(hProc);
        }
    }
    return bRet;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.07.2016, 19:35
Ответы с готовыми решениями:

Завершение процесса и его дочерних процессов
Доброе время суток! Подскажите, пожалуйста, как можно реализовать завершение процесса (зная его имя или PID) и всех его дочерних...

Завершение всех запущенных процессов из находящегося в текстовом файле списка запрещенных к запуску процессов
пожалуйста помогите написать батник. Задать в текстовом файле список процессов, запрещенных к запуску. Создать командный файл,...

Запуск дочерних процессов
Здравствуйте, подскажите, пожалуйста: если я хочу запустить три дочерних процесса при помощи функции CreateProcess, то мне нужно...

7
Заблокирован
20.07.2016, 07:50
Цитата Сообщение от Max_t Посмотреть сообщение
HANDLE hChildProc = OpenProcess
(PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID);
ты такой простой, так тебе все процессы и открылись с PROCESS_ALL_ACCESS Вот тебе и ошибка
Цитата Сообщение от Max_t Посмотреть сообщение
Access Denied.
Добавлено через 2 минуты
Цитата Сообщение от Max_t Посмотреть сообщение
BOOL bDup = DuplicateHandle(GetCurrentProcess(),
* * * * hProcess,
* * * * GetCurrentProcess(),
* * * * &hProcessDup,
* * * * PROCESS_ALL_ACCESS,
* * * * FALSE,
* * * * 0);
- тоже самое - кто тебе сказал что сможешь любой хендл с таким доступом дуплицировать
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
20.07.2016, 11:03
Цитата Сообщение от Max_t Посмотреть сообщение
Можно ли исправить эти 2 ошибки и сделать, чтобы функция SafeTerminateProcess всегда завершала дочерние процессы?
Во-первых, как уже написали выше, может банально не хватить прав
для открытия процесса на PROCESS_TERMINATE. Даже если у тебя есть
права администратора, системы и включена привилегия отладки.

Во-вторых, CreateRemoteThread работает только для процессов одинаковой
"битности" (32-32, 64-64, но не 32-64 или 64-32) и только в пределах
одного пользовательского сеанса.
0
3 / 3 / 2
Регистрация: 27.06.2013
Сообщений: 96
20.07.2016, 21:48  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
и включена привилегия отладки
Попробовал сделать, не помогает.

Привилегии отладки GetDebugPriv

Есть у кого-нибудь предложения, что можно сделать?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
20.07.2016, 22:13
1. Включи привилегию отладки.

2. Перечисли все процессы с помощью функции CreateToolhelp32Snapshot или
других ее аналогов.

3. Пройди по дереву интересующих процессов, начиная с самых дальних потомков, и
для каждого процесса в дереве сделай OpenProcess с правами PROCESS_TERMINATE,
далее TerminateProcess и CloseHandle.

Все. Никакие SafeTerminateProcess, игры с CreateRemoteThread и т.п.
здесь погоды не сделают.

Если процесс по каким-то причинам не дает открывать себя с правами на
изменение (например, это защищенный системный процесс типа services.exe на Win8+),
то никакими ухищрениями закрыть его не получится, ни через TerminateProcess, ни
через CreateRemoteThread, ни через SetThreadContext и т.д.
0
3 / 3 / 2
Регистрация: 27.06.2013
Сообщений: 96
20.07.2016, 22:13  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
далее TerminateProcess
TerminateProcess работает. Вопрос задавал по SafeTerminateProcess, которая работает для основного процесса, но чаще всего не работает для дочерних процессов. Вопрос, насколько она безопаснее и насколько есть смысл ее использовать.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
20.07.2016, 22:18
Лично я смысла юзать SafeTerminateProcess не вижу.
Для принудительного завершения процесса придумали TerminateProcess,
зачем еще что-то городить сверху - не понятно.
0
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
21.07.2016, 07:44
Max_t, что вы вызовете TerminateProcess, что ExitProcess в контексте целевого процесса (этот ваш SafeTerminateProcess по ссылке), разницы нет. Оба вызова к NtTerminateProcess сводятся.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.07.2016, 07:44
Помогаю со студенческими работами здесь

Создание дочерних процессов
Всем привет, есть рабочая прога, была дана так сказать "на исследование". Программа создает то кол-во дочерних процессов, которое укажут в...

Мониторинг дочерних процессов
У меня есть задача сделать систему процессов, каждый из которых будет заниматься своей задачей. Соответственно порождающий их процесс...

Создание дочерних процессов. Пайпы
Здравствуйте, подскажите, пожалуйста, что не так. Есть программа, сортирующая файл: sort.cpp #include <stdio.h> #include...

Вывод pid дочерних процессов
Всем доброго вечера. Проблема следующая:есть процесс, порождающий несколько процессов.Те в свою очередь порождают еще...

Создание двух дочерних процессов
Я всю программу сделал, но создал только 1 дочерний. Как сделать их 2 и более? Уже 3-й час не могу разобраться. Вот мое : #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru