首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Windows 檔案保護 (WFP/SFC) API 應用:列舉受保護檔案與檢測檔案狀態

     編輯:關於C++

前言:系統檔案保護機制

Windows File Protection (WFP, Windows 2000/XP) / System File Checker (SFC) 透過 **SFC API** 保護關鍵系統檔案不被覆寫/刪除。開發安裝程式、修補工具、安全掃描器時,常需**列舉受保護清單**或**檢測特定檔案是否受保護**。本文提供 C++Builder 可直接編譯的實作程式碼。

核心 API 與標頭檔

  • 標頭檔:sfc.h (Platform SDK / Windows SDK)
  • 匯入庫:sfc.lib (專案連結設定加入)
  • 關鍵函數:
    • SfcGetNextProtectedFile:列舉下一個受保護檔案
    • SfcIsFileProtected:檢測指定檔案是否受保護

完整實作程式碼

//---------------------------------------------------------------------------
#include 
// 專案需連結 sfc.lib
//---------------------------------------------------------------------------

// 列出所有受保護檔案
void __fastcall ListAllProtectedFile(TStrings *pList)
{
    PROTECTED_FILE_DATA data = {0};
    data.FileNumber = 0; // 從頭開始

    while (SfcGetNextProtectedFile(NULL, &data))
    {
        if (data.FileNumber != 0) // 略過初始項
        {
            pList->Add(data.FileName); // 檔案完整路徑
        }
    }
}

// 判斷單一檔案是否受保護
bool __fastcall IsFileProtected(String strFile)
{
    WCHAR wszFileName[MAX_PATH];
    MultiByteToWideChar(CP_ACP, 0, strFile.c_str(), -1, wszFileName, MAX_PATH);
    return SfcIsFileProtected(NULL, wszFileName);
}

// 使用範例:按鈕點擊檢測
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    // ListAllProtectedFile(Memo1->Lines); // 列舉全部 (耗時較久)
    if (IsFileProtected("E:\\Winnt\\system32\\subst1.exe"))
        ShowMessage("受保護");
    else
        ShowMessage("未受保護");
}
//---------------------------------------------------------------------------

關鍵結構定義

typedef struct _PROTECTED_FILE_DATA {
    DWORD FileNumber;   // 遞增序號,0 表開始
    WCHAR FileName[MAX_PATH]; // 完整路徑 (Unicode)
} PROTECTED_FILE_DATA, *PPROTECTED_FILE_DATA;

實務應用場景

  • 安裝程式預檢:嘗試覆寫系統檔前先檢測,避免安裝失敗或觸發 WFP 還原
  • 惡意軟體分析:掃描可疑檔案是否偽裝為系統受保護檔案
  • 系統完整性稽核:定期列舉受保護清單並驗證雜湊值
  • 熱修補/修補程式開發:確認目標檔案可否直接修改

版本差異與現代替代

作業系統機制API
Windows 2000 / XPWFPSfcIsFileProtected, SfcGetNextProtectedFile
Windows Vista / 7 / 8 / 10 / 11Windows Resource Protection (WRP)同 API 相容,但保護範圍擴大 (登錄機碼、ACL 也受保護)

現代替代:sfc /verifyonly (命令列)、PowerShell Get-SystemFileProtection、WMI Win32_ProtectedFile。

注意事項

  • 需**系統管理員權限**執行
  • 列舉完整清單可能耗時數秒,建議背景執行緒執行
  • 路徑需為完整絕對路徑,Unicode 介面 (WCHAR)
  • 若檔案不存在,SfcIsFileProtected 仍可依據資料庫判斷是否屬受保護類別
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved