Как проверить структуру заголовка файла для идентификации файла MSI - PullRequest
0 голосов
/ 01 июня 2018

Я разрабатываю решение, в котором мне нужно иметь возможность проверить, относится ли файл к определенным типам, и я не могу доверять имени расширения этого файла.

Я уже могу определить 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;
}

1 Ответ

0 голосов
/ 01 июня 2018

Формат файла MSI является частным форматом Microsoft.Это действительно странный зверь, я имею в виду, кто возьмет базу данных SQL, переведет ее в формат хранения COM и вызовет этот MSI?Но это то, что есть.

Связанный: Установщик Windows в формате MSI

Чистым способом было бы сослаться на SDK установщика Windows и попытаться выполнитьвызовите MsiVerifyPackage ( документация ) для файла, который вы подозреваете в качестве MSI, если вызов вернет ERROR_SUCCESS, вы считаете его верным.

Для этого доступна управляемая версия.NET:

using Microsoft.Deployment.WindowsInstaller;

...

if(Installer.VerifyPackage(fullpath))
{
    /* positive. it may still be corrupt,
     * but the API says it is a Microsoft Installer package */
}

Более практичным, легким и быстрым подходом будет проверка последовательности

D0 CF 11 E0 A1 B1 1A E1

, которая отличает ее от файлов Cerius2, имеющих такое же расширение.

( Источник )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...