为了账号安全,请及时绑定邮箱和手机立即绑定

如何检查文件头结构以识别 MSI 文件

如何检查文件头结构以识别 MSI 文件

C#
慕婉清6462132 2021-07-03 14:51:04
我正在开发一个解决方案,我需要能够检查文件是否属于我无法信任该文件的扩展名的特定类型。我已经能够识别 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 回答

?
HUWWW

TA贡献1874条经验 获得超12个赞

MSI 文件格式是 Microsoft 私有指定的格式。这真是一个奇怪的野兽,我的意思是谁会拿一个 SQL 数据库,将其强制转换为 COM 存储格式并调用该 MSI?但就是这样。


一个干净的方法是引用Windows Installer SDK并尝试调用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 文件区分开来。


查看完整回答
反对 回复 2021-07-17
  • 1 回答
  • 0 关注
  • 199 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信