update
This commit is contained in:
parent
0872e2a6a7
commit
1449cc961d
2
Makefile
2
Makefile
@ -7,7 +7,7 @@ LIBS=-L../libbpf/src -l:libbpf.a -lelf -lz
|
|||||||
all: dns-trace.ebpf.o dns-trace
|
all: dns-trace.ebpf.o dns-trace
|
||||||
|
|
||||||
dns-trace.ebpf.o: src/dns-trace.ebpf.c
|
dns-trace.ebpf.o: src/dns-trace.ebpf.c
|
||||||
$(CL) -g -O2 -target bpf -D __TARGET_ARCH_x86_64 -D __BPF_TRACING__ -L../libbpf/src -l:libbpf.a -c src/dns-trace.ebpf.c -o src/dns-trace.ebpf.o
|
$(CL) -Wall -g -O2 -target bpf -D __TARGET_ARCH_x86_64 -D __BPF_TRACING__ -L../libbpf/src -l:libbpf.a -c src/dns-trace.ebpf.c -o src/dns-trace.ebpf.o
|
||||||
|
|
||||||
dns-trace: src/dns-trace.c
|
dns-trace: src/dns-trace.c
|
||||||
$(GCC) $(CFLAGS) src/dns-trace.c -o dns-trace $(LIBS)
|
$(GCC) $(CFLAGS) src/dns-trace.c -o dns-trace $(LIBS)
|
||||||
|
BIN
dns-trace
BIN
dns-trace
Binary file not shown.
2
exec.sh
2
exec.sh
@ -3,4 +3,4 @@
|
|||||||
|
|
||||||
#sudo bpftool btf dump file /sys/kernel/btf/vmlinux format c > src/vmlinux.h
|
#sudo bpftool btf dump file /sys/kernel/btf/vmlinux format c > src/vmlinux.h
|
||||||
make clean
|
make clean
|
||||||
make all && sudo ./dns-trace -i wlp0s20f3
|
make all && sudo ./dns-trace -i enx98e743c667fc
|
||||||
|
@ -32,18 +32,18 @@ struct event {
|
|||||||
unsigned char buf[MAX_UDP_PAYLOAD]; // On stocke la data au format size + data
|
unsigned char buf[MAX_UDP_PAYLOAD]; // On stocke la data au format size + data
|
||||||
};
|
};
|
||||||
|
|
||||||
struct query_section{
|
/*struct query_section{
|
||||||
char qname[QNAME_SIZE];
|
char qname[QNAME_SIZE];
|
||||||
size_t qname_len;
|
size_t qname_len;
|
||||||
uint16_t class;
|
uint16_t class;
|
||||||
uint16_t type;
|
uint16_t type;
|
||||||
};
|
};*/
|
||||||
|
|
||||||
struct dns_answer {
|
/*struct dns_answer {
|
||||||
char data[512];
|
char data[512];
|
||||||
uint16_t class;
|
uint16_t class;
|
||||||
uint16_t type;
|
uint16_t type;
|
||||||
uint32_t ttl;
|
uint32_t ttl;
|
||||||
};
|
};*/
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -305,7 +305,6 @@ int handle_event(void *ctx, void *data, size_t data_sz){
|
|||||||
printf("%s\t", s_type);
|
printf("%s\t", s_type);
|
||||||
free(s_type);
|
free(s_type);
|
||||||
|
|
||||||
|
|
||||||
if (type == 1) { // -> A
|
if (type == 1) { // -> A
|
||||||
uint32_t ip = s_event->buf[pos] + (s_event->buf[pos+1] << 8) + (s_event->buf[pos+2] << 16) + (s_event->buf[pos+3] << 24);
|
uint32_t ip = s_event->buf[pos] + (s_event->buf[pos+1] << 8) + (s_event->buf[pos+2] << 16) + (s_event->buf[pos+3] << 24);
|
||||||
printf("%s %5d", inet_ntoa(*(struct in_addr*)&ip), ttl);
|
printf("%s %5d", inet_ntoa(*(struct in_addr*)&ip), ttl);
|
||||||
@ -321,7 +320,7 @@ int handle_event(void *ctx, void *data, size_t data_sz){
|
|||||||
if (i % 2 == 0)
|
if (i % 2 == 0)
|
||||||
printf("%x", s_event->buf[pos + p++]);
|
printf("%x", s_event->buf[pos + p++]);
|
||||||
else{
|
else{
|
||||||
if (i<size - 1)
|
if (i < (size - 1))
|
||||||
printf("%x:", s_event->buf[pos + p++]);
|
printf("%x:", s_event->buf[pos + p++]);
|
||||||
else
|
else
|
||||||
printf("%x", s_event->buf[pos + p++]);
|
printf("%x", s_event->buf[pos + p++]);
|
||||||
|
@ -47,7 +47,7 @@ static size_t get_labels(struct __sk_buff *skb, size_t offset, struct event *s_e
|
|||||||
while (c != '\0') {
|
while (c != '\0') {
|
||||||
bpf_skb_load_bytes(skb, offset + pos++, &c, 1);
|
bpf_skb_load_bytes(skb, offset + pos++, &c, 1);
|
||||||
|
|
||||||
if(c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')
|
if((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
|
||||||
s_event->qname[qname_len] = c;
|
s_event->qname[qname_len] = c;
|
||||||
else if(c >= '0' && c <= '9')
|
else if(c >= '0' && c <= '9')
|
||||||
s_event->qname[qname_len] = c;
|
s_event->qname[qname_len] = c;
|
||||||
@ -117,7 +117,7 @@ static unsigned int get_answer(struct __sk_buff *skb, struct event *s_event, siz
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
bpf_skb_load_bytes(skb, tlen, s_event->buf + offset, sizeof(uint16_t));
|
bpf_skb_load_bytes(skb, tlen, s_event->buf + offset, sizeof(uint16_t));
|
||||||
uint16_t type = s_event->buf[0] + (s_event->buf[1] << 8);
|
//uint16_t type = s_event->buf[0] + (s_event->buf[1] << 8);
|
||||||
tlen += 2;
|
tlen += 2;
|
||||||
if ((offset += 2) >= MAX_UDP_PAYLOAD - sizeof(uint16_t))
|
if ((offset += 2) >= MAX_UDP_PAYLOAD - sizeof(uint16_t))
|
||||||
return 0;
|
return 0;
|
||||||
@ -145,7 +145,6 @@ static unsigned int get_answer(struct __sk_buff *skb, struct event *s_event, siz
|
|||||||
return 0;
|
return 0;
|
||||||
tlen += 2;
|
tlen += 2;
|
||||||
|
|
||||||
uint32_t data;
|
|
||||||
if (s_event->type == 1) { // -> A
|
if (s_event->type == 1) { // -> A
|
||||||
bpf_skb_load_bytes(skb, tlen, s_event->buf + offset, sizeof(uint32_t));
|
bpf_skb_load_bytes(skb, tlen, s_event->buf + offset, sizeof(uint32_t));
|
||||||
}
|
}
|
||||||
@ -165,13 +164,13 @@ static unsigned int get_answer(struct __sk_buff *skb, struct event *s_event, siz
|
|||||||
static int dnsquery(struct __sk_buff *skb, struct ethhdr eth, struct iphdr ip, struct udphdr udp, int dport, int sport){
|
static int dnsquery(struct __sk_buff *skb, struct ethhdr eth, struct iphdr ip, struct udphdr udp, int dport, int sport){
|
||||||
struct event *s_event;
|
struct event *s_event;
|
||||||
struct dnshdr dns = {0};
|
struct dnshdr dns = {0};
|
||||||
struct query_section dquery = {0};
|
|
||||||
|
|
||||||
/* Get DNS header */
|
/* Get DNS header */
|
||||||
bpf_skb_load_bytes(skb, sizeof(struct ethhdr) + sizeof(struct iphdr) + sizeof(struct udphdr), &dns, sizeof(struct dnshdr));
|
bpf_skb_load_bytes(skb, sizeof(struct ethhdr) + sizeof(struct iphdr) + sizeof(struct udphdr), &dns, sizeof(struct dnshdr));
|
||||||
|
|
||||||
// Check OpCode
|
// Check OpCode
|
||||||
uint16_t qr = ntohs(dns.flags) & 0xF000; // Get the QR code: 0 -> query, 1 -> response
|
uint16_t qr = ntohs(dns.flags) & 0xF000; // Get the QR code: 0 -> query, 1 -> response
|
||||||
|
|
||||||
/* If it's not a query, we do not continue */
|
/* If it's not a query, we do not continue */
|
||||||
if(qr != 0x0)
|
if(qr != 0x0)
|
||||||
return 0;
|
return 0;
|
||||||
@ -192,7 +191,7 @@ static int dnsquery(struct __sk_buff *skb, struct ethhdr eth, struct iphdr ip, s
|
|||||||
|
|
||||||
/* Get the query section */
|
/* Get the query section */
|
||||||
uint8_t tlen = sizeof(struct ethhdr) + sizeof(struct iphdr) + sizeof(struct udphdr);
|
uint8_t tlen = sizeof(struct ethhdr) + sizeof(struct iphdr) + sizeof(struct udphdr);
|
||||||
size_t query_len = get_query_section(skb, s_event, tlen);
|
get_query_section(skb, s_event, tlen);
|
||||||
|
|
||||||
// https://docs.cilium.io/en/stable/reference-guides/bpf/progtypes/
|
// https://docs.cilium.io/en/stable/reference-guides/bpf/progtypes/
|
||||||
s_event->dport = dport;
|
s_event->dport = dport;
|
||||||
@ -204,7 +203,6 @@ static int dnsquery(struct __sk_buff *skb, struct ethhdr eth, struct iphdr ip, s
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void dnsanswer_old(struct __sk_buff *skb, struct iphdr ip, struct udphdr udp, int dport, int sport){
|
static void dnsanswer_old(struct __sk_buff *skb, struct iphdr ip, struct udphdr udp, int dport, int sport){
|
||||||
char buf[256] = {0}; // Max dns domain name length
|
|
||||||
//__u16 udplen = 0U;
|
//__u16 udplen = 0U;
|
||||||
|
|
||||||
// Check with ip.len
|
// Check with ip.len
|
||||||
@ -247,7 +245,6 @@ static void dnsanswer_old(struct __sk_buff *skb, struct iphdr ip, struct udphdr
|
|||||||
static void dnsanswer(struct __sk_buff *skb, struct iphdr ip, struct udphdr udp, int dport, int sport){
|
static void dnsanswer(struct __sk_buff *skb, struct iphdr ip, struct udphdr udp, int dport, int sport){
|
||||||
struct event *s_event;
|
struct event *s_event;
|
||||||
struct dnshdr dns;
|
struct dnshdr dns;
|
||||||
uint16_t tid = 0U;
|
|
||||||
uint32_t offset = sizeof(struct ethhdr) + sizeof(struct iphdr) + sizeof(struct udphdr);
|
uint32_t offset = sizeof(struct ethhdr) + sizeof(struct iphdr) + sizeof(struct udphdr);
|
||||||
size_t tlen = ntohs(udp.len);
|
size_t tlen = ntohs(udp.len);
|
||||||
int index = 0;
|
int index = 0;
|
||||||
@ -255,8 +252,6 @@ static void dnsanswer(struct __sk_buff *skb, struct iphdr ip, struct udphdr udp,
|
|||||||
if (tlen < 0 || tlen >= 256)
|
if (tlen < 0 || tlen >= 256)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
bpf_printk("udp len: %d", tlen);
|
|
||||||
|
|
||||||
// Load dns header
|
// Load dns header
|
||||||
if (bpf_skb_load_bytes(skb, offset, &dns, sizeof(struct dnshdr)) < 0)
|
if (bpf_skb_load_bytes(skb, offset, &dns, sizeof(struct dnshdr)) < 0)
|
||||||
return;
|
return;
|
||||||
@ -294,20 +289,14 @@ static void dnsanswer(struct __sk_buff *skb, struct iphdr ip, struct udphdr udp,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*if (ans > 0){
|
|
||||||
s_event->numAns = ans;
|
|
||||||
}*/
|
|
||||||
s_event->numAns = ans;
|
s_event->numAns = ans;
|
||||||
|
|
||||||
|
|
||||||
// Load query and answer
|
|
||||||
/*
|
/*
|
||||||
* Load query and answers
|
* Load query and answers
|
||||||
* It's a little dirty to do that, to load byte by byte,
|
* It's a little dirty to do that, to load byte by byte,
|
||||||
* otherwise, I have an issue with the eBPF verifier
|
* otherwise, I have an issue with the eBPF verifier
|
||||||
*/
|
*/
|
||||||
offset += sizeof(struct dnshdr) + query_len;
|
offset += sizeof(struct dnshdr) + query_len;
|
||||||
//offset += 2; // We bypass message compression
|
|
||||||
while (index < tlen){
|
while (index < tlen){
|
||||||
bpf_skb_load_bytes(skb, offset + index, s_event->buf + index, 1);
|
bpf_skb_load_bytes(skb, offset + index, s_event->buf + index, 1);
|
||||||
index++;
|
index++;
|
||||||
|
Binary file not shown.
Loading…
Reference in New Issue
Block a user