#include<stdlib.h>
#include<stdio.h>
#include<sys/socket.h>
#include<sys/types.h>
#include<ctype.h>
#include<netinet/in.h>
struct ip_hdr{
u_char ip_hl:4,
ip_v:4;
u_short ip_tl;
u_short ip_id;
u_short ip_off;
u_char ip_ttl;
u_char ip_p;
u_short ip_sum;
u_long ip_src;
u_long ip_dst;
};
struct icmp_hdr{
u_char icmp_type;
u_char icmp_code;
u_short icmp_sum;
u_short icmp_id;
u_short icmp_seq;
};
struct packet{
struct ip_hdr ip;
struct icmp_hdr icmp;
};
u_short chksum(u_short *p, size_t len){
register u_short *s = p;
register size_t bleft=len;
register u_short sum = 0;
if (bleft==0) return 0;
while (bleft>1){
sum+=*s;
s++;
bleft-=2;
}
if (bleft==1) sum+=(u_short)*((u_char *)s);
sum = (sum >> 16) + (sum & 0xFFFF);
sum += (sum >> 16);
sum = ~sum;
return(sum);
}
int main(int argc,char *argv[])
{
int sock;
struct packet packet;
struct sockaddr_in s_in;
printf("Ping program\n");
if((sock=socket(AF_INET,SOCK_RAW,IPPROTO_RAW))==-1){
printf("Error: Couldn't create socket.\n");
exit(-1);
}else{
printf("Socket created.\n");
}
memset(&s_in,0,sizeof(s_in));
memset(&packet,0,sizeof(packet));
srand(time(NULL));
packet.ip.ip_v=4;
packet.ip.ip_hl=sizeof(struct ip_hdr)/4;
packet.ip.ip_tl=sizeof(struct ip_hdr)+sizeof(struct icmp_hdr);
packet.ip.ip_id=rand() & 0xFFFF;
packet.ip.ip_off=0;
packet.ip.ip_ttl=0xFF;
packet.ip.ip_p=1;
packet.ip.ip_sum=0;
packet.ip.ip_src=inet_addr("192.168.44.69");
packet.ip.ip_dst=inet_addr("192.168.44.65");
packet.icmp.icmp_type=8;
packet.icmp.icmp_code=0;
printf("Address: %x\n", (char *)&packet.icmp);
packet.icmp.icmp_sum=0;
packet.icmp.icmp_id=rand() & 0xFFFF;
packet.icmp.icmp_seq=1;
packet.icmp.icmp_sum=chksum((u_short *)&packet.icmp,sizeof(packet.icmp));
s_in.sin_family=AF_INET;
s_in.sin_port=htons(31337);
s_in.sin_addr.s_addr=inet_addr("192.168.44.65");
if (sendto(sock,&packet,sizeof(packet),0,(const struct sockaddr *)&s_in,sizeof(s_in))==-1){
printf("Error: can't send packet.\n");
}else{
printf("Packet sended.\n");
}
}
Контрольная сума для Icmp сообщения
как сощитать контрольную суму для ICMP сообщения ?
Цитата:
Originally posted by yup
как сощитать контрольную суму для ICMP сообщения ?
как сощитать контрольную суму для ICMP сообщения ?
А книгу прочитать, сплоит посмотреть. Сначала там сумируется по 16 пикселов, а потом старшие 8 добавляются к младшим 8-мью. Лана, вот моя прога, написана под Linux:
Код:
в RFC я что то не понимаю .... :)
Цитата:
Originally posted by yup
А откуда ты алгоритм взял (или ты с експлоита взял) ?
в RFC я что то не понимаю .... :)
А откуда ты алгоритм взял (или ты с експлоита взял) ?
в RFC я что то не понимаю .... :)
В книге было написана, что контрольная сумма считается как сумма всех 16-ричных чисел с поразрадным дополнением. Я почесал-почесал репу, и пошёл в нет искать, и взял из сплоита. По-моему эту функцию сам ниикто не пишет. В двух местах видел - один в один, с точностью до байта одинаковая.
Но смысл ясен, считает сумма, потом старшие прибавляются к младшим, потом снова старшие прибавляются к младшим. Дык, чтобы равномерно распределялась сумма - типичная хэш-функция.