Возможно ли скрыть процесс в диспетчере задач посредством только 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);
}
}
}