(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 шт):
Короче, сам отвечу на свои вопросы:
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
- по второму вопросу - это, скорее всего к эксплойтам
