Я разрабатываю решение, в котором мне нужно иметь возможность проверить, относится ли файл к определенным типам, и я не могу доверять имени расширения этого файла.
Я уже могу определить EXE иDLL-файлы и просто нужно определить последний.
в настоящее время я не знаю, как определить MSI, что в MSI отличается от EXE и DLL?Куда мне обратиться?
например, чтобы найти DLL, я делаю следующее:
if ((ntHeader.FileHeader.Characteristics & IMAGE_FILE_DLL) != 0)
{
//If DLL then this returns True Else Return False
return (ntHeader.FileHeader.Characteristics & IMAGE_FILE_DLL) == 8192;
}
Есть ли подобное решение, чтобы узнать, имеет ли файл тип MSI?
РЕДАКТИРОВАТЬ 1 вот как я делаю это сейчас, основываясь на идее dlatikay
private static ulong FIRST_8_BYTES_OF_MSI_FILE =0xD0CF11E0A1B11AE1;
private bool MSICheck(FileStream fileData)
{
byte[] first8bytes = new byte[8];
using (BinaryReader reader = new BinaryReader(fileData))
{
reader.BaseStream.Seek(0, SeekOrigin.Begin);
reader.Read(first8bytes, 0, 7);
}
ulong sum = BitConverter.ToUInt64(first8bytes, 0);
//string hexString = BitConverter.ToString(first8bytes);
bool returnval = sum == FIRST_8_BYTES_OF_MSI_FILE;
return returnval;
//D0 CF 11 E0 A1 B1 1A E1 First 8 hexadecimal of a MSI package
//return false;
}
однако этот метод не может вызвать мой тестовый MSI-файл какMSI-файл, так что я предполагаю, что я делаю что-то не так?
Мое решение:
под руководством dlatikay
private static string FIRST_8_BYTES_OF_MSI_FILE = "D0CF11E0A1B11AE1";
private bool MSICheck(FileStream fileData)
{
byte[] first8bytes = new byte[8];
using (BinaryReader reader = new BinaryReader(fileData))
{
reader.BaseStream.Seek(0, SeekOrigin.Begin);
reader.Read(first8bytes, 0, first8bytes.Length);
}
string sum = BitConverter.ToString(first8bytes).Replace("-",""); ;
bool returnval = sum.Equals(FIRST_8_BYTES_OF_MSI_FILE);
return returnval;
//D0 CF 11 E0 A1 B1 1A E1 First 8 hexadecimal of a MSI package
//return false;
}