0
我創建TCP套接字:連接過濾器,TCP套接字在Linux
sockfd = socket(AF_INET, SOCK_STREAM, 0);
和過濾器附加到它
setsockopt(sockfd, SOL_SOCKET, SO_ATTACH_FILTER, &Filter, sizeof(Filter))
我產生了過濾器使用tcpdump的,如下:
sudo tcpdump tcp -d port 9000
(000) ldh [12]
(001) jeq #0x86dd jt 2 jf 8
(002) ldb [20]
(003) jeq #0x6 jt 4 jf 19
(004) ldh [54]
(005) jeq #0x2328 jt 18 jf 6
(006) ldh [56]
(007) jeq #0x2328 jt 18 jf 19
(008) jeq #0x800 jt 9 jf 19
(009) ldb [23]
(010) jeq #0x6 jt 11 jf 19
(011) ldh [20]
(012) jset #0x1fff jt 19 jf 13
(013) ldxb 4*([14]&0xf)
(014) ldh [x + 14]
(015) jeq #0x2328 jt 18 jf 16
(016) ldh [x + 16]
(017) jeq #0x2328 jt 18 jf 19
(018) ret #65535
(019) ret #0
如果我附上了這個過濾器,程序不能向端口9000發送任何東西。 但是如果我只留下一個instr使用:
(018) ret #65535
一切都OK。 如何生成正確的過濾器代碼?
作爲一個事後考慮,我想知道你是否可以通過'SOCK_STREAM'套接字訪問IP標頭?我的程序可能只在原始套接字上有效(我引用的問題使用套接字(PF_INET,SOCK_RAW,IPPROTO_TCP);'如果是這樣,只保留最後六條指令並嘗試加載字段而不使用'X'寄存器。 – Qeole
謝謝,我測試它的工作原理。我將嘗試訪問IP頭與SOCK_STREAM使用Linux bpf擴展。 – flypig