From ec77d2e119ab84846ac551ac59874f88df0da466 Mon Sep 17 00:00:00 2001 From: starnakin Date: Thu, 12 Jun 2025 07:00:40 -0500 Subject: [PATCH] add --- src/checksum.c | 19 ++++++++++++++++ src/checksum.h | 5 +++++ src/config.c | 1 + src/config.h | 1 + src/data.c | 22 ++++++++++++++++++ src/data.h | 5 +++++ src/dns.c | 41 ++++++++++++++++++++++++++++++++++ src/dns.h | 5 +++++ src/main.c | 60 ++++++++++++++++++++++---------------------------- src/packet.c | 47 +++++++++++++++++++++++++++++++++++++++ src/packet.h | 7 ++++++ 11 files changed, 179 insertions(+), 34 deletions(-) create mode 100644 src/checksum.c create mode 100644 src/checksum.h create mode 100644 src/data.c create mode 100644 src/data.h create mode 100644 src/dns.c create mode 100644 src/dns.h create mode 100644 src/packet.c create mode 100644 src/packet.h diff --git a/src/checksum.c b/src/checksum.c new file mode 100644 index 0000000..a2fc407 --- /dev/null +++ b/src/checksum.c @@ -0,0 +1,19 @@ +#include + +uint16_t checksum(const uint16_t *data, int len) +{ + uint32_t sum = 0; + int i = 0; + + while (len > 1) + { + sum += data[i++]; + len -= 2; + } + if (len == 1) + sum += ((uint8_t *)data)[i]; + + while (sum >> 16) + sum = (sum & 0xFFFF) + (sum >> 16); + return (~sum); +} \ No newline at end of file diff --git a/src/checksum.h b/src/checksum.h new file mode 100644 index 0000000..d1caf3d --- /dev/null +++ b/src/checksum.h @@ -0,0 +1,5 @@ +#pragma once + +#include + +uint16_t checksum(const uint16_t *data, int len); \ No newline at end of file diff --git a/src/config.c b/src/config.c index 4127d84..605faef 100644 --- a/src/config.c +++ b/src/config.c @@ -4,6 +4,7 @@ void set_default_config(struct config *conf) { + conf->data_size = 56; conf->count = 5; conf->flood = false; conf->interval = 1; diff --git a/src/config.h b/src/config.h index 14993ea..6273ea3 100644 --- a/src/config.h +++ b/src/config.h @@ -11,6 +11,7 @@ struct config { uint64_t count; uint64_t interval; uint64_t time_to_live; + uint64_t data_size; bool verbose; }; diff --git a/src/data.c b/src/data.c new file mode 100644 index 0000000..12b871d --- /dev/null +++ b/src/data.c @@ -0,0 +1,22 @@ +#include +#include +#include +#include + +int get_data(char *payload, uint64_t payload_size) +{ + int fd; + int red; + + fd = open("/dev/random", O_RDONLY); + if (fd == -1) + return 1; + + red = read(fd, payload, payload_size); + if (red >= 0 && (uint64_t) red == payload_size) + { + close(fd); + return 1; + } + return 0; +} \ No newline at end of file diff --git a/src/data.h b/src/data.h new file mode 100644 index 0000000..4c0af76 --- /dev/null +++ b/src/data.h @@ -0,0 +1,5 @@ +#pragma once + +#include + +int get_data(char *payload, uint64_t payload_size); \ No newline at end of file diff --git a/src/dns.c b/src/dns.c new file mode 100644 index 0000000..161f125 --- /dev/null +++ b/src/dns.c @@ -0,0 +1,41 @@ +#include +#include +#include +#include +#include +#include +#include + +int dns_lookup(char *ip_addr, const char *hostname, + struct sockaddr_in *addr_con) +{ + struct hostent *host = gethostbyname2(hostname, AF_INET); + if (!host) { + dprintf(2, + "Hostname '%s' doesn't exist or has invalid format.\n", + hostname); + return -1; + } + strcpy(ip_addr, inet_ntoa(*(struct in_addr *)host->h_addr)); + (*addr_con).sin_family = host->h_addrtype; + (*addr_con).sin_port = htons(0); + (*addr_con).sin_addr.s_addr = *(long *)host->h_addr; + + return 0; +} + +int reverse_dns_lookup(char *ip_addr, char *host) +{ + struct sockaddr_in tmp_addr; + + tmp_addr.sin_family = AF_INET; + tmp_addr.sin_addr.s_addr = inet_addr(ip_addr); + if (getnameinfo((struct sockaddr *)&tmp_addr, + sizeof(struct sockaddr_in), host, NI_MAXHOST, NULL, 0, + NI_NAMEREQD)) { + dprintf(2, "Could not resolve reverse lookup of %s\n", ip_addr); + return -1; + } + + return 0; +} \ No newline at end of file diff --git a/src/dns.h b/src/dns.h new file mode 100644 index 0000000..e9fd413 --- /dev/null +++ b/src/dns.h @@ -0,0 +1,5 @@ +#pragma once + +#include + +int dns_lookup(const char *host, struct sockaddr_in *addr); \ No newline at end of file diff --git a/src/main.c b/src/main.c index 2d3e6b7..511bad3 100644 --- a/src/main.c +++ b/src/main.c @@ -1,16 +1,20 @@ #include "config.h" +#include "dns.h" #include "parsing.h" #include +#include #include #include #include #include #include #include +#include #include #include #include + bool loop = true; static void signal_handler(int code) @@ -51,38 +55,17 @@ int init_socket(const struct config *conf) return sock_fd; } -uint16_t checksum(const uint16_t *data, int len) + + +int send_packet(int sock_fd, struct in_addr *dest, void *packet, uint64_t packet_size) { - uint32_t sum = 0; - int i = 0; - - while (len > 1) - { - sum += data[i++]; - len -= 2; - } - if (len == 1) - sum += ((uint8_t *)data)[i]; - - while (sum >> 16) - sum = (sum & 0xFFFF) + (sum >> 16); - return (~sum); -} - -int send_packet(int sock_fd, const char* host, uint64_t seq, const struct config *conf) -{ - (void) conf; struct sockaddr_in addr; - inet_aton(host, &addr.sin_addr); - - struct icmphdr icmp_hdr; - memset(&icmp_hdr, 0, sizeof(icmp_hdr)); - icmp_hdr.type = ICMP_ECHO; - icmp_hdr.un.echo.id = getpid(); - icmp_hdr.un.echo.sequence = seq; - icmp_hdr.checksum = checksum((uint16_t*)&icmp_hdr, sizeof(icmp_hdr)); - if (sendto(sock_fd, &icmp_hdr, sizeof(icmp_hdr), 0, (struct sockaddr*)&addr, sizeof(addr)) == -1) + memset(&addr, 0, sizeof(struct sockaddr_in)); + addr.sin_family = AF_INET; + addr.sin_addr = *dest; + + if (sendto(sock_fd, packet, packet_size, 0, (struct sockaddr*)&addr, sizeof(addr)) == -1) { dprintf(2, "ft_printf: failed to send packet\n"); return 1; @@ -109,34 +92,43 @@ int recv_packet(int sock_fd, const char *host, uint64_t seq, const struct config int main(int ac, char **av) { + struct config conf; + struct sockaddr_in addr; + (void)ac; signal(SIGINT, signal_handler); - struct config conf; set_default_config(&conf); const char *host = parsing((const char * const *) av, &conf); if (host == NULL) return 1; + if (dns_lookup(host, &addr)) + return 1; + const int sock_fd = init_socket(&conf); if (sock_fd == -1) return 2; + + char ipstr[INET6_ADDRSTRLEN]; + inet_ntop(AF_INET, &addr, ipstr, sizeof ipstr); + printf("IP: %s\n", ipstr); + + return 1; - static uint64_t seq = 1; while (loop) { - if (send_packet(sock_fd, host, seq, &conf)) + if (send_packet(sock_fd, NULL, NULL, 0)) { close(sock_fd); return 1; }; - if (recv_packet(sock_fd, host, seq, &conf)) + if (recv_packet(sock_fd, host, 0, &conf)) { close(sock_fd); return 1; } - seq++; sleep(conf.interval); } diff --git a/src/packet.c b/src/packet.c new file mode 100644 index 0000000..c51842d --- /dev/null +++ b/src/packet.c @@ -0,0 +1,47 @@ +#include "packet.h" +#include "checksum.h" +#include "config.h" +#include "data.h" +#include "data.h" +#include +#include +#include +#include +#include +#include + +uint64_t get_packet_size(uint64_t data_size) +{ + return + sizeof(struct icmphdr) + data_size; +} + +void *create_packet(uint64_t data_size) +{ + static uint32_t seq = 1; + struct icmphdr *icmp_hdr; + char *data; + byte *packet; + + packet = malloc(get_packet_size(data_size)); + if (packet == NULL) + return NULL; + + memset(packet, 0, get_packet_size(data_size)); + icmp_hdr = (void *) packet; + data = (char*) packet + sizeof(struct icmphdr); + + if (get_data(data, data_size)) + { + free(packet); + return NULL; + } + + icmp_hdr->type = ICMP_ECHO; + icmp_hdr->un.echo.id = getpid(); + icmp_hdr->un.echo.sequence = seq; + icmp_hdr->checksum = checksum((uint16_t*)icmp_hdr, get_packet_size(data_size)); + + seq++; + + return packet; +} \ No newline at end of file diff --git a/src/packet.h b/src/packet.h new file mode 100644 index 0000000..b621218 --- /dev/null +++ b/src/packet.h @@ -0,0 +1,7 @@ +#pragma once + +#include + +typedef uint8_t byte; + +uint64_t get_packet_size(uint64_t payload_size); \ No newline at end of file