2019-12-11 필기libpcap/bpf 패키지 필터
#include
#include
#include
#include
#include
#include
void dump_line(const struct sock_filter *line)
{
printf("{ 0x%02x, %d, %d, 0x%08x}
", line->code, line->jt, line->jf, line->k);
}
#if !defined(ETH_ALEN)
#define ETH_ALEN 6
#endif
int filter_out_by_source_mac_addr(int sockfd, uint8_t h_source_mac_addr[ETH_ALEN])
{
uint16_t mac_first_2_bytes = 0;
uint32_t mac_last_4_bytes = 0;
memcpy(&mac_first_2_bytes, h_source_mac_addr, sizeof(uint16_t));
memcpy(&mac_last_4_bytes, h_source_mac_addr+2, sizeof(uint32_t));
struct sock_fprog bpf_prog;
struct sock_filter filter[6] ={
BPF_STMT(BPF_LD|BPF_W|BPF_ABS, __builtin_offsetof(struct ethhdr, h_source)+2),
BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, htonl(mac_last_4_bytes), 0, 3),
BPF_STMT(BPF_LD|BPF_H|BPF_ABS, __builtin_offsetof(struct ethhdr, h_source)),
BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, htons(mac_first_2_bytes), 0, 1),
BPF_STMT(BPF_RET, 0),
BPF_STMT(BPF_RET, UINT16_MAX),
};
bpf_prog.filter = filter;
bpf_prog.len = sizeof(filter) / sizeof(filter[0]);
int err = 0;
err = setsockopt(sockfd, SOL_SOCKET, SO_ATTACH_FILTER, &bpf_prog, sizeof(struct sock_fprog));
if (err) {
return -1;
}
return 0;
}
int main()
{
uint8_t mac[6] = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF};
uint16_t mac_first_2_bytes = 0;
uint32_t mac_last_4_bytes = 0;
memcpy(&mac_first_2_bytes, mac, sizeof(uint16_t));
memcpy(&mac_last_4_bytes, mac+2, sizeof(uint32_t));
// MAC , MAC =aa:bb:cc:dd:ee:ff
// sudo tcpdump -s 65535 "not ether src host aa:bb:cc:dd:ee:ff" -dd
// { 0x20, 0, 0, 0x00000008 },
// { 0x15, 0, 3, 0xccddeeff },
// { 0x28, 0, 0, 0x00000006 },
// { 0x15, 0, 1, 0x0000aabb },
// { 0x06, 0, 0, 0x00000000 },
// { 0x06, 0, 0, 0x0000ffff },
struct sock_filter filter_program[100] ={
BPF_STMT(BPF_LD|BPF_W|BPF_ABS, __builtin_offsetof(struct ethhdr, h_source)+2),
BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, htonl(mac_last_4_bytes), 0, 3),
BPF_STMT(BPF_LD|BPF_H|BPF_ABS, __builtin_offsetof(struct ethhdr, h_source)),
BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, htons(mac_first_2_bytes), 0, 1),
BPF_STMT(BPF_RET, 0),
BPF_STMT(BPF_RET, UINT16_MAX),
};
// sudo tcpdump -s 65535 "not ether src host aa:bb:cc:dd:ee:ff" -d
// (000) ld [8]
// (001) jeq #0xccddeeff jt 2 jf 5
// (002) ldh [6]
// (003) jeq #0xaabb jt 4 jf 5
// (004) ret #0
// (005) ret #65535
for (int i=0; i<6; i++) {
struct sock_filter *line;
line = &filter_program[i];
dump_line(line);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.