# Lua
## lua HIT
* local 宣告上限 60個
* parser 是以樹狀結構產生
* 每個宣告點可以是 node也可是leaf
* 用陣列宣告時,在加入 protocol 定義時 ,只要加入最後的宣告點
## 語法範例
參見 api 文件 10.4.6.5. 10.4.6.6.
https://wiki.wireshark.org/LuaAPI/


宣告區塊
* GMac = Proto("GMac","G3 PLC MAC");
Desc : 宣告 protocol 格式
* GMac.fields =
Desc : 宣告這個 proto 會用到哪些前面定義的變數當作 node 使用
:::warning
這個宣告一定要寫,否則後面 parser無法使用前面定義好的變數
:::
Parser 格式
* function GMac.dissector(mac_frame,pktinfo,root) :
* Desc :
parser 進入點
* parameter :
mac_frame : input data 的範圍區塊
root : input data的 root點
pktinfo : packet 使用的 protocol 跟相關設定
* pktinfo.cols.protocol:set("GMac")
* Desc : setting protocol
* pktinfo.cols.info:set("")
* Desc : setting protocol
* pktlen = mac\_frame:reported\_length_remaining()
* Desc : 取得 packet長度
* mac_tree = root:add(GMac, mac_frame:range(0,pktlen))
* 在 root node 下,把之前定義的 GMac變數(定義範圍是在mac_frame的 0 ~ pktlen),加入 root node下,產生新的node : mac_tree,
* mhr\_famctrl\_secuenable = mac_frame:range(0,pktlen):bitfield(28,1)
* 將 mac_frame 定義的範圍, 取 base = 0 , offset = pktlen的範圍,在這範圍內的第 28個 bit 開始,取1個 bit長度的值
# Wireshark 設定
## Install package
$ sudo apt-get update
$ sudo apt-get install wireshark
$ sudo apt-get install tcpdump
## Lua 放置位置
參考 wireshark中 help -> about wireshark
紅色框框的路徑,將 lua檔案放入此處

## 將 新增的 protocol 加入 wireshark中
edit -> preferences
找到 protocols 展開

在面找到 dlt_user

按下 "+" 新增一個 protocol 目前使用的是 147 並在 payload/header protocol 中打入 gmac 設定成 G3 mac protocol

此時應該可以正常解譯 packet了
:::info
Q : 如果無法正常解譯,需要增加設定如下
:::
:::success

在 packet frame 按下右鍵,選擇protocol preferences 中的 disable frame

確認裡面新增的 protocol 有被選擇
:::
從 pipe file讀取資料
capture -> options

input 處,選擇 manage interfaces

新增一個 pipes 並且選定 pipe 檔案,如此就可以增加 pipe進入 wireshark
## start wireshark with pipe in interface list
$ sudo wireshark -ni \/home/roy/SrcCode/VangoChip/Sniffer/scapy-2.3.2/out.pipe
# 自動啟動
## install package
$ sudo apt-get install python
$ sudo apt-get install python-serial
## script
* 負責啟動 slip
* 呼叫 python sniffer
## python sniffer
* 負責把 sl0 的資料轉送到 pipe中
## 使用方式
$ sudo ./start.sh \[start/stop/restart\] \[tty device\]
## sniffer.py解說
在 start.sh 中 呼叫
sudo python sniffer.py sl0 out.pipe &
sl0 是 network interface
out.pipe 是 pipe file
開啟sl0 interface

建立 out.pipe file

開啟 out.pipe file

wireshark file header

開始接收封包

## HIT :
1. Sniffer 資料夾內檔案位置不能變動 script 是以這個資料夾為基礎,去執行其他相關連的程式,如果要變動,需要修改相對應程式碼
2. 檔案從 windows copy到 linux 時 pipe file會被視為一般檔案,進而導致 linux 在執行的時候會無法使用 pipe
1. 所以當 wireshark 在存取 pipe file時如果有出現權限錯誤,需要修改 Sniffer 資料夾內的所有檔案權限,並且刪除 out.pipe 讓系統重新產生
2. 原因是 pipe file 跟 data file的 device node點不同,會無法存取

如圖顯示, out.pipe檔案屬性是 p file,一般檔案顯示則無, 詳情請參照 linux command : mkfifo / mknode p 指令
# tcpdump(pcap) file Header
