亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何檢查文件頭結構以識別 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 關注
  • 225 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號