Возможно ли скрыть процесс в диспетчере задач посредством только C#?
Формулировка задачи:
Здраствуйте интересует собстевенно вопрос, возможно ли скрыть процесс от диспетчера задач постредством только C# без использования сторонних библиотек и драйверов?Ну и да бы не создавать новой темы может-быть кто то подскажет как можно воплотить в жизнь генерацию случайного имени для процесса?
P.S Хотелось бы конкретики примера в коде, ссылок где ето реализовано.
Решение задачи: «Возможно ли скрыть процесс в диспетчере задач посредством только C#?»
textual
Листинг программы
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Runtime.InteropServices;
- using System.Security.AccessControl;
- using System.Security.Principal;
- using System.ComponentModel;
- using System.Diagnostics;
- namespace ConsoleApplication1
- {
- class Program
- {
- static void Main(string[] args)
- {
- ProtectionProcess pp = new ProtectionProcess();
- pp.ProtectionOn(Process.GetCurrentProcess().Handle);
- Console.ReadLine();
- }
- }
- class ProtectionProcess
- {
- [DllImport("advapi32.dll", SetLastError = true)]
- static extern bool GetKernelObjectSecurity(IntPtr Handle, int securityInformation, [Out] byte[] pSecurityDescriptor,
- uint nLength, out uint lpnLengthNeeded);
- [DllImport("advapi32.dll", SetLastError = true)]
- static extern bool SetKernelObjectSecurity(IntPtr Handle, int securityInformation, [In] byte[] pSecurityDescriptor);
- [Flags]
- private enum ProcessAccessRights
- {
- PROCESS_CREATE_PROCESS = 0x0080,
- PROCESS_CREATE_THREAD = 0x0002,
- PROCESS_DUP_HANDLE = 0x0040,
- PROCESS_QUERY_INFORMATION = 0x0400,
- PROCESS_QUERY_LIMITED_INFORMATION = 0x1000,
- PROCESS_SET_INFORMATION = 0x0200,
- PROCESS_SET_QUOTA = 0x0100,
- PROCESS_SUSPEND_RESUME = 0x0800,
- PROCESS_TERMINATE = 0x0001,
- PROCESS_VM_OPERATION = 0x0008,
- PROCESS_VM_READ = 0x0010,
- PROCESS_VM_WRITE = 0x0020,
- DELETE = 0x00010000,
- READ_CONTROL = 0x00020000,
- SYNCHRONIZE = 0x00100000,
- WRITE_DAC = 0x00040000,
- WRITE_OWNER = 0x00080000,
- STANDARD_RIGHTS_REQUIRED = 0x000f0000,
- PROCESS_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF),
- }
- private void SetProcessSecurityDescriptor(IntPtr processHandle, RawSecurityDescriptor dacl)
- {
- const int DACL_SECURITY_INFORMATION = 0x00000004;
- byte[] rawsd = new byte[dacl.BinaryLength];
- dacl.GetBinaryForm(rawsd, 0);
- if (!SetKernelObjectSecurity(processHandle, DACL_SECURITY_INFORMATION, rawsd))
- throw new Win32Exception();
- }
- private RawSecurityDescriptor GetProcessSecurityDescriptor(IntPtr processHandle)
- {
- const int DACL_SECURITY_INFORMATION = 0x00000004;
- byte[] psd = new byte[0];
- uint bufSizeNeeded;
- GetKernelObjectSecurity(processHandle, DACL_SECURITY_INFORMATION, psd, 0, out bufSizeNeeded);
- if (bufSizeNeeded < 0 || bufSizeNeeded > short.MaxValue)
- throw new Win32Exception();
- if (!GetKernelObjectSecurity(processHandle, DACL_SECURITY_INFORMATION,
- psd = new byte[bufSizeNeeded], bufSizeNeeded, out bufSizeNeeded))
- throw new Win32Exception();
- return new RawSecurityDescriptor(psd, 0);
- }
- public void ProtectionOn(IntPtr hProcess)
- {
- var dacl = GetProcessSecurityDescriptor(hProcess);
- dacl.DiscretionaryAcl.InsertAce(0,new CommonAce(AceFlags.None,AceQualifier.AccessDenied, (int)ProcessAccessRights.PROCESS_ALL_ACCESS,new SecurityIdentifier(WellKnownSidType.WorldSid, null),false, null));
- SetProcessSecurityDescriptor(hProcess, dacl);
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д