อักษรไดรฟ์ใน Windows ไม่จำกัดอยู่ที่ A-Z
(ryanliptak.com)- ใน Windows สามารถใช้ สัญลักษณ์หรืออักขระที่ไม่ใช่ A~Z และไม่ใช่ ASCII เป็นอักษรไดรฟ์ได้
- ภายในระบบ เส้นทาง Win32 (
C:\foo) จะถูกแปลงเป็นและประมวลผลเป็น เส้นทาง NT namespace (\\??\\C:\foo) - โครงสร้างนี้ถูกจัดการโดย Object Manager โดยที่อักษรไดรฟ์เช่น
C:มีตัวตนเป็น ออบเจกต์ symbolic link ธรรมดา เท่านั้น - การใช้คำสั่ง
substสามารถสร้าง อักษรไดรฟ์แบบไม่มาตรฐาน อย่าง+:หรือ€:ได้ แต่ Explorer และ PowerShell ไม่สามารถรับรู้ได้ - พฤติกรรมเช่นนี้เป็นเบาะแสสำคัญในการเข้าใจโครงสร้างภายในและการเข้ารหัสของการประมวลผลเส้นทางใน Windows (เช่น WTF-16 ฯลฯ)
โครงสร้างภายในของอักษรไดรฟ์
- เส้นทางทั่วไปของ Windows (
C:\foo) เป็น เส้นทาง Win32 namespace และจะถูกแปลงเป็น เส้นทาง NT namespace เมื่อมีการเรียก API- ตัวอย่าง: เมื่อเรียก
CreateFileW("C:\foo")ภายในระบบจะถูกแปลงเป็นNtCreateFile("\\??\\C:\foo")
- ตัวอย่าง: เมื่อเรียก
\\??เป็นโฟลเดอร์เสมือนของ Object Manager ซึ่งเป็นรูปแบบที่ผสมผสาน\\GLOBAL??และโฟลเดอร์DosDevicesของผู้ใช้แต่ละคน- วัตถุ
C:มีอยู่เป็น symbolic link ภายใน\\GLOBAL??และเชื่อมต่อไปยังเส้นทางอุปกรณ์จริง\\Device\\HarddiskVolume4 - ดังนั้น
C:จึงไม่ได้เป็นอักขระสำรองพิเศษ แต่เป็นการปฏิบัติเพียงเป็น ชื่อ symbolic link ทั่วไป
คำจำกัดความของอักษรไดรฟ์
- อักษรไดรฟ์เป็นผลลัพธ์ของกระบวนการแปลงเส้นทาง Win32 เป็นเส้นทาง NT
- ฟังก์ชันแปลง
RtlDosPathNameToNtPathName_Uจะเปลี่ยนC:\fooเป็น\\??\\C:\foo
- ฟังก์ชันแปลง
- ฟังก์ชันนี้จึงจัดการ
+:ซึ่งเป็นอักขระที่ไม่เป็นมาตรฐานเช่นเดียวกัน จึงเมื่อมีวัตถุ+:อยู่ เส้นทาง+:\\ก็ทำงานได้ตามปกติ - วัตถุ
+:ที่สร้างด้วยคำสั่งsubst +: C:\fooจะถูกบันทึกไว้ในโฟลเดอร์DosDevicesของแต่ละผู้ใช้
การทำงานของอักษรไดรฟ์ที่ไม่เป็นมาตรฐาน
- เนื่องจาก Explorer.exe สำรวจเฉพาะขอบเขต A~Z จึงไม่แสดงไดรฟ์
+: - PowerShell ก็ไม่สามารถรับรู้ไดรฟ์ที่ไม่ใช่ ASCII และจะคืนข้อผิดพลาด
- อย่างไรก็ตาม ใน cmd.exe ไดรฟ์อย่าง
+:หรือ€:จะทำงานได้ตามปกติ
อักขระไดรฟ์แบบไม่เป็น ASCII และยูนิโค้ด
- สามารถสร้างไดรฟ์ € ได้ด้วยคำสั่ง
subst €: C:\foo- ทำงานโดยไม่คำนึงถึงตัวพิมพ์ใหญ่-เล็ก (
Λ:และλ:ถูกรู้จักเหมือนกัน)
- ทำงานโดยไม่คำนึงถึงตัวพิมพ์ใหญ่-เล็ก (
- อักขระไดรฟ์ถูกจำกัดอยู่ที่ WTF-16 code unit เดี่ยว (ไม่เกิน U+FFFF)
- ตัวอักษรที่เกิน
U+FFFFเช่น𤭢:จะเกิดข้อผิดพลาดกับsubst - หากเรียก
MountPointManagerโดยตรงอาจสร้างได้ แต่การแปลงเส้นทาง Win32 จะล้มเหลวทำให้เข้าไม่ถึง
- ตัวอักษรที่เกิน
- เหตุการณ์นี้แสดงให้เห็นว่า Windows ยังไม่รองรับ surrogate pair ของ UTF-16 อย่างครบถ้วน
ปัญหาการตรวจจับเส้นทางและการเข้ารหัส
- การใช้งานการจัดการเส้นทางที่ต่างกันในแต่ละภาษาอาจแตกต่างจาก
RtlDosPathNameToNtPathName_U- ตัวอย่างเช่น Rust รับรู้เส้นทาง absolute เฉพาะ A-Z (
C:\คืนค่า true,+:\\คืนค่า false)
- ตัวอย่างเช่น Rust รับรู้เส้นทาง absolute เฉพาะ A-Z (
- เนื่องจากวิธีการเข้ารหัส (WTF-8 เทียบกับ WTF-16) ทำให้ดัชนี
path[0],path[1]ต่างกัน จึงอาจทำให้ผลการตรวจสอบเส้นทาง absolute ต่างกันได้ - มาตรฐานไลบรารีของ Zig ถูกออกแบบให้รองรับจนถึงช่วง
<= U+FFFFโดยคำนึงถึงความต่างนี้
ข้อบกพร่องในการประมวลผลอักขระไม่เป็น ASCII ของ SetVolumeMountPointW
- การเรียก
SetVolumeMountPointW("€:\\", volume)จะสำเร็จ แต่ลิงก์ที่ถูกสร้างจริงจะแสดงเป็น¬: - คาดว่าเป็นผลจากการตัดทิ้งเป็น
0xACเมื่อทำงานกับ0x20AC(สัญลักษณ์ €) - เป็นตัวอย่างที่แสดงข้อจำกัดของ API ที่ไม่สามารถจัดการอักขระไดรฟ์ที่ไม่ใช่ ASCII ได้
สรุป
- Windows โดยโครงสร้างภายใน ไม่จำกัดอักษรไดรฟ์เฉพาะ A~Z
- การจำกัดนี้เกิดจากความแตกต่างในการนำไปใช้งานของเครื่องมือระดับสูง เช่น Explorer, PowerShell
- หากเข้าใจโครงสร้างการแปลงระหว่าง Win32 และ NT namespace, การจัดการเข้ารหัส และพฤติกรรมของ Object Manager จะช่วยให้เข้าใจกลไกภายในของระบบไฟล์ Windows ได้ลึกขึ้น
1 ความคิดเห็น
ความเห็นจาก Hacker News
พาธของ NT คือวิธีที่ Object Manager ใช้อ้างอิงรีซอร์ส
ตัวอย่างเช่น
HKEY_LOCAL_MACHINEเป็น alias ของ\\Registry\\MachineNT คล้ายกับ Unix ตรงที่ใช้ VFS namespace แบบโกลบอล
พาธที่ขึ้นต้นด้วยอักษรไดรฟ์คือ “DOSPath” เพื่อความเข้ากันได้กับ DOS และแม้ใน kernel mode ก็ยังมีบาง subsystem ที่ใช้อยู่
ใน PowerShell สามารถเปิดเผยรีซอร์สหลายแบบเป็น “ไดรฟ์” ได้ และนอกจากไดรฟ์พื้นฐานอย่าง
hklm:\แล้วก็ยังสร้างไดรฟ์แบบกำหนดเองได้ด้วยเอกสารที่เกี่ยวข้อง: ตัวอย่างการจัดการ PowerShell Drive
บน Linux/Bash ไม่สามารถเข้าถึงใบรับรองผ่านพาธไฟล์ได้ แต่บน PowerShell/Windows ทำได้
แนะนำให้ติดตั้งโมดูล PowerShell NtObjectManager แล้วลองสำรวจด้วย
ls NtObject:\ลิงก์โมดูล
เอกสาร Connect-PnPOnline
/usr/share/ca-certificatesหรือ/etc/ssl/certsเพียงแต่ไม่ได้รวมศูนย์เท่ากับ Windows Registry
และใช้งานบน Windows ได้ด้วย
ตัวอย่าง ReactOS NT Object Browser
สามารถดูไฟล์ PEM ได้โดยตรงใต้
/etc/ca-certificates/extracted/cadirWindows สามารถเข้าถึงพาร์ทิชันได้โดยไม่ต้องมีอักษรไดรฟ์
สามารถเมานต์ไว้ใต้ไดเรกทอรีเหมือน Linux ได้ และตั้งค่าผ่านคำสั่ง
Add-PartitionAccessPathของ PowerShellโดยจะคงอยู่หลังรีบูตด้วย
ตัวติดตั้งปฏิเสธการ์ด SD แต่ถ้าใช้ NTFS mount point ก็หลอกมันได้
แต่ตัวติดตั้งบางตัวจะตรวจสอบพื้นที่ว่างของดิสก์แม่เลยทำให้สับสน
สำหรับการเมานต์ถาวร symbolic link มีประโยชน์กว่า
สามารถรวมดิสก์ VM ที่มีนโยบายประสิทธิภาพต่างกันไว้ใต้พาธเดียวได้
ตอนสร้างพาร์ทิชันใน GUI สามารถเลือก “เมานต์เป็นพาธ” แทน “กำหนดอักษรไดรฟ์” ได้
อักษรไดรฟ์แบบ “€:\” เป็นตัวอย่างที่ ทั้งต้องสาปและเจ๋ง
เคอร์เนล NT ยืดหยุ่นกว่าที่เปิดเผยให้ผู้ใช้เห็นมาก
แต่ข้างในซ่อนโครงสร้างซับซ้อนที่อิงกับการแมป GUID เอาไว้
เช่น ถ้าสร้าง shortcut ชื่อ
{GUID}ก็อาจเชื่อมไปยังฟังก์ชันที่ซ่อนอยู่โครงสร้างแบบนี้เองที่ทำให้ Windows กลายเป็น แหล่งเพาะมัลแวร์ ได้ด้วย
File Explorer ไม่รู้จักอักษรไดรฟ์นอกเหนือจาก A~Z
ดังนั้นความฝันที่จะเปลี่ยนอักษรไดรฟ์ทั้งหมดเป็น อีโมจิ จึงเป็นไปไม่ได้
แต่เปลี่ยนไอคอนไดรฟ์ด้วย
autorun.infจะดีกว่า และยังใส่อีโมจิใน label ได้ด้วยในยุค Win9x มีทริก
ALT + 255ที่ใช้สร้าง โฟลเดอร์ที่ Explorer เข้าไม่ได้ในสภาพแวดล้อมพัฒนา Xbox 360 อักษรไดรฟ์อยู่ในรูปแบบสตริง
ตัวอย่างเช่น
Game:\foo,Hdd0:\fooXenia emulator จัดการสิ่งนี้เป็น virtual file system ที่อิง symbolic link
ตัวอย่างโค้ด Xenia
บน Linux มีแนวคิดคล้ายกันคือ Abstract Domain Socket
เป็น Unix domain socket ที่ตัวอักษรตัวแรกเป็น NUL(
\0) ซึ่งสามารถหลบข้อจำกัดด้านสิทธิ์ได้กำลังใช้อยู่ในเกมเซิร์ฟเวอร์เพื่อแยกรีซอร์สของผู้เล่นแต่ละคนออกจากกัน แต่ยังคงสื่อสารกันได้
/proc/net/unixฟีเจอร์แบบนี้ฟังดูเหมือนเป็นสภาพแวดล้อมที่เหมาะกับการสร้าง มัลแวร์
น่าจะใช้ mount ที่ซ่อนอยู่หรือชื่อไดรฟ์แปลก ๆ เพื่อก่อกวนระบบได้
หากต้องเมานต์ดิสก์อิมเมจหลายไฟล์ อักษรไดรฟ์จะทำให้สับสนมาก
เช่น ถ้าเมานต์ DVD ISO 36 ไฟล์ คุณจะได้เจอกับ นรกแห่งเครื่องหมายอัญประกาศในบรรทัดคำสั่ง
ใน DOS รุ่นเก่า ๆ (น่าจะเวอร์ชัน 3.3) อักษรไดรฟ์ถัดจาก Z คือ AA
เคยลองสร้าง RAM drive เล็ก ๆ หลายตัวเพื่อยืนยันเรื่องนี้