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

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

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

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

Добавлено через 6 часов 57 минут
Вот еще более простой способ нашел на forum.oszone.net
Код
$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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.02.2016, 17:58
Ответы с готовыми решениями:

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

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

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

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

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

Добавлено через 25 минут
Вот еще один способ, расширенный вариант предыдущих:
http://www.csharpcoderr.com/20... nager.html
Правда при этом блокируется возможность обновления списка задач.
0
Ушел с форума
Эксперт С++
16425 / 7399 / 1186
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
25.02.2016, 20:45 4
Лучший ответ Сообщение было отмечено 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  [ТС] 5
Т.е. написать C++ DLL, подключить её к C# приложению и вызвать в нем метод Hide ?
0
Ушел с форума
Эксперт С++
16425 / 7399 / 1186
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
28.02.2016, 14:14 6
Написать на C++ dll, загрузить ее в нужный процесс и там похукать функции
типа NtQueryInformationProcess.
0
972 / 867 / 349
Регистрация: 26.04.2012
Сообщений: 2,647
28.02.2016, 17:48 7
Я лично пользовался для подобной задачи (внедрение в покерный клиент и присобачивание к нему некоторого функционала) библиотекой 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  [ТС] 8
Цитата Сообщение от Убежденный Посмотреть сообщение
Написать на C++ dll, загрузить ее в нужный процесс и там похукать функции
Кажется я понял, код отвечающий за скрытие процесса должен быть написан на C++ и скомпилирован в DLL. Дальше в своей C# программе я эту DLL должен внедрить в Taskmgr.exe, как сказано в предыдущем сообщении.
Вопрос 1:
Во время внедрения DLL мы внедряемся в программный поток, т.е. то что в ОЗУ является Taskmgr.exe? Сам файл приэтом не изменяется же?
Вопрос 2:
Есть примеры C++ кода с необходимым мне функционалом который я при незначительных изменениях мог бы адаптировать под себя? В C++ и WinAPI не силен, и мне очень сложно въехать.
0
Хитрая блондиночка $)
1464 / 979 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
28.02.2016, 18:19 9
А зачем тебе скрываться? Зловрединку рожаешь?
Или просто чтоб пользователь на смог случайно выкинуть твой процесс, который что-то важное отрабатывает?
Если да, тогда лучше будет пересмотреть работу твоего ПО так, чтоб даже вышибалы не смогли навредить результатам его работы. От сокрытия тебе лучше не станет - по себе знаю.
0
68 / 68 / 42
Регистрация: 30.03.2015
Сообщений: 372
28.02.2016, 18:35  [ТС] 10
Hikari, скрыть пару процессов мне нужно в эстетических целях - основная программа для своей работы запускает пару других, и чтоб у пользователя отображалась одна запущенная программа вместо трех требуется закрыть пару других.
Ну и да, если пользователь сочтет что у него запущен какой-то левый процесс и он его закроет, то это нарушит работу всей программы.
0
972 / 867 / 349
Регистрация: 26.04.2012
Сообщений: 2,647
28.02.2016, 18:48 11
Цитата Сообщение от 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  [ТС] 12
Цитата Сообщение от EvilFromHell Посмотреть сообщение
Так вот вам надо внедрить свою dllку в адресное пространство диспетчера задач, а потом подменить адреса этих самых Api функций на адреса функций из своей dllки. Это легко делается при помощи указанной выше библиотеки. Тогда, когда диспетчер задач попытается получить информацию о процессах, он вызовет вашу функцию , а не стандартную. А вы в своей функции уже вызовете стандартную, почистите то, что она возвращает, от процессов, которые вы хотите скрыть, и вернете почищенный результат.
Звучит как элементарное override в C#.
0
972 / 867 / 349
Регистрация: 26.04.2012
Сообщений: 2,647
28.02.2016, 19:03 13
Constantius24, ну да, смысл абсолютно тот же, только в чужом процессе и без ООП.
0
Хитрая блондиночка $)
1464 / 979 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
28.02.2016, 20:18 14
Цитата Сообщение от Constantius24 Посмотреть сообщение
скрыть пару процессов мне нужно в эстетических целях
Боюсь антивирусы твои благие намерения не поймут...
Я бы сказала - овчинка выделки не стоит.
1
68 / 68 / 42
Регистрация: 30.03.2015
Сообщений: 372
28.02.2016, 20:39  [ТС] 15
Hikari, а если приложение запускать с правами администратора, то думаю все будет нормально.
0
232 / 135 / 19
Регистрация: 10.11.2015
Сообщений: 305
28.02.2016, 20:46 16
Constantius24, небудет.

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

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

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

Добавлено через 3 минуты
Constantius24, у меня на ассемблере код.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.02.2016, 21:23

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

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

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

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


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

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

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