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 64 65 66 67 68 69 70 71 72
| static void build_copy_pkt (unsigned char *data)
{
int one = 1;
const int *val = &one;
int numbytes;
int sockfd, optval;
unsigned char *cpy_data = data;
struct iphdr *ip_hdr;
struct udphdr *udp_hdr;
ip_hdr=(struct iphdr *)cpy_data;
//tcp_hdr=(struct tcphdr *)(cpy_data + (sizeof(struct iphdr)));
if(ip_hdr->protocol == IPPROTO_UDP)
{
udp_hdr = ((struct udphdr *)cpy_data) + (sizeof (struct iphdr));
}
struct sockaddr_in dconn;
char test[16], test2[16];
udp_hdr->dest = htons(51064);
inet_pton(AF_INET, "192.6.1.236", &ip_hdr->daddr);
printf("Création du socket\n");
sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_UDP);
if(sockfd <0)
{
printf("erreur durant la création du socket");
}
dconn.sin_port = htons(51064);
dconn.sin_family = AF_INET;
dconn.sin_addr.s_addr = ip_hdr->daddr;
printf("protocol : %d\n", ip_hdr->protocol);
printf("ttl: %d\n", ip_hdr->ttl);
inet_ntop(AF_INET, &(ip_hdr->saddr), test, sizeof(test));
printf("source : %s\n", test);
inet_ntop(AF_INET, &(ip_hdr->daddr), test2, sizeof(test2));
printf("destination : %s\n", test2);
ip_hdr->tot_len= sizeof(struct iphdr)+ sizeof(struct udphdr) +10;
printf("tot len : %d\n", ip_hdr->tot_len);
printf("ip_len: %d\n", sizeof(ip_hdr));
printf("payload : %d \n", sizeof(cpy_data));
printf("payload value: %s\n", cpy_data);
printf("dport : %d\n\n", ntohs(udp_hdr->dest));
udp_hdr->source = htons(2102);
printf("sport : %d\n\n", ntohs(udp_hdr->source));
udp_hdr->len = sizeof(struct udphdr) + 11;//+ sizeof(ip_hdr));
if (setsockopt (sockfd, IPPROTO_IP, IP_HDRINCL, val, sizeof (one)) < 0)
{
printf ("Warning: Cannot set HDRINCL!\n");
}
numbytes=sendto(sockfd, cpy_data,ip_hdr->tot_len, 0,(struct sockaddr *)&dconn, sizeof(struct sockaddr));
if(numbytes <0)
{
printf("erreur durant l'envoi \n");
exit(1);
}
printf("pkt sent : %d", numbytes);
} |
Partager