Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Контрольная сума для Icmp сообщения

2.0K
20 мая 2004 года
yup
31 / / 03.12.2002
как сощитать контрольную суму для ICMP сообщения ?
1.8K
26 мая 2004 года
MishaSt
170 / / 11.08.2003
Цитата:
Originally posted by yup
как сощитать контрольную суму для ICMP сообщения ?


А книгу прочитать, сплоит посмотреть. Сначала там сумируется по 16 пикселов, а потом старшие 8 добавляются к младшим 8-мью. Лана, вот моя прога, написана под Linux:

Код:
#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");
    }
}
2.0K
27 мая 2004 года
yup
31 / / 03.12.2002
А откуда ты алгоритм взял (или ты с експлоита взял) ?
в RFC я что то не понимаю .... :)
1.8K
27 мая 2004 года
MishaSt
170 / / 11.08.2003
Цитата:
Originally posted by yup
А откуда ты алгоритм взял (или ты с експлоита взял) ?
в RFC я что то не понимаю .... :)


В книге было написана, что контрольная сумма считается как сумма всех 16-ричных чисел с поразрадным дополнением. Я почесал-почесал репу, и пошёл в нет искать, и взял из сплоита. По-моему эту функцию сам ниикто не пишет. В двух местах видел - один в один, с точностью до байта одинаковая.

Но смысл ясен, считает сумма, потом старшие прибавляются к младшим, потом снова старшие прибавляются к младшим. Дык, чтобы равномерно распределялась сумма - типичная хэш-функция.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог