Monday, June 23, 2025

Python กับการใช้งาน WiFi

การใช้ Python เพื่อ "ติดต่อกับ driver ของ WiFi โดยตรง" ในความหมายของการควบคุมฮาร์ดแวร์ระดับต่ำ (เช่น การสั่งงานชิป WiFi โดยตรง, การจัดการบัฟเฟอร์ในหน่วยความจำของ Driver) ทำไม่ได้โดยตรง ครับ

สาเหตุหลัก ๆ ก็คือ:

  1. ระดับนามธรรมของ Python: Python เป็นภาษาที่ถูกออกแบบมาให้ทำงานใน User Space และมีระดับนามธรรมที่สูงมาก มันไม่ได้มีกลไกในตัวสำหรับการเข้าถึงหน่วยความจำในระดับ Physical Address หรือ Register ของอุปกรณ์ฮาร์ดแวร์โดยตรง ซึ่งเป็นสิ่งที่ Driver จำเป็นต้องทำ
  2. Kernel Space vs. User Space: Driver ทำงานใน Kernel Space ซึ่งเป็นส่วนที่ได้รับสิทธิ์พิเศษและสามารถเข้าถึงฮาร์ดแวร์ได้โดยตรง ในขณะที่ Python Applications ทำงานใน User Space ซึ่งถูกจำกัดการเข้าถึงทรัพยากรฮาร์ดแวร์เพื่อความปลอดภัยและเสถียรภาพของระบบ
  3. ความซับซ้อนของ Driver WiFi: อย่างที่กล่าวไปในคำตอบก่อนหน้า Driver WiFi นั้นซับซ้อนมาก ต้องจัดการกับโปรโตคอล 802.11 ที่ละเอียดอ่อน, การเข้ารหัส, การจัดการพลังงาน, การเชื่อมต่อ/ยกเลิกการเชื่อมต่อ, และการสื่อสารกับชิปเซ็ตฮาร์ดแวร์โดยตรง ซึ่งต้องใช้การควบคุมในระดับบิตและไบต์อย่างแม่นยำ ซึ่งเป็นสิ่งที่ C ทำได้ดีกว่ามาก

 แล้ว Python สามารถ "ทำอะไร" กับ WiFi ได้บ้าง?

Python สามารถ "ควบคุม" หรือ "จัดการ" WiFi ได้ในระดับที่สูงกว่าผ่านตัวกลางต่างๆ ดังนี้:

  • เรียกใช้ System Commands (ผ่าน os.system หรือ subprocess):

    • นี่เป็นวิธีที่ง่ายที่สุดและเป็นที่นิยมที่สุด Python สามารถเรียกใช้คำสั่งของระบบปฏิบัติการที่จัดการ WiFi ได้โดยตรง เช่น:
      • บน Windows: netsh wlan ... (เช่น netsh wlan show networks, netsh wlan connect ...)
      • บน Linux: iwconfig, iwlist, nmcli (NetworkManager CLI), wpa_cli (สำหรับ wpa_supplicant)
      • บน macOS: networksetup
    • Python จะส่งคำสั่งไปให้ Shell ประมวลผล และรับผลลัพธ์กลับมา เพื่อแสดงข้อมูลหรือสั่งการ WiFi ในระดับที่ Driver มี API ให้แล้ว
  • ใช้ไลบรารีที่ Wrapper APIs ของระบบปฏิบัติการ:

    • มีไลบรารี Python บางตัวที่ทำหน้าที่เป็น Wrapper สำหรับ API ของระบบปฏิบัติการที่เกี่ยวข้องกับ WiFi
    • ตัวอย่างเช่น:
      • pywifi: (สำหรับ Windows, Linux, macOS) เป็นไลบรารีที่ให้ Python ควบคุมการเชื่อมต่อ WiFi, สแกนเครือข่าย, ดูสถานะ ฯลฯ โดยไลบรารีนี้จะไปเรียกใช้ API ของระบบปฏิบัติการอีกที
      • python-wifi (สำหรับ Linux): ใช้ Linux Wireless Extensions (เก่าหน่อย)
      • winwifi (สำหรับ Windows): ใช้ Windows WiFi APIs
    • ไลบรารีเหล่านี้ไม่ได้สื่อสารกับ Driver โดยตรง แต่ไปคุยกับ Service หรือ API ของระบบปฏิบัติการที่ทำหน้าที่สื่อสารกับ Driver อีกทอดหนึ่ง
  • ส่ง/รับ Packet ด้วย Scapy:

    • Scapy เป็นไลบรารี Python ที่ทรงพลังสำหรับการสร้าง, ส่ง, ดักจับ, และวิเคราะห์ Packet เครือข่าย (รวมถึง Packet WiFi)
    • คุณสามารถใช้ Scapy ใน "Monitor Mode" (ถ้า Adapter รองรับและ Driver อนุญาต) เพื่อดักจับ Packet WiFi ที่ลอยอยู่ในอากาศ หรือสร้าง Packet WiFi ของตัวเอง (เช่น Deauthentication frames สำหรับการโจมตี Denial of Service)
    • อย่างไรก็ตาม Scapy ก็ไม่ได้ Bypass Driver ไปคุยกับฮาร์ดแวร์โดยตรง มันยังคงต้องอาศัย Driver ของ WiFi Adapter ให้เข้าสู่ Monitor Mode และให้เข้าถึง Raw Packet ได้

สรุป:

Python ไม่สามารถ เขียนเพื่อติดต่อกับ Driver WiFi โดยตรงในระดับ Kernel Space หรือเข้าถึงฮาร์ดแวร์ WiFi ชิปเซ็ตโดยตรงได้ครับ มันทำได้แค่ "สั่งการ" หรือ "อ่านข้อมูล" จาก Driver ผ่าน API ของระบบปฏิบัติการ หรือผ่านการเรียกใช้คำสั่ง Shell เท่านั้น การพัฒนา Driver เองยังคงเป็นขอบเขตของภาษา Low-level อย่าง C ครับ

No comments: