1
我正在C中使用TCP Dump數據包捕獲方法,我正在查看TCP標誌部分,我需要一種方法來檢查SYN標誌是否設置在包。TCP標誌過濾器的十六進制,按位或反轉
當我運行程序時,我可以訪問下面的結構中的th_flags
變量,並且我得到一個類似於6144或4096的值作爲回報。我如何根據輸出的數字來確定哪些標誌被設置?
struct sniff_tcp {
u_short th_sport; /* source port */
u_short th_dport; /* destination port */
tcp_seq th_seq; /* sequence number */
tcp_seq th_ack; /* acknowledgement number */
u_char th_offx2; /* data offset, rsvd */
#define TH_OFF(th) (((th)->th_offx2 & 0xf0) >> 4)
u_char th_flags;
#define TH_FIN 0x01
#define TH_SYN 0x02
#define TH_RST 0x04
#define TH_PUSH 0x08
#define TH_ACK 0x10
#define TH_URG 0x20
#define TH_ECE 0x40
#define TH_CWR 0x80
#define TH_FLAGS (TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG|TH_ECE|TH_CWR)
u_short th_win; /* window */
u_short th_sum; /* checksum */
u_short th_urp; /* urgent pointer */
};
我需要能夠來測試使用格式if (SYN is set) {...}
各種標誌。
如果我要訪問的目的端口可變我這樣做:
printf(" Dst port: %d\n", ntohs(tcp->th_dport));
由於內部的`struct`定義....奇
嵌套'#define's。 ..混亂......難以閱讀......無論如何,你是否嘗試過'if(some_packet.th_flags&TH_SYN)...'?這似乎是一個開始的好地方... – twalberg
@twalberg printf(「Dst port:%d \ n」,ntohs(tcp-> th_dport));是我如何訪問其他變量,我將如何做到這一點的國旗? (我沒有編寫代碼+更多的是java人員:p) – Crizly
1)對於單字節變量(如th_flags),您不需要'ntohs()',儘管它並不會真的傷害任何東西,要麼; 2)'(tcp - > th_port)&TH_SYN' ... – twalberg