#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:
Исправление для этого заключается в использовании правильной разрядности.