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

C語言實現 Windows 文件夾偽裝:CLSID 擴展名欺騙與 SDK 開發實戰

     編輯:關於C語言

原理:Shell 命名空間擴展

Windows 根據文件夾名稱後綴 .{CLSID} 判斷是否為特殊系統文件夾(回收站、控制面板等),並加載對應的 Shell 命名空間擴展顯示內容。

常用 CLSID

名稱CLSID
回收站{645FF040-5081-101B-9F08-00AA002F954E}
控制面板{21EC2020-3AEA-1069-A2DD-08002B30309D}
計劃任務{D6277990-4C6A-11CF-8D87-00AA0060F5BF}
字體資料夾{BD84B380-8CA2-1069-AB1D-08000948F534}
網絡鄰居{208D2C60-3AEA-1069-A2D7-08002B30309D}

更多請查註冊表 HKEY_CLASSES_ROOT\CLSID。

手動操作驗證

  1. 新建文件夾 test。
  2. 重命名為 test.{645FF040-5081-101B-9F08-00AA002F954E}。
  3. 圖標變為回收站,雙擊進入確實是回收站內容。
  4. 命令行 cd "test.{...}" 仍可進入原文件夾(偽裝不影響真實路徑)。

SDK 程式實現(Win32 API)


#include 
#include 
#include 

bool HideFolder(const char *path, const char *clsid) {
    char newName[MAX_PATH];
    snprintf(newName, MAX_PATH, "%s.%s", path, clsid);
    return MoveFile(path, newName);
}

bool RestoreFolder(const char *path) {
    char *dot = strrchr(path, '.');
    if (!dot) return false;
    *dot = '\0';
    return MoveFile(path, path); // 實際需用原名
}

int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int) {
    /* 對話框資源包含:路徑編輯框、CLSID 下拉框、偽裝/還原/瀏覽/退出按鈕 */
    DialogBox(hInst, MAKEINTRESOURCE(IDD_MAIN), NULL, MainProc);
    return 0;
}

BOOL CALLBACK MainProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
    switch (msg) {
    case WM_INITDIALOG:
        SendMessage(GetDlgItem(hwnd, IDC_CLSID), CB_ADDSTRING, 0, (LPARAM)"回收站");
        SendMessage(GetDlgItem(hwnd, IDC_CLSID), CB_ADDSTRING, 1, (LPARAM)"控制面板");
        /* ... 初始化下拉框 ... */
        return TRUE;
    case WM_COMMAND:
        switch (LOWORD(wp)) {
        case IDC_HIDE:  // 偽裝
            GetWindowText(GetDlgItem(hwnd, IDC_PATH), path, MAX_PATH);
            int idx = SendMessage(GetDlgItem(hwnd, IDC_CLSID), CB_GETCURSEL, 0, 0);
            HideFolder(path, clsidArray[idx]);
            break;
        case IDC_REC:   // 還原
            GetWindowText(GetDlgItem(hwnd, IDC_PATH), path, MAX_PATH);
            RestoreFolder(path);
            break;
        case IDC_BROW:  // 瀏覽選擇文件夾
            BROWSEINFO bi = { hwnd, NULL, NULL, L"選擇文件夾", BIF_RETURNONLYFSDIRS };
            LPITEMIDLIST pidl = SHBrowseForFolder(&bi);
            if (pidl) { SHGetPathFromIDList(pidl, path); SetWindowText(GetDlgItem(hwnd, IDC_PATH), path); }
            break;
        case IDC_EXIT: EndDialog(hwnd, 0); break;
        }
        break;
    case WM_CLOSE: EndDialog(hwnd, 0); break;
    }
    return FALSE;
}

識別偽裝文件夾

  • 命令行 dir /a 顯示真實名稱(含 CLSID 後綴)。
  • 文件屬性對話框「自定義」頁可見「文件夾圖標」異常。
  • 安全軟體可掃描異常 CLSID 後綴。

道德與法律提醒

僅供技術研究與防禦檢測,嚴禁用於惡意隱藏惡意代碼、竊取數據等非法用途。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved