เผยความลับ ESP8266 SmartConfig ระดับ Network Layer ทำงานยังไง

หลายคนคงคุ้นเคยกันอย่างดีกับ feature SmartConfig ใน ESP8266 ที่เราสามารถตั้งค่าให้มันไปต่อกับ Wifi ตัวไหนก็ได้โดยไม่ต้องเขียนโค้ดเข้าไปใหม่ เพียงแค่เปิดโทรศัพท์มือถือขึ้นมา แล้วตั้งค่าผ่านโทรศัพท์มือถือได้เลย ไม่ต้องจัดการยุ่งยาก โดยโค้ดส่วนโทรศัพท์ก็มากมายอยู่บน Github ซึ่งเข้าไปดูโค้ดก็เป็นการส่งข้อมูลแบบ UDP ไม่ได้ยุ่งยากอะไร

แต่ด้วยความง่ายดายอันนี้ก็อาจจะทำให้หลายท่านสงสัยกัน(รวมถึงผมด้วย) ว่า เฮ้ย! แล้วมันทำงานได้ยังไงหล่ะ ข้อมูลจากโทรศัพท์มือถือจะส่งไปหาไอ้เจ้า ESP8266 ได้ยังไง ทั้งที่มันยังไม่ได้ต่อ wifi เลยสักอัน แล้วถ้ายิ่งเป็น wifi ที่เข้ารหัสเอาไว้ ยิ่งไปกันใหญ่ เพราะตอนนี้มันไม่รู้รหัสเลย มันจะรับเอาข้อมูลมาได้ยังไง … ก็นั่นหน่ะสิ ด้วยคำถามนี้จึงทำให้ผมก็กระวนกระวายใจอยากรู้คำตอบ ทำไม ทำไม ก็เลยไป research มาทำเป็นบทความวันนี้ซะเลย

โดยพื้นฐานของ wifi แล้วการส่งข้อมูลนั้นจะมี packet วิ่งอยู่มากมายเต็มไปหมด โดยปกติ access point แต่ละตัวจะมีการส่ง beacon packet อยู่เรื่อยๆตามตัวอย่าง พอเราแกะออกดูจะเห็นว่ามีรายละเอียดของการส่งข้อมูลแบบ IEEE 802.11 อยู่

blog-streetviewifi-beacon

ขอบคุณภาพจาก : http://blog.erratasec.com/2010/05/technical-details-of-street-view-wifi.html

จากรูปนี่เองเราจะเห็นว่าเราสามารถดึงเอา SSID ออกมาแสดงผลได้ เช่นเดียวกันกับ ESP8266 มันสามารถดึงเอา SSID ออกมาได้เช่นกัน … แต่ปัญหาต่อมาคือ ถ้าเรารู้แล้วว่ามี SSID มีกี่ตัว แล้วจะเลือกเชื่อมต่อกับอันไหนกันหล่ะ? การจะตอบคำถามนี้ได้เราต้องมาดูกันก่อนว่า packet ที่มันส่งไปมาในอากาศนี่เป็นยังไง

IC196394

packet ที่ถูกเข้ารหัส (ภาพจาก : https://technet.microsoft.com/en-us/library/cc757419%28v=ws.10%29.aspx)

จากรูปจะเห็นได้ว่าในส่วนของ packet frame หรือในทางเน็ตเวิร์คเรียกว่า 802.11 frame จะประกอบด้วย header แล้วก็ trailer หรือหัวท้ายของมันนั่นเอง และข้างในจะประกอบด้วย payload เช่น IV (initial vector) และก็ข้อมูลที่ถูกเข้ารหัสเรียบร้อยแล้ว ซึ่งข้อมูลพวกนี้ดักจับได้ทั่วไปและมีเพียงแค่ข้อมูลข้างในเท่านั้นที่ถูกเข้ารหัสไว้ ดังนั้นจะเห็นว่าถ้าเราให้ esp8266 เปิดโหมด Sniff เอาไว้ (มันมีด้วยหรอ ก็ Smart Config ไง) จากนั้นเราก็ใช้ เครื่องสักเครื่องส่ง UDP แบบไม่มีคนรับไป packet นั้นก็จะถูก ESP8266 ดักไว้ได้ …ถ้าเราส่ง pattern ซ้ำๆไป เช่นใส่ QoS หรือ ส่งให้เป็นลำดับ หรือขนาดข้อมูลที่เป็นลำดับไป ตัว ESP8266 ก็จะรู้โดยทันทีว่า เฮ้ยยยย SSID นี้มีคนกำลังส่ง SmartConfig มาล่ะ จากนั้นเราก็คอยเฝ้าดูจาก SSID นี้ล่ะกัน

ปัญหาต่อมาคือตอนนี้เรายังส่งข้อมูลไม่ได้เลย เราเพียงแค่ให้มันรู้ SSID หรือ ให้มันดักเอาเฉพาะ packet ที่ต้องการเฉยๆ แต่หากเรามองดีๆเราก็สามารถให้ packet ที่โดนเข้ารหัสแล้วสามารถส่งข้อมูลได้เหมือนกันนะ ถึงแม้เราจะถอดรหัสมันไม่ได้ก็ตามเถอะ ลองกลับไปมองภาพด้านบนอีกสักรอบ มีอะไรที่เราจะใช้ประโยชน์ได้ … … … … … ใช้แล้ว data length ยังไงหล่ะ เนื่องจากการเข้ารหัสนั้นส่งผลต่อขนาดของ packets แต่ไม่ใช่ลักษณะที่สอดคล้องกัน เช่น ถ้าเราส่งข้อมูลขนาด n byte หลังจากเข้ารหัสแล้วเราจะพบว่ามันมีขนาด (n + x) bytes โดย x เป็นค่าคงที่ ที่พบได้ทุก packet ที่เราส่งไป ภาระกิจของเราก็แค่เข้ารหัสข้อมูลให้กลายเป็น packet length แล้วเอาไปสร้างและส่งข้อมูล SSID กับ password นี่ไปให้ ESP ไป decode เท่านั้นเอง (เข้าใจไหมครับ ประมาณว่า จะส่งเลข 6 ไป ก็สร้างข้อมูลให้มันยาว 6 อะไรประมาณนี้ … คนรับก็จะไปนับความยาว เอาแค่เลข 6 ไปใช้ เพราะข้อมูลข้างในมันเข้ารหัสไว้เราดูไม่ได้ …อ๋อสิครับ 55++)

ส่วนวิธีการเข้ารหัสตัวอักษรก็ จะแยกทีล่ะ nibble แล้วมีเลขกำกับ tag หรืออื่นๆแล้วแต่ละเจ้าจะ design กันเอาเองเพราะผมคงไม่ได้เอารายละเอียดส่วนนี้มาพูด เดี๋ยวจะงงกันไปใหญ่ ถ้าใครจะพัฒนาให้มันส่งข้อมูลแบบอื่นด้วยก็ค่อยว่ารายละเอียดล่ะกันครับ 55++

การเข้ารหัส smart config cc3000

การเข้ารหัส smart config cc3000

ตัวอย่างการเข้ารหัส SSID

ตัวอย่างการเข้ารหัส SSID

 

ก็วันนี้น่าจะพอคร่าวๆกันก่อน เดี๋ยววันหลังเจอเรื่องดีๆจะเอามาเล่าให้ฟังอีก ผิดพลาดประการใดก็ขออภัยมา ณ ที่นี้ด้วยนะครับ

ตต.

อ้างอิง : http://depletionregion.blogspot.com/2013/10/cc3000-smart-config-transmitting-ssid.html

Comdet