(2 в 1) Как отобразить все процессы на компьютере? Как повысить права своей программы до максимума?

Собственно, есть код, который отображает все процессы на компьютере (ну, почти):

        public void proc() 
        {
            UInt32 arraySize = 120;
            UInt32 arrayBytesSize = arraySize * sizeof(UInt32);
            IntPtr[] processIds = new IntPtr[arraySize];
            UInt32 bytesCopied;

            bool success = EnumProcesses(processIds, arrayBytesSize, out bytesCopied);


            label3.Text = "success:"+success+"\n"+ "bytesCopied:"+ bytesCopied+"\n";

            UInt32 numIdsCopied = bytesCopied >> 2; ;

            textBox2.AppendText(Environment.UserDomainName + "\\" + Environment.UserName + "\n");

            string prsName = "";
            string sid = "";
            string strsid = "";
            IntPtr ExistingTokenHandle = IntPtr.Zero;
            int SECURITY_IMPERSONATION_LEVEL = 2;

            for (UInt32 index = 0; index < numIdsCopied; index++)
            {
                IntPtr hProcess = OpenProcess(ProcessAccessFlags.All, false, processIds[index]);
                if (hProcess != IntPtr.Zero)
                {
                    StringBuilder szProcessName = new StringBuilder(260);
                    IntPtr hMod = IntPtr.Zero;
                    uint cbNeeded = 0;
                    EnumProcessModules(hProcess, hMod, (uint)Marshal.SizeOf(typeof(IntPtr)), out cbNeeded);
                    if (GetModuleBaseName(hProcess, hMod, szProcessName, szProcessName.Capacity) > 0)
                    {
                        prsName = szProcessName.ToString();
                    }
                    sid = GetStrSID(hProcess);

                    if (sid != "" && prsName != "") 
                    {
                        strsid = GetNameFromSID(new SecurityIdentifier(sid));

                        if (DuplicateTokenHandle == IntPtr.Zero) 
                        {
                            if ( OpenProcessToken(hProcess, TOKEN_DUPLICATE, out ExistingTokenHandle) )
                            {
                                if (strsid.Contains("AUTHORITY") && strsid.Contains("система")) 
                                {
                                    bool duplicated = DuplicateToken(ExistingTokenHandle, SECURITY_IMPERSONATION_LEVEL, out DuplicateTokenHandle);
                                    label4.Text = prsName + " || strsid: " + strsid + " || ExistingTokenHandle:" + ExistingTokenHandle +
                                        " \n|| DuplicateTokenHandle: " + DuplicateTokenHandle + " || Is token dup?:" + duplicated;
                                }

                            }
                        }
                    }
                    textBox2.AppendText("Name:" + prsName + ". ProcessIds[{" + index + "}] = {" + processIds[index] + "}. SID=" + strsid + "\n");
                    // Close the process handle
                    CloseHandle(hProcess);
                }
                
            }

        }

Выдает не все процессы:введите сюда описание изображения

Как это можно исправить?

И 2 вопрос: как повысить свои права до максимума? Можно-ли повысить до TrustedInstaller? И можно-ли это сделать не методом выдергивания токена у другой программы, а через log pass, только без pass?

Цель: узнать как вообще зловреды повышают права для себя.


Ответы (1 шт):

Автор решения: Balabol

Короче, сам отвечу на свои вопросы:

1)вместо кода выше, за исключением кусков по вытягиванию USER_TOKEN, можно использовать эту конструкцию, чтобы получить все процессы с именами и т.п.(требуется запуск от админа)

        public void getAllProc() 
        {
            Process[] processlist = Process.GetProcesses();
            string nProc = "";
            foreach (Process theprocess in processlist)
            {
                try
                {
                    nProc = GetNameFromSID(new SecurityIdentifier(GetStrSID(theprocess.Handle)));
                }
                catch { }
                textBox2.AppendText("Process: "+ theprocess.ProcessName + " ID: " + theprocess.Id + " SID: " + nProc + "\n");
                //theprocess.Handle;
            }
        }

в итоге все процессы высвечиваются нормально и можно получить дескрипторы этих самих процессов, которые в итоге позволяют вытянуть USER_TOKEN

  1. по второму вопросу - это, скорее всего к эксплойтам
→ Ссылка