Windows 中的最強釘子戶!刪不掉的檔案

先前上ECSA課程的時候老師有教到,覺得挺有趣的。
Windows中的最強釘子戶!刪不掉的檔案。

Windows 命名說明

首先我們來談談Windows當中檔案命名的這件事情,
Windows有一些禁止事項,例如對於檔案名稱的限制,
Windows當中對於檔案的命名有一些限制,你無法使用一些特殊字元作為檔案名稱。

詳細請參考微軟官方文件:
命名檔案、路徑和命名空間

針對名稱使用目前字碼頁中的任何字元,包括擴充字元集中的 Unicode 字元和字元(128-255),但下列除外:

下列保留字元:

< (小於)
> (大於)
: (冒號)
” (雙引號)
/ (正斜線)
\ (反斜線)
|(垂直橫條或管道)
? (問號)
* (星號)

所以當你想要使用尖括號<>作為名稱時,
會跳出提醒跟你說不能用這些字元唷~
這些字元在Windows中被視為不允許的檔案名稱字元,
如果嘗試在檔案名稱中包含這些字元,系統會拒絕並顯示錯誤訊息。

除此之外,Windows當中有一些保留關鍵字,
例如con,你不能將檔案名稱取為con。
一樣會跳出錯誤。

請勿使用下列保留名稱作為檔案名:

CON、PRN、AUX、NUL、COM0、COM1、COM2、COM3、COM4、COM5、COM6、COM7、COM8、COM9、COM1、LPT0、LPT1、LPT2、LPT3、LPT4、LPT5、LPT6、LPT7、LPT8、LPT9、LPT≦、LPT1、LPT1 和 LPT≦。 也請避免這些名稱緊接在延伸模組後面;例如,NUL.txt 和 NUL.tar.gz 都相當於 NUL。 如需詳細資訊,請參閱命名空間。

從以上的規則來看,
我們應該是可以拿空格跟點(.)作為檔案名稱的對吧?
答案是對的,
但實際上我想要取一個檔案名稱為「 . 」也會出現錯誤。

不過呢,我們仍然可以透過其他手段來建立檔案。
還有一個隱藏的小技巧,
可以讓我們直接使用Windows API,跳過檔案總管的字串解析,
也就是使用「\\?\」這個前置詞。

這個在Windows文件裡面其實也有提到,
只是光看文件有點搞不懂說甚麼而已。
我也不知道這個技術名詞叫甚麼?長路徑之類的吧?
https://learn.microsoft.com/zh-tw/windows/win32/fileio/maximum-file-path-limitation?tabs=registry

檔案建立與刪除範例

首先我們透過指令來建立「 . 」跟「 .. 」,
接著我們可以透過「\\?\]
建立「con」「COM0」這些正常無法建立的檔名
達成Windows中的最強釘子戶!

所以下面我們直接讓試試看吧
首先針對空白和點點,可以直接透過以下方式進行

# 建立 .. 目錄
mkdir C:\Users\Kai\Documents\filename\".. \. \"
# 手動以及rmdir都無法刪除
rmdir C:\Users\Kai\Documents\filename\".. \. \"
# 利用前置詞,加上/s參數遞迴刪除成功(注意我這邊刪除的是第一層的目錄)
rmdir /s \\?\C:\Users\Kai\Documents\filename\".. "
Code language: PHP (php)

接著第二個範例,我們來建立保留字的檔案

# 直接產生檔案會失敗
mkdir C:\Users\Kai\Documents\filename\con 
# 使用前置詞則可以成功
mkdir \\?\C:\Users\Kai\Documents\filename\con
# 同樣手動跟del/rmdir都無法刪除
del C:\Users\Kai\Documents\filename\con
rmdir C:\Users\Kai\Documents\filename\con
# 利用前置詞刪除成功
rmdir \\?\C:\Users\Kai\Documents\filename\conCode language: PHP (php)

除錯補充

順便提一下,檔案用del刪除,目錄用rmdir刪除
如果用del跟rmdir刪除遇到問題
del可以試試刪除/f /q /a之類
rmdir可以試試/s /q
詳細可以參考官方文件
https://learn.microsoft.com/zh-tw/windows-server/administration/windows-commands/del
https://learn.microsoft.com/zh-tw/windows-server/administration/windows-commands/rmdir

如果出現
『程序無法存取檔案,因為檔案正由另一個程序使用。』的錯誤
稍微注意一下,你目前使用的cmd的視窗
是不是從該目錄所啟動的,或是cmd路徑在正要刪除的目錄中
如果是的話,就沒辦法刪除

讀書會也有朋友分享過”類似”的東西
(是跟今天文章不同的東西,但有點類似也滿有趣的)

至於這個奇怪的小技巧
會不會造成路徑解析漏洞、簽章驗證繞過、駭客攻擊手法使用
這又是另一個故事了
今天純粹就是當成分享一個冷門好玩的東西而已

This Post Has One Comment

  1. Explorer09

    Linux 用戶表示,你這些是雕蟲小技。
    1.檔案系統本來就可以存在頭或尾有空格的檔名,只是實際上多數應用程式都會把檔名頭尾的空格濾掉讓你無法建立成功。
    2. CON AUX 等也是類似,Windows 為了避免跟裝置檔案衝突會禁止這些保留檔名的建立,但是在 Unix/Linux 裡完全沒這限制,即使你在 Windows 刪不了名為 CON 或 AUX 等的保留檔名,我在 Linux 裡可以照樣刪。
    要解一個被病毒感染的電腦,有 Linux 很好用。

發佈留言