Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.68/40: Рейтинг темы: голосов - 40, средняя оценка - 4.68
2 / 2 / 0
Регистрация: 21.04.2011
Сообщений: 60
1

Завершение процесса при обнаружении другого процесса

21.04.2011, 15:38. Просмотров 7741. Ответов 15
Метки нет (Все метки)

Здравствуйте.
Люди добрые подскажите пожалуйста как мне быть. Есть приложение которое следит за процессами в диспетчере, запущены 2 процесса - процесс1 и процесс2, если запускаем программу то она проверяет наличие процесса1, и если процесс1 запущен то проверяет есть ли процесс2 и если есть завершает его. Бьюсь как рыба об лед не понимаю в чем дело, вот код:

C#
1
2
3
4
5
6
7
8
9
10
11
System.Diagnostics.Process[] proc1;
            proc1 = System.Diagnostics.Process.GetProcessesByName("notepad");
            foreach (System.Diagnostics.Process ce in proc1)
                if (ce != Process.GetCurrentProcess())
                {
                    System.Diagnostics.Process[] proc2;
                    proc2 = System.Diagnostics.Process.GetProcessesByName("winamp");
                    foreach (System.Diagnostics.Process ce1 in proc2)
                        if (ce1 != Process.GetCurrentProcess())
                            ce1.Kill();
                }
Судя по моему коду смотрим есть ли процесс notepad, если он есть то ищем процесс winamp, если винамп нашелся мі его убиваем ce1.Kill, но все равно убивается 1й процесс блокнота, почему непоимаю, ошибок не показывает вродебы все правильно почему неполучается подскажите пожалуйста, тем более в коде ясно написано что ce1.Kill() тоесть 100% не 1й процесс потому что килл обрабатывается же во 2м процессе...Помогите. Спасибо.

ЗЫ. Не нашел подобных тем больше.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.04.2011, 15:38
Ответы с готовыми решениями:

Корректное завершение стороннего процесса
Из своей программы (Wrapper) запускаю вторую (Program). Программа Program - консольное приложение,...

Завершение процесса после закрытия формы
Пишу приложение-клиент, которое принимает файлы по протоколу UDP. Хотелось бы, чтобы при закрытии...

Завершение процесса Excel после обработки файла
Доброго времени суток, Подскажите пожалуйста, как завершить процесс Excel после использования?...

Ошибка "appcrash kernelbase.dll" при запуске другого процесса
добрый день. образовалась такая вот проблема. пишу на c#, из кода одного приложения в цикле...

15
142 / 142 / 26
Регистрация: 09.10.2009
Сообщений: 261
21.04.2011, 16:09 2
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
        static public bool IsProcessOpen(string name)
        {
            return Process.GetProcesses().Any(clsProcess => clsProcess.ProcessName.Contains(name));
        }
 
        static public bool FindAndKillProcess(string name)
        {
            foreach (Process clsProcess in Process.GetProcesses())
            {
                if (clsProcess.ProcessName.StartsWith(name))
                {
                    clsProcess.Kill();
                    return true;
                }
            }
 
            return false;
        }
 
        static void Main()
        {
            if (IsProcessOpen("winamp"))
                if (IsProcessOpen("notepad"))
                    FindAndKillProcess("notepad");
        }
2
2 / 2 / 0
Регистрация: 21.04.2011
Сообщений: 60
22.04.2011, 11:57  [ТС] 3
Огромнейшее человеческое спасибо!!!!!

Добавлено через 19 часов 13 минут
Ув. ArtOfLife а не могли бы Вы еще подсказать как заставить находить не полное имя процесса а частивное, например "note" вместо "notepad" и чтобі завершались все процессі со словами "note". Спасибо.

Добавлено через 16 минут
И почему неработает перечисление если я хочу завершать несколько процессов, "notepad" , "AIMP2".
0
142 / 142 / 26
Регистрация: 09.10.2009
Сообщений: 261
22.04.2011, 15:20 4
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
        static public bool IsProcessOpen(string name)
        {
            return Process.GetProcesses().Any(clsProcess => clsProcess.ProcessName.ToLower().Contains(name.ToLower()));
        }
 
        static public bool FindAndKillProcess(string[] names)
        {
            var killedProcesses = 0;
 
            foreach (var clsProcess in from name in names
                                           from clsProcess in Process.GetProcesses()
                                           where clsProcess.ProcessName.ToLower().Contains(name.ToLower())
                                           select clsProcess)
            {
                clsProcess.Kill();
                killedProcesses++;
 
                if (killedProcesses == names.Length)
                    return true;
            }
 
            return false;
        }
 
        static void Main()
        {
            var processesToKill = new[] { "note", "akel" };
 
            if (IsProcessOpen("winam"))
                if (IsProcessOpen("not"))
                    FindAndKillProcess(processesToKill);
        }
П.С. В примере выше были открыты winamp, notepad и akelpad. Последние 2 благополучно закрылись. В массив processesToKill просто заносите имена убиваемых процессов. You're welcome.
1
2 / 2 / 0
Регистрация: 21.04.2011
Сообщений: 60
22.04.2011, 17:40  [ТС] 5
Спасибо огромное еще раз!!!

Неловко Вас эксплуатировать, просто спрошу, возможно ли вообще реализовать следующее:

Есть программа prog.exe (моя программа) она следит за процессом Х если в процессах появляются вредные приложения или взломщики то программа завершает процесс Х который может поддвергнуться взлому. Проблема в том что если убить prog.exe то можно спокойно запустить взломщик и напасть на защищаемый Х. Так вот - возможно ли вообще сделать чтобы если убивают prog.exe то также завершался и процесс Х, и наоборот - если завершить Х то также и нужно завершить мою программу prog.exe потому что следить незачем.

Теоретически можно написать .dll который будет загружаться вместе с prog.exe и при завершении процесса prog.exe .dll будет завершать и Х, ну и соотв. наоборот, возможно ли так, или есть другие варианты реализации данной нужды? Мне хотя бы подсказки какие-то, на вести на мысль, потому что код думаю большой будет. Знаю что тут возможно понадобятся перехват АПИ функций, или поиск по хэндлу приложений, возможно ли получить отклык от програмы если ее просто убить, чтобы потом используя этот отклик завершить Х или prog.exe?

Если нет то значит нет Вы мне и так здорово помогли. Спасибо!

Добавлено через 20 минут
ЗЫ. Я перепутал, мне нужно было не закрывать много процессов изза одного а закрывать всегда один и тот же процесс при наличии нескольких других но всеравно спасибо!
0
2 / 2 / 0
Регистрация: 21.04.2011
Сообщений: 60
24.04.2011, 17:46  [ТС] 6
Неполучается переделать код чтобы закрывать один и тот же процесс при появлении многих, пишет ToLower не может быть в текущем контексте
0
142 / 142 / 26
Регистрация: 09.10.2009
Сообщений: 261
26.04.2011, 12:16 7
Цитата Сообщение от cosong Посмотреть сообщение
Неполучается переделать код чтобы закрывать один и тот же процесс при появлении многих, пишет ToLower не может быть в текущем контексте
Не совсем понял, что вы там напеределывали. Какая разница - один процесс, или n? Функция универсальная. Занесите в массив processesToKill ваш единственный элемент и программа будет искать и закрывать только его.
По остальным вопросам...
1) Как вы собираетесь определять наличие в списке процессов вредоносных приложений? По названию? Или вы решили написать свой антивирус?
2) Допустим, вы все же нашли способ определения вредоносных приложений в списке ваших процессов... Тогда закиньте все это в службу и производите опрос списка процессов по таймеру. Нашли вирус, закрыли ваше ПО. Хотя, затея сама по себе глупая, ибо если уж нормальный вирус появился в списке процессов и вы об этом узнали уже постфактум, то скорее всего ваше ПО уже заражено, и смысла в его закрытии нет никакого. В общем, если хотите защитить свое ПО, то сделайте селф-дефенс механизм, который будет работать на уровне перехвата API-функций с попытками обращения к вашему процессу. Либо поиграйтесь с привилегиями. В общем, задача далеко нетривиальная. Да и C# тут совершенно не подходит.
1
2 / 2 / 0
Регистрация: 21.04.2011
Сообщений: 60
26.04.2011, 16:18  [ТС] 8
Не совсем понял, что вы там напеределывали. Какая разница - один процесс, или n? Функция универсальная. Занесите в массив processesToKill ваш единственный элемент и программа будет искать и закрывать только его.
Я имел ввиду что мне нужно закрывать мое приложение при появлении нескольких, в списке перечисления я указываю приложения которые необходимо закрыть, а нужно указать список приложений при появлении которых нужно закрывать один и тот же процесс.

1) Как вы собираетесь определять наличие в списке процессов вредоносных приложений? По названию? Или вы решили написать свой антивирус?
2) Допустим, вы все же нашли способ определения вредоносных приложений в списке ваших процессов... Тогда закиньте все это в службу и производите опрос списка процессов по таймеру. Нашли вирус, закрыли ваше ПО. Хотя, затея сама по себе глупая, ибо если уж нормальный вирус появился в списке процессов и вы об этом узнали уже постфактум, то скорее всего ваше ПО уже заражено, и смысла в его закрытии нет никакого. В общем, если хотите защитить свое ПО, то сделайте селф-дефенс механизм, который будет работать на уровне перехвата API-функций с попытками обращения к вашему процессу. Либо поиграйтесь с привилегиями. В общем, задача далеко нетривиальная. Да и C# тут совершенно не подходит.
Нет не антивирус Вы правильно говорите я так и сделал таймер, опрос списка...На самом деле я хочу защитить игру, для игры существуют 2-4 взломщика имена процессов которых извесны, это довольно несложно поскольку нет никаких вирусов просто есть готовые взломщики, я пишу маленькую програмку которая висит в памяти и если появляется этот проесс взлома игры то игру надо закрыть. Для этого думаю вполне хватит же и C#. Вы мне вон помогли за что большое Вам спасибо, просто у меня осталось 3 проблем - мне нужно было сделать так чтобы при закрытии игры закрывалась и моя программа, и наоборот, чтобы если уничтожить процесс программы моей закрывалась и игра, чтобы предотвратить появление копий процессов ну и проблем связанных с этим, думал тут подойдет .dll или чтото в єтом роде...Ну и Ваш код только наоборот) чтобы закрывать всегда один процесс игры если найдется хотя бы один из 4х взломщиков)

Я почти все сделал по таймеру происходит проверка наличия процессов взломщиков только вот нужно завершать не несколько процессов а один при появлении хотябы одного из 4х взломщиков, так как в памяти могут быть 2 или 3 взломщика вот нужно найти каждый и если таковой имеется закрыть игру ну и чтобы одновременно с ней закрылась и моя програмка.

Если Вам не сложно то подскажите пожалуйста хотябы только по завершению процесса при выявление одного из 4х взломщиков. Извините что повторяюсь, просто уже не знаю что придумать.
0
142 / 142 / 26
Регистрация: 09.10.2009
Сообщений: 261
26.04.2011, 23:06 9
Как пример, создайте службу с ниже подобным кодом:
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
using System;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Timers;
 
namespace ProcessWatcher
{
    public partial class ProcessWatcherService : ServiceBase
    {
        private const string MainProcess = "Game";
        private readonly string[] _targetProcesses = new[] { "target1", "target2", "target3" };
        private readonly Timer _checkProcessTimer = new Timer();
 
        public ProcessWatcherService()
        {
            InitializeComponent();
        }
 
        public bool TragetProcessAppeares()
        {
            return (from clsProcess in Process.GetProcesses()
                    from targetProcess in _targetProcesses
                    where clsProcess.ProcessName.ToLower().Contains(targetProcess.ToLower())
                    select clsProcess).Any();
        }
 
        public bool KillMainProcess()
        {
            foreach (Process clsProcess in
                Process.GetProcesses().Where(clsProcess => clsProcess.ProcessName.ToLower().Contains(MainProcess.ToLower())))
            {
                clsProcess.Kill();
 
                return true;
            }
 
            return false;
        }
 
        protected override void OnStart(string[] args)
        {
            _checkProcessTimer.Elapsed += CheckProcessTimer_Tick;
            _checkProcessTimer.Interval = 100;
            _checkProcessTimer.Enabled = true;
        }
 
        protected override void OnStop()
        {
            _checkProcessTimer.Enabled = false;
            KillMainProcess();
        }
 
        private void CheckProcessTimer_Tick(object sender, EventArgs e)
        {
            if (!TragetProcessAppeares())
                return;
 
            KillMainProcess();
        }
    }
}
Она будет постоянно висеть в процессах, сканируя список на наличие взломщиков из массива _targetProcesses. Как только вредитель появляется в процессах, служба завершает нашу игру MainProcess. Если же вредитель был запущен до запуска игры, то при попытке открытия последней, служба ее благополучно убьет. Вряд ли пользователь без прав сможет убить наш Watcher. Во-первых, он должен знать имя процесса. Во-вторых, Watcher придется именно убивать, т.к. корректная остановка службы приведет к закрытию и самой игры. Ну а если все же сможет убить, то в самой игре можно устроить подобного рода опрос на наличие запущенной службы:
C#
1
2
3
4
            var sc = new ServiceController("Game Watcher Service");
 
            if (sc.Status != ServiceControllerStatus.Running)
                // Закрываем приложение
Данный код можно поместить, например, в лоадер формы. Как вариант, процесс службы можно обозвать, скажем, svchost. Вряд ли кто-то додумается принудительно убивать что-то, носящее имя служебных хост-процессов Windows. А если и додумается, то тут скорее всего вклинится антивирус, который сам прихлопнет злодея за попытку осуществления диверсии в системе.
П.С. Зачем убивать наблюдателя вместе с игрой? Пусть висит постоянно в качестве службы.
1
2 / 2 / 0
Регистрация: 21.04.2011
Сообщений: 60
27.04.2011, 01:07  [ТС] 10
Спасибо Мне почемуто неприходило в голову сделать все в виде службы...Все очень понятно единственное немогу опробовать и настроить службу так как пишет ошибку, пробовал во всех версиях .NET 2.0/3.0/3.5/4.0

Ошибка 1 "WindowsService7.Service1.Dispose(bool)": не найден метод, пригодный для переопределения E:\WindowsService7\WindowsService7\Service1.Designer.cs 14 33 WindowsService7
В этом фрагменте кода, чесно говоря непонимаю в чем проблема...

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
namespace WindowsService7
{
    partial class Service1
    {
        /// <summary> 
        /// Требуется переменная конструктора.
        /// </summary>
        private System.ComponentModel.IContainer components = null;
 
        /// <summary>
        /// Освободить все используемые ресурсы.
        /// </summary>
        /// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.[SIZE="6"]Dispose[/SIZE]();
            }
            base.Dispose(disposing);
        }
 
        #region Код, автоматически созданный конструктором компонентов
 
        /// <summary> 
        /// Обязательный метод для поддержки конструктора - не изменяйте 
        /// содержимое данного метода при помощи редактора кода.
        /// </summary>
        private void InitializeComponent()
        {
            components = new System.ComponentModel.Container();
            this.ServiceName = "Service1";
        }
 
        #endregion
    }
}
И если я не ошибаюсь то службу надо будет запустить не просто из .ехе файла? Насколько я помню требует установку службы перед ее запуском, или я что-то путаю? Можно ведь прсото создать лоадер который будет запускать сначала watcher а потом игру с проверкой на наличие watcher'a если служба запускается просто из .ехе то так и сделаю...Только вот ошибка эта непонятно почему

Добавлено через 14 минут
ЗЫ. У меня visual studio 2010 может проблема в версиях? Ваш код вставлял в Service1.cs а ошибка появляется в Servise1.Designer.cs.
0
142 / 142 / 26
Регистрация: 09.10.2009
Сообщений: 261
27.04.2011, 12:02 11
Так вы ведь названия неймспейса и класса службы не переименовали в соответствии с моим примером. Конечно, ведь мои ProcessWatcher и ProcessWatcherService != вашим WindowsService7 и Service1.
После компиляции установить службу можно следующим образом:
1) В командной строке переходим в C:\WINDOWS\Microsoft.NET\Framework\версия фреймворка вашего приложения\.
2) Для установки службы дописываем: InstallUtil.exe "c:\myservice.exe", естественно заменяя путь и название исполняемого файла вашим собственным.
Для удаления службы используйте следующий синтаксис: InstallUtil.exe /u "c:\myservice.exe".
П.С. У меня тоже 2010 студия и семерка х64. Так что проблема явно не версиях. Ах да, еще не забудьте встроить в проект инсталлер для службы: правой кнопкой в дизайнере, там найдете соответствующий пункт. Потом настроете его - мелочи вроде названия, описания, отображаемого имени, типа запуска и т.п.
1
2 / 2 / 0
Регистрация: 21.04.2011
Сообщений: 60
27.04.2011, 14:47  [ТС] 12
Как я сразу недогадался то, ведь названия разные, точно, попробую все как Вы сказали, я только думаю как принудительно установить службу у пользователя на коспьютере? Возможно ли так вообще? Например я могу использовать install shield который поддерживает С# написать функцию которая будет устанавливать службу пользователю во время иснсталяции игры, или может лоадер который при запуске игры будет устанавливать службу? Как лучше будет реализовать?

ЗЫ. У меня тоже 7ка х64 и visual 2010 Ultimate
ЗЫ2. Просто я сейчас не дома как прийду сразу попробую все исправлю, установлю.
ЗЫ3. А вообще у меня сначала было консольное приложения которое прятало себя сразу после запуска в нем был таймер и функция сканировани процесов и все остальное, несомненно Ваш способ куда интереснее и лучше.

Добавлено через 2 часа 31 минуту
Странно, при установке службы требует имя пользователя и пароль вводил и новые и данные входа в систему пароль/имя все время пишет что неправильные данные и установка откатывается.
0
142 / 142 / 26
Регистрация: 09.10.2009
Сообщений: 261
27.04.2011, 18:43 13
Лучше конечно устанавливать службу при установке самой игры. Пользователь вряд ли будет ставить игру не под администратором системы, так что проблем быть не должно.
Вы инсталлер добавили в проект? Вот в настройках serviceProcessInstaller, в поле Account видимо стоит User. Нужно ставить LocalSystem.
1
2 / 2 / 0
Регистрация: 21.04.2011
Сообщений: 60
28.04.2011, 01:51  [ТС] 14
Огромное Вам спасибо за все, все получилось и со всем окончательно разобрался, появится монетка я вернусь, найду Вас и отблагодарю))))) Спасибо!!! Но вдруг если что спрошу еще)
0
2 / 2 / 0
Регистрация: 21.04.2011
Сообщений: 60
29.04.2011, 13:41  [ТС] 15
Я извиняюсь еще раз, уперся в Ваш код:

var sc = new ServiceController("Game Watcher Service");

if (sc.Status != ServiceControllerStatus.Running)
// Закрываем приложение
Можно ли его занести в отдельный лоадер? например в консольное приложение неполучается занести проверку так как нет пространства имен System.Service и System.ServiceProcess тоже, а если создавать в коде службы то впринципе все работат но уже как отдельная служба, может создать нужно отдельный тип проекта какой-то?

Добавлено через 22 минуты
Добавил референс System.ServiceProcess, тогда ругается на код, а референса System.ServiceController нету вродебы.

Добавлено через 34 минуты
Мои ошибки, разобрался.
0
0 / 0 / 0
Регистрация: 21.07.2011
Сообщений: 61
24.08.2011, 10:09 16
Цитата Сообщение от ArtOfLife Посмотреть сообщение
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
        static public bool IsProcessOpen(string name)
        {
            return Process.GetProcesses().Any(clsProcess => clsProcess.ProcessName.Contains(name));
        }
 
        static public bool FindAndKillProcess(string name)
        {
            foreach (Process clsProcess in Process.GetProcesses())
            {
                if (clsProcess.ProcessName.StartsWith(name))
                {
                    clsProcess.Kill();
                    return true;
                }
            }
 
            return false;
        }
 
        static void Main()
        {
            if (IsProcessOpen("winamp"))
                if (IsProcessOpen("notepad"))
                    FindAndKillProcess("notepad");
        }
Подскажите, в чём может быть проблема? Использую этот код, но выдаются 2 ошибки, связанные с фигурными скобками.
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
 
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        { //на этой скобке ошибка "} expected"
 
            static public bool IsProcessOpen(string name)
            {
                return Process.GetProcesses().Any(clsProcess => clsProcess.ProcessName.Contains(name));
            }
 
            static public bool FindAndKillProcess(string name)
            {
                foreach (Process clsProcess in Process.GetProcesses())
                {
                    if (clsProcess.ProcessName.StartsWith(name))
                    {
                        clsProcess.Kill();
                        return true;
                    }
                }
 
                return false;
            }
 
            static void Main()
            {
                if (IsProcessOpen("winamp"))
                    FindAndKillProcess("notepad");
            }     
       }
    }
} //на этой скобке ошибка "Type or namespace definition, or end-of-file expected"
Хотя на взгляд вроде бы все фигурные скобки открыты и закрыты правильно, болтающихся скобок нигде нет.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.08.2011, 10:09

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Вывод MessageBox из окна другого процесса
Помогите реализовать вывод меседжбокса из окна другого процесса

Как лучше приостановить службу из другого процесса?
Имеется служба самописная, и имеется клиент , работающий с ней. Как лучше выполнять приостановку...

Вызов функции другого процесса (неверные регистры)
Всем привет. Я пытаюсь вызвать функцию из другого процесса, но вот беда - регистры формируются не...

Получить ID процесса если известно его хэндл, название окна или название процесса
а как получить ID процесса если известно его хэндл, название окна или название процесса?

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

Как узнать класс окна другого процесса? Желательно найти класс окна по PID процесса
Мне нужно узнать класс другого окна по PID процесса


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.