2016-02-05 127 views
3

我寫一個lua解剖器時出現字符串問題。我的包的樣子:wireshark lua字符串:字節()錯誤

0000 00 00 00 69 00 10 00 01 00 00 00 ed 00 00 00 0c 
0010 bf a6 5f ... 

調試時,TVB着眼於偏移爲0x10爲0xBF,但在我的解剖功能我得到不同的結果相同

enter image description here

字節,這裏'我的代碼:

local str = buf(0x10):string() 
local x = string.byte(str, 1) 

the vari能夠X應該爲0xBF,但它是0xef,和其他一些偏差也0xef:

local str = buf(0x11):string() 
local x = string.byte(str, 1) -- also get 0xef, should be 0xa6 

local str = buf(11):string() 
local x = string.byte(str, 1) -- also get 0xef, should be 0xed 

似乎大值總是會得到0xef的結果,像0xa6 /爲0xBF/0xed ...

而小值將是正確的,就像×69/0x5F的/ 0x0c ...

我使用的是最新的Wireshark 2.0,這是一個錯誤?

+1

什麼是':string()'? – hjpotter92

+0

對不起,我沒有解釋清楚,發佈更新。並且:string()是Wireshark內置函數,它將tvb轉換爲字符串 – aj3423

+0

嘗試檢查值:buf(0x10),buf(0x10):string()'。 – hjpotter92

回答

4

我對Wireshark的瞭解並不多,但我有一個很好的想法。

您正在使用Wireshark的tvbrange:string([encoding])函數。我在Wireshark網站上找到的文檔說默認編碼是ENC_ASCII。 0x80-0xFF範圍內的字節(您報告過問題)不是有效的ASCII碼。

Wireshark可能做的是將這些轉換爲U + FFFD,即Unicode的「替換字符」。這是在Unicode字符串中表示未知字符的標準做法。

然後,當返回到Lua時,Wireshark可能會將此字符串編碼爲UTF-8。 U + FFFD的UTF-8編碼的第一個字節是0xEF,所以這就是你所看到的。

如果你想從TVB獲取原始字節值,可以試試tvbrange:bytes([encoding])函數來獲取值。例如

local bytes = buf(0x10):bytes() 
local x = bytes:get_index(0) -- maybe 1, I'm not sure if it would be 0 or 1 indexed 

也可能有一些編碼,你可以傳遞給tvbrange:string你想要什麼,會做,但我找不到這方面的任何很好的參考。

+0

就是這樣,使用':bytes()'解決問題。 – aj3423

3

假設buf指的是傳遞給解剖例程的參數,它的類型爲Tvb。當你給它打電話時(如buf(0x10)),你創建一個TvbRange實例。他們兩人都記錄在這裏: https://www.wireshark.org/docs/wsdg_html_chunked/lua_module_Tvb.html

tehtmi是當場就爲什麼你得到錯誤結果的原因,tvbrange:string()返回使用ASCII編碼(因爲省略了編碼參數)的字符串。

以獲得原始字節緩衝器(而不是將其轉換爲ASCII或UTF-8字符串)的一種方式是:

local x = buf:raw(0x10, 1) 

(使用偏移16和長度爲1)

如果考慮直接使用buf(0x10):raw(),請注意,由於某些原因,這將返回支持此Tvb的完整數據源。可能是一個錯誤或功能...解決方法:

local bytes = buf(0x10) 
local x = bytes:raw(bytes:offset(), bytes:len()) 
+0

謝謝,'raw'函數應該讓事情變得更容易!我正在查看wiki上的文檔,https://wiki.wireshark.org/LuaAPI/Tvb,它似乎沒有提到'raw'。 – legoscia

+1

@legoscia Wireshark的Lua API參考手冊始終比wiki更精確,因爲它直接從Wireshark C代碼的文檔生成。另請參閱https://wiki.wireshark.org/LuaAPI頂部的註釋 – Lekensteyn