Не удается найти csrss.exe

#c# #.net #windows #powershell

#c# #.net #Windows #powershell

Вопрос:

Я пытаюсь в цифровом виде проверить некоторые процессы Windows, один из которых csrss.exe .

Я попробовал 2 метода, первым из которых является этот:

 IntPtr phCertStore = IntPtr.Zero;
IntPtr phMsg = IntPtr.Zero;
IntPtr ppvContext = IntPtr.Zero;
int pdwMsgAndCertEncodingType = 0;
int pdwContentType = 0;
int pdwFormatType = 0;
if (!Crypt32.CryptQueryObject(
    Wincrypt.CERT_QUERY_OBJECT_FILE,
    @"C:windowssystem32csrss.exe",
    Wincrypt.CERT_QUERY_CONTENT_FLAG_ALL,
    Wincrypt.CERT_QUERY_FORMAT_FLAG_ALL,
    0,
    ref pdwMsgAndCertEncodingType,
    ref pdwContentType,
    ref pdwFormatType,
    ref phCertStore,
    ref phMsg,
    ref ppvContext
))
{
    Console.WriteLine((new Win32Exception(Marshal.GetLastWin32Error())).Message);
    Console.ReadLine();
    return;
}
int pcbData = 0;
if (!Crypt32.CryptMsgGetParam(phMsg, Wincrypt.CMSG_ENCODED_MESSAGE, 0, null, ref pcbData))
{
    Console.WriteLine((new Win32Exception(Marshal.GetLastWin32Error())).Message);
    Console.ReadLine();
    return;
}
byte[] pvData = new byte[pcbData];
Crypt32.CryptMsgGetParam(phMsg, Wincrypt.CMSG_ENCODED_MESSAGE, 0, pvData, ref pcbData);
var signedCms = new SignedCms();
signedCms.Decode(pvData);
try
{
    signedCms.CheckSignature(false);
    Console.WriteLine("Signature check passed");
}
catch (Exception e)
{
    Console.WriteLine(e.Message);
}
finally
{
    Crypt32.CryptMsgClose(phMsg);
    Crypt32.CertCloseStore(phCertStore, 0);
}

Console.ReadLine();
  

и вторым является это:

 ProcessStartInfo processStartInfo = new ProcessStartInfo(@"C:WindowsSystem32WindowsPowerShellv1.0powershell.exe", $"Get-AuthenticodeSignature -FilePath "   ""C:\windows\system32\csrss.exe"");
processStartInfo.RedirectStandardOutput = true;
processStartInfo.UseShellExecute = false;

Process process = new Process();
process.StartInfo = processStartInfo;
process.Start();
process.WaitForExit();

string output = process.StandardOutput.ReadToEnd();
Console.WriteLine(output);
  

Однако оба они говорят, что файл не найден! Точно такие же аргументы powershell, скопированные в другой экземпляр powershell, РАБОТАЮТ! Если я изменю какой-либо из путей к другому подписанному файлу, это сработает!
Я даже пытался работать от имени администратора, но файл все еще не найден!
Что я делаю не так?

Комментарии:

1. Какие у вас настройки проекта? Убедитесь, что флажок x64 снят, а флажок x86 установлен.

2. Если ваш процесс 32-разрядный, он не найдет этот файл, потому что он не существует в SysWOW64 .

Ответ №1:

Исправление для этого заключается в использовании правильной разрядности.