Salut,
Ce que je veux fair c'est forger des packets IP avant de les envoyer sur internet.
Je sais que les sockets en ecoute sur les serveurs web sont de type SOCK_STREAM fonctionnant en mode connecté et que les sockets qu'on peux forger sont de type SOCK_RAW non connecté.
Alors, j'essaie de connecter un socket serveur de la famille AF_INET et de type SOCK_STREAM à un socket client de la meme famille AF_INET mais de type SOCK_RAW utilisant les deux le protocole IPPROTO_TCP.
le code du serveur est:
et voila le code du client :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <linux/socket.h> #include <netinet/in.h> #include <netinet/tcp.h> #include <string.h> int main() { int s_server; s_server = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if (s_server == -1) fprintf(stderr, "La fonction socket a echoue.\n"); else { struct sockaddr_in server; server.sin_family = AF_INET; server.sin_addr.s_addr = htonl(INADDR_ANY); server.sin_port = htons(5050); memset(&server.sin_zero, '\0', sizeof(server.sin_zero)); if (bind(s_server, (struct sockaddr *) &server, sizeof(server)) == -1) fprintf(stderr, "La fonction bind a echoue.\n"); else { if (listen(s_server, 2) == -1) fprintf(stderr, "La fonction listen a echoue.\n"); else { int s_client; struct sockaddr_in client; int csize = sizeof(client); s_client = accept(s_server, (struct sockaddr *) &client, &csize); if (s_client == -1) fprintf(stderr, "La fonction accept a echoue.\n"); else { char buffer[100]; int n; printf("Le client %s s'est connecte !\n", inet_ntoa(client.sin_addr)); strcpy(buffer, "Bonjour\n"); send(s_client, buffer, (int)strlen(buffer), 0); shutdown(s_client, SHUT_RD); } } } shutdown(s_server, SHUT_RD); } return 0; }
je sais que ma socket client ne fonctionne pas en mode connecté mais j'ai utilisé la fonction connect aprés avoir lu la page de man de cette fonction qui dit que c'est possible de connecter deux socket dont l'un d'entre eux est en mode non connecté
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 #include <sys/socket.h> #include <netinet/ip.h> #include <stdio.h> #include <sys/types.h> #include <linux/socket.h> #include <netinet/in.h> #include <netinet/tcp.h> #include <string.h> #include <stdlib.h> int main() { int s; s = socket(PF_INET, SOCK_RAW, IPPROTO_TCP); if (s == -1) fprintf(stderr, "La fonction socket raw a échoué.\n"); else { printf("La fonction socket a réussi.\n"); int one = 1; const int *sockopt = &one; if (setsockopt(s, IPPROTO_IP, IP_HDRINCL, (void *)&sockopt, sizeof(sockopt)) == -1) fprintf(stderr, "La fonction setsockopt a échoué.\n"); else { printf("La fonction setsockopt a réussi.\n"); struct sockaddr_in dest; dest.sin_family = AF_INET; dest.sin_addr.s_addr = inet_addr("127.0.0.1"); dest.sin_port = htons(5050); memset(&dest.sin_zero, '\0', sizeof(dest.sin_zero)); if (connect(s, (struct sockaddr *) &dest, sizeof(dest)) == -1) fprintf(stderr, "La fonction connect a échoué.\n"); else { printf("La fonction connect a réussi.\n"); char buffer[100]; int n; int so_dest = sizeof(dest); n = recvfrom(s, buffer, sizeof(buffer) - 1, 0, (struct sockaddr *)&dest, &so_dest); if (n != -1) { buffer[n] = '\0'; printf("%s", buffer); } else { printf ("n==-1"); } } } shutdown(s, SHUT_RD); } return 0; }
veuillez m'aider à établir cette connection en utilisant la fonction connect si c'est possible ou bien en simulant le traffic généré sur l'interface reseau par cette fonction
ou pourquoi pas m'expliquer comment intercepter le packet avant d'etre anvoyer sur l'interface reseau et modifier ses champs
merci
Partager