2015-07-03 128 views
2

最近我一直試圖從捕獲的DHCP數據包中保存主機名列表。我發現,每個DHCP主機名(選項12)應具有在RFC 1035中定義的表格。因此,如果我理解正確,主機名應以7位ASCII編碼,並具有其他限制,如: - 名稱不應以數字開頭,並應省略一些禁止的字符。Windows DHCP客戶端主機名編碼

幾乎我在數據包中遇到的每個設備都符合此限制,但不包括Windows設備(供應商標識MSFT 5.0)。恕我直言Windows DHCP客戶端需要計算機(移動)名稱並將其填入主機名選項。

問題發生時,計算機名稱設置爲例如「Lukáš-PC」。 Wireshark將此主機名顯示爲Luk \ 240 \ 347-PC。 (240和347是八進制數字)。爲了查看我自己,我用printf(「%hhu」,c)(C語言)打印了數據包中的值。

á = 160 
š = 231 

恕我直言,我認爲這是簡單的字符變量溢出。我嘗試從溢出值中推導出原始值,但我沒有在字符和已知編碼之間找到任何關係。所以我的問題是:

有什麼辦法將這些值轉換回原來的? 如果是,發生溢出時,原始字符編碼是什麼?

謝謝。

回答

1

默認char通常是有符號的,當傳遞給可變參數函數時延伸到int。要確保它未經簽名打印,請使用printf("%hhu", c)printf("%d", (unsigned char)c);

正確的編碼是不可能知道的,因爲它取決於每個系統的設置。

請注意,任何兼容系統必須編碼名稱根據RFC 3490,但Windows似乎喜歡違反標準。

+0

謝謝您的回覆,我再次打印了字符,其值爲: = 160 š= 231 我希望我能理解您寫的內容。所以沒有辦法找出專門針對Windows操作系統的原始值?我的想法是隻檢查數據包中的VENDOR_ID == MSFT 5.0,並且在Windows設備使用相同的編碼時以某種方式將其轉換回來,但我需要知道Windows使用哪種編碼。 – Sach

0

您正在使用的字符á和š使用code page 852 (Latin-2 - Central European languages)進行編碼。

不幸的是,如何僅通過查看DHCP請求來確定所使用的編碼方式並不簡單。原則上DHCP客戶端可以使用任何想要的代碼頁。如果您正在私人/受控網絡中工作,那麼假設所有客戶端都使用相同的代碼頁並使用該特定代碼頁顯式編碼字符串可能是安全的。