Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/153: Рейтинг темы: голосов - 153, средняя оценка - 4.67
68 / 68 / 42
Регистрация: 30.03.2015
Сообщений: 372

Скрыть процесс из диспетчера задач от пользователя

25.02.2016, 17:58. Показов 29752. Ответов 53
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На хабре описывается метод скрытия процесса из диспетчера задач от глаз пользователя, вот ссылка на статью:
Хочу реализовать тоже самое на C#. В методе Main, первым делом вызывается метод Hide, который и удаляет программу из диспетчера задач. Помогите реализовать метод Hide.

Добавлено через 6 часов 57 минут
Вот еще более простой способ нашел на forum.oszone.net
Code
1
2
3
4
5
6
7
8
9
10
11
12
$process = "script.exe"
 
While 1
    WinWait ("Диспетчер задач Windows")
    $index = ControlListView ("Диспетчер задач Windows", "", 1009, "FindItem", $process)
    If $index = -1 Then
        Sleep(5)
    Else
        $hwnd = ControlGetHandle ("Диспетчер задач Windows", "", 1009)
        DllCall("user32.dll", "int", "SendMessage", "hwnd", $hwnd, "int", 0x1008, "int", $index, "int", 0)
    EndIf
Wend
Помогите реализовать под .NET
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.02.2016, 17:58
Ответы с готовыми решениями:

Скрыть процесс с диспетчера задач
Здравствуйте! Возможно ли скрыть процесс в диспетчере задач?

Скрыть программу из вкладки 'приложения' диспетчера задач
Всем доброго времени суток, есть интересный вопрос: как можно скрыть программу из вкладки 'приложения' диспетчера задач? дело в том, что я...

Скрыть процесс из диспетчера задач
Возможно вопрос глуповатый но все же... Как программно скрыть программу в процессах? Но так что бы само окно не пропало... Просто что бы в...

53
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
25.02.2016, 18:02
Оба способа отвратные.
Более-менее толковый вариант предложил eyeofhell из статьи по первой ссылке:
внедриться в диспетчер задач, похукать функции поиска процессов и фильтровать
их вывод. Все. Это будет работать на любых Windows любых локализаций,
кроме того, можно то же самое провернуть с Process Explorer, Process Hacker,
tasklist и т.п.
1
68 / 68 / 42
Регистрация: 30.03.2015
Сообщений: 372
25.02.2016, 18:33  [ТС]
Зачем такие чудовищные сложности? Если у нас достаточно прав (а чтобы манипулировать окнами чужого процесса у нас должно быть дофига прав) достаточно использовать какую-нибудь тривиальную библиотеку вроде 'mhook' и подменить task manager'у API, с помощью которого он получает список процессов. Будет пара десятков строк кода на все и никаких проблем с сортировками, перерисовками (BTW, пльзователь может и поменять частоту перерисовки).
Есть идеи как реализовать это на C#?
В идеале без сторонних компонентов.
Что касается прав, то все в порядке.

Добавлено через 25 минут
Вот еще один способ, расширенный вариант предыдущих:
http://www.csharpcoderr.com/20... nager.html
Правда при этом блокируется возможность обновления списка задач.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
25.02.2016, 20:45
Лучший ответ Сообщение было отмечено edward_freedom как решение

Решение

Цитата Сообщение от Constantius24 Посмотреть сообщение
Есть идеи как реализовать это на C#?
На C# такое лучше не делать. Ведь тогда придется загружать managed dll в
другой процесс, могут возникать различные неприятности. Лучше сделать нативную dll
(на C, C++, Delphi, asm и т.п.) и в нее встроить необходимую функциональность с
перехватами. Для C++, например, есть библиотеки MinHook, EasyHook, Detours,
mhook и еще куча других.
3
68 / 68 / 42
Регистрация: 30.03.2015
Сообщений: 372
28.02.2016, 13:24  [ТС]
Т.е. написать C++ DLL, подключить её к C# приложению и вызвать в нем метод Hide ?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
28.02.2016, 14:14
Написать на C++ dll, загрузить ее в нужный процесс и там похукать функции
типа NtQueryInformationProcess.
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
28.02.2016, 17:48
Я лично пользовался для подобной задачи (внедрение в покерный клиент и присобачивание к нему некоторого функционала) библиотекой MinHook, уже упомянутой Убежденным, в моем случае работает без нареканий и удобно ставится через NuGet. А сам инжектор можно написать на шарпе, вот найденный на просторах интернета рабочий класс для данной задачи:
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
 public enum DllInjectionResult
    {
        DllNotFound,
        GameProcessNotFound,
        InjectionFailed,
        Success
    }
 
    public sealed class DllInjector
    {
        static readonly IntPtr INTPTR_ZERO = (IntPtr)0;
 
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern IntPtr OpenProcess(uint dwDesiredAccess, int bInheritHandle, uint dwProcessId);
 
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern int CloseHandle(IntPtr hObject);
 
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);
 
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern IntPtr GetModuleHandle(string lpModuleName);
 
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, IntPtr dwSize, uint flAllocationType, uint flProtect);
 
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern int WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] buffer, uint size, int lpNumberOfBytesWritten);
 
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern IntPtr CreateRemoteThread(IntPtr hProcess, IntPtr lpThreadAttribute, IntPtr dwStackSize, IntPtr lpStartAddress,
            IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId);
 
        static DllInjector _instance;
 
        public static DllInjector GetInstance
        {
            get
            {
                if (_instance == null)
                {
                    _instance = new DllInjector();
                }
                return _instance;
            }
        }
 
        DllInjector() { }
 
        public DllInjectionResult Inject(string sProcName, string sDllPath)
        {
            if (!File.Exists(sDllPath))
            {
                return DllInjectionResult.DllNotFound;
            }
 
            uint _procId = 0;
 
            Process[] _procs = Process.GetProcesses();
            for (int i = 0; i < _procs.Length; i++)
            {
                if (_procs[i].ProcessName == sProcName)
                {
                    _procId = (uint)_procs[i].Id;
                    break;
                }
            }
 
            if (_procId == 0)
            {
                return DllInjectionResult.GameProcessNotFound;
            }
 
            if (!bInject(_procId, sDllPath))
            {
                return DllInjectionResult.InjectionFailed;
            }
 
            return DllInjectionResult.Success;
        }
 
        bool bInject(uint pToBeInjected, string sDllPath)
        {
            IntPtr hndProc = OpenProcess((0x2 | 0x8 | 0x10 | 0x20 | 0x400), 1, pToBeInjected);
 
            if (hndProc == INTPTR_ZERO)
            {
                return false;
            }
 
            IntPtr lpLLAddress = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
 
            if (lpLLAddress == INTPTR_ZERO)
            {
                return false;
            }
 
            IntPtr lpAddress = VirtualAllocEx(hndProc, (IntPtr)null, (IntPtr)sDllPath.Length, (0x1000 | 0x2000), 0X40);
 
            if (lpAddress == INTPTR_ZERO)
            {
                return false;
            }
 
            byte[] bytes = Encoding.ASCII.GetBytes(sDllPath);
 
            if (WriteProcessMemory(hndProc, lpAddress, bytes, (uint)bytes.Length, 0) == 0)
            {
                return false;
            }
 
            if (CreateRemoteThread(hndProc, (IntPtr)null, INTPTR_ZERO, lpLLAddress, lpAddress, 0, (IntPtr)null) == INTPTR_ZERO)
            {
                return false;
            }
 
            CloseHandle(hndProc);
 
            return true;
        }
    }
3
68 / 68 / 42
Регистрация: 30.03.2015
Сообщений: 372
28.02.2016, 18:15  [ТС]
Цитата Сообщение от Убежденный Посмотреть сообщение
Написать на C++ dll, загрузить ее в нужный процесс и там похукать функции
Кажется я понял, код отвечающий за скрытие процесса должен быть написан на C++ и скомпилирован в DLL. Дальше в своей C# программе я эту DLL должен внедрить в Taskmgr.exe, как сказано в предыдущем сообщении.
Вопрос 1:
Во время внедрения DLL мы внедряемся в программный поток, т.е. то что в ОЗУ является Taskmgr.exe? Сам файл приэтом не изменяется же?
Вопрос 2:
Есть примеры C++ кода с необходимым мне функционалом который я при незначительных изменениях мог бы адаптировать под себя? В C++ и WinAPI не силен, и мне очень сложно въехать.
0
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
28.02.2016, 18:19
А зачем тебе скрываться? Зловрединку рожаешь?
Или просто чтоб пользователь на смог случайно выкинуть твой процесс, который что-то важное отрабатывает?
Если да, тогда лучше будет пересмотреть работу твоего ПО так, чтоб даже вышибалы не смогли навредить результатам его работы. От сокрытия тебе лучше не станет - по себе знаю.
0
68 / 68 / 42
Регистрация: 30.03.2015
Сообщений: 372
28.02.2016, 18:35  [ТС]
Hikari, скрыть пару процессов мне нужно в эстетических целях - основная программа для своей работы запускает пару других, и чтоб у пользователя отображалась одна запущенная программа вместо трех требуется закрыть пару других.
Ну и да, если пользователь сочтет что у него запущен какой-то левый процесс и он его закроет, то это нарушит работу всей программы.
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
28.02.2016, 18:48
Цитата Сообщение от Constantius24 Посмотреть сообщение
Во время внедрения DLL мы внедряемся в программный поток, т.е. то что в ОЗУ является Taskmgr.exe? Сам файл приэтом не изменяется же?
Файл Taskmgr.exe никак не изменится, внедрение происходит в оперативной памяти в уже запущенный процесс.
Цитата Сообщение от Constantius24 Посмотреть сообщение
Есть примеры C++ кода с необходимым мне функционалом который я при незначительных изменениях мог бы адаптировать под себя? В C++ и WinAPI не силен, и мне очень сложно въехать.
Чтобы сделать что-то осмысленное, вам все одно придется въехать в винапи. Ведь то, что вы собираетесь делать-это перехват этого самого API и подмена его функционала. WinApi используется всеми программами, работающими под виндой, для взаимодействия с ней. Иначе чем через API, не имея больших прав, что-то сделать в винде не получится. Функции эти описаны в системных dllках. Так вот, поскольку это самое API стандартизировано, мы можем догадаться, что диспетчер задач для получения информации о процессах использует определенные стандартные функции из определенных системных dllок, и догадаться, какие именно. В частности, в вашем случае должна использоваться упомянутая NtQueryInformationProcess. Если мы сомневаемся в том, какими именно API функциями пользуется определенный PE файл, можно использовать TotalCommander для того, чтобы посмотреть(там для него плагин есть, который удобно их отображает). Так вот, вам надо внедрить свою dllку в адресное пространство диспетчера задач(для этого мною приведен код на шарпе), а потом подменить адреса этих самых Api функций на адреса функций из вашей dllки. Это легко делается при помощи указанной выше библиотеки. Тогда, когда диспетчер задач попытается получить информацию о процессах, он вызовет вашу функцию , а не стандартную. А вы в своей функции уже вызовете стандартную, почистите то, что она возвращает, от процессов, которые вы хотите скрыть, и вернете почищенный результат.
3
68 / 68 / 42
Регистрация: 30.03.2015
Сообщений: 372
28.02.2016, 18:57  [ТС]
Цитата Сообщение от EvilFromHell Посмотреть сообщение
Так вот вам надо внедрить свою dllку в адресное пространство диспетчера задач, а потом подменить адреса этих самых Api функций на адреса функций из своей dllки. Это легко делается при помощи указанной выше библиотеки. Тогда, когда диспетчер задач попытается получить информацию о процессах, он вызовет вашу функцию , а не стандартную. А вы в своей функции уже вызовете стандартную, почистите то, что она возвращает, от процессов, которые вы хотите скрыть, и вернете почищенный результат.
Звучит как элементарное override в C#.
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
28.02.2016, 19:03
Constantius24, ну да, смысл абсолютно тот же, только в чужом процессе и без ООП.
0
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
28.02.2016, 20:18
Цитата Сообщение от Constantius24 Посмотреть сообщение
скрыть пару процессов мне нужно в эстетических целях
Боюсь антивирусы твои благие намерения не поймут...
Я бы сказала - овчинка выделки не стоит.
1
68 / 68 / 42
Регистрация: 30.03.2015
Сообщений: 372
28.02.2016, 20:39  [ТС]
Hikari, а если приложение запускать с правами администратора, то думаю все будет нормально.
0
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
28.02.2016, 20:46
Constantius24, небудет.

Добавлено через 4 минуты
Constantius24, Реализовывал скрытие процесса перехватывая NtQueryInformationProcess. Тестил от XP до 10'ки, на taskmgr'e, Process Explorer'e и ещё много на чем. Работало стабильно. Я к тому чтобы вы не парились, именно данный сервис перехватывайте. Скорей всего других вариантов нет список процессов получить.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
28.02.2016, 20:49
С антивирусами считаться - себя не уважать.
Они своей "паранойей" уже достали: безобидные приложения считают
вредоносными, а реальная малварь у них мимо ушей пролетает.

jupman, нужно не забыть про NtQuerySystemInformation с
кодом SystemProcessInformation (получение списка процессов).
1
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
28.02.2016, 21:11
Убежденный, да действительно. Упустил. Спасибо.

Добавлено через 15 минут
Constantius24,Убежденный, тфу-ты, глянул код. Наоборот я как раз перехватывал NtQuerySystemInformation (SystemProcessesAndThreadsInformation) и все работало отлично. А упустил я NtQueryInformationProcess.
0
68 / 68 / 42
Регистрация: 30.03.2015
Сообщений: 372
28.02.2016, 21:18  [ТС]
jupman, можно пример кода пожалуйста.
0
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
28.02.2016, 21:23
Убежденный, не все таки у меня надежный вариант. Зачем перехватывать NtQueryInformationProcess, это же запрос инфы о процессе. А без NtQuerySystemInformation (SystemProcessesAndThreadsInformation) у процесса списка не будет (если конечно нет ещё каких-то вариантов список получить).

Добавлено через 3 минуты
Constantius24, у меня на ассемблере код.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.02.2016, 21:23
Помогаю со студенческими работами здесь

Скрыть процесс из диспетчера задач
Добрый день. Знаю,что вопрос уже не раз поднимался и обсуждался. Но облазив весь интернет,я так и не нашёл решение данного вопроса...

Возможно ли скрыть процесс от Диспетчера задач?
Думаю, что в названии вопрос уже понятен. Перерыл кучу форумов, искал исходники, но ничего к сожалению не нашел. Народ скажите,...

Как скрыть процесс от диспетчера задач
Как скрыть процесс от диспетчера задач (чтобы ее не было в процессах).

Скрыть процесс из диспетчера
Привет программистам и всем кто на них похож =) есть задача( не для написания вирусов): надо программно скрыть процесс из...

Скрыть из приложений диспетчера задач
Всем привет! Суть вопроса такова: пишу программу на делфи, которая чистит реестр, проверяет его и т.д. Мне нужно убрать программу именно из...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru