The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"прослушивать ICMP"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"прослушивать ICMP"
Сообщение от alexora Искать по авторуВ закладки(ok) on 11-Сен-04, 10:49  (MSK)
Я вот сделал прослушивание ICMP, но какого то ко мне доходят только пакеты с ip маски 255.255.0.0

вот сорц :

/*
server part for nsocks3 (virusyaka)
*/

#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include <time.h>
#include <sys/wait.h>
#include <signal.h>


int        initTransfer();

int main(void)
{
int    mainSocketRaw;
char   localhost[128];
struct hostent* phe;
struct sockaddr_in dest,from,sa;
int    fromlen;
int    bread;
long   flag = 1;
char   *device="rl0";
struct ifreq ifr, oldifr;
char   *data;
char   recvbuf;

mainSocketRaw = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

if (!mainSocketRaw)  
{
fprintf(stderr,"Error socket create\n");
return 0;
}

sa.sin_family      = AF_INET;
sa.sin_addr.s_addr = INADDR_ANY;
memset(&(sa.sin_zero), '\0', 8);


if (bind(mainSocketRaw, (struct sockaddr *)&sa, sizeof(struct sockaddr)))
{
fprintf(stderr,"failed to  bind\n");
return 1;
}

strcpy(oldifr.ifr_name, device);
if (ioctl(mainSocketRaw, SIOCGIFFLAGS, &oldifr) < 0)
{
fprintf(stderr,"failed to  promisc1\n");
return 1;
}

ifr = oldifr;
ifr.ifr_flags |= IFF_PROMISC;

if (ioctl(mainSocketRaw, SIOCSIFFLAGS, &ifr) < 0)
     {
fprintf(stderr,"failed to  promisc2\n");
return 1;
     }

fromlen = sizeof(from);

data = (char*)malloc(1024);


for(;;)
{
bread = recvfrom(mainSocketRaw, recvbuf, 1024, 0, (struct sockaddr*)&from, &fromlen);
printf("Connected from : %s\n", inet_ntoa(from.sin_addr));
}
return 0;
}

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "прослушивать ICMP"
Сообщение от foxru Искать по авторуВ закладки(ok) on 11-Сен-04, 13:32  (MSK)
>Я вот сделал прослушивание ICMP, но какого то ко мне доходят только
>пакеты с ip маски 255.255.0.0
>

Вот пример моего кода который возможно поможет разобраться в проблеме

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/ip_icmp.h>
  
int main(void){
struct protoent * pr;
struct sockaddr_in addr;
struct icmphdr * icmp;
struct iphdr * ip;
socklen_t fromlen;
int fd,len;
char buffer[1024];

if((pr = getprotobyname("ICMP")) == NULL){
perror("getprotobyname");
return -1;
}

if((fd = socket(AF_INET,SOCK_RAW,pr->p_proto)) == -1){
perror("socket open");
return -2;
}
printf("socket open ok\n");

fromlen = sizeof(struct sockaddr_in);
ip = (struct iphdr *)buffer;
icmp = (struct icmphdr *)(buffer+sizeof(struct iphdr));

for(;;){
if((len = recvfrom(fd,buffer,1024,0,(struct sockaddr *)&addr,&fromlen)) == -1) break;
if(icmp->type == ICMP_ECHO) printf("ICMP_ECHO\n");
if(icmp->type == ICMP_ECHOREPLY) printf("ICMP_ECHOREPLY\n");
}

return 0;
}

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "прослушивать ICMP"
Сообщение от alexora Искать по авторуВ закладки(ok) on 11-Сен-04, 21:55  (MSK)
все равно не пашет, прихдят запросы с одного ip
  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "прослушивать ICMP"
Сообщение от alexora Искать по авторуВ закладки(ok) on 12-Сен-04, 09:55  (MSK)
тема закрыта, даную проблему решил через libpcap
хотя почему я не мог отлавливать ICMP пакеты в предыдущем коде, я так и не понял

#include <pcap.h>                
#include <stdio.h>                
#include <errno.h>                
#include <sys/socket.h>                
#include <sys/types.h>                
#include <netinet/in.h>                
#include <arpa/inet.h>                
#include <netinet/if_ether.h>            
#include <net/ethernet.h>            
#include <netinet/tcp.h>            
#include <ctype.h>                
                            
struct my_ip {
        u_int8_t     ip_vhl;
    #define    IP_V(ip)    (((ip)->ip_vhl & 0xf0) >> 4)
    #define    IP_HL(ip)    ((ip)->ip_vhl & 0x0f)
        u_int8_t    ip_tos;
        u_int16_t    ip_len;
        u_int16_t    ip_id;
        u_int16_t    ip_off;
    #define    IP_DF 0x4000
    #define    IP_MF 0x2000
    #define    IP_OFFMASK 0x01fff
        u_int8_t    ip_ttl;
        u_int8_t    ip_p;
        u_int16_t    ip_sum;
        struct    in_addr    ip_src, ip_dst;
};

typedef struct _ihdr {
        char i_type;
        char i_code;
        unsigned short i_cksum;
        unsigned short i_id;
        unsigned short i_seq;
        unsigned long timestamp;
}IcmpHeader;

    
typedef struct _icmpdata {
        char operation;
        long port;
} IcmpData;

    
#define HEXDUMP_BYTES_PER_LINE 16
#define HEXDUMP_SHORTS_PER_LINE (HEXDUMP_BYTES_PER_LINE / 2)
#define HEXDUMP_HEXSTUFF_PER_SHORT 5
#define HEXDUMP_HEXSTUFF_PER_LINE  (HEXDUMP_HEXSTUFF_PER_SHORT*HEXDUMP_SHORTS_PER_LINE)

u_short handle_ethernet(u_char *args, const struct pcap_pkthdr* pkthdr, const u_char* packet)
{
    struct ether_header *eth;
    eth=(struct ether_header *) packet;
    return ntohs(eth->ether_type);
}


void handle_ip(u_char *args, const struct pcap_pkthdr* pkthdr, const u_char* packet)
{
    const struct my_ip* ip;
    IcmpData     *icmpdata;
    IcmpHeader   *icmphdr;
    char ipport[20];        
    int port;
    ip=(struct my_ip *)(packet+sizeof(struct ether_header));
    if (ip->ip_p==IPPROTO_ICMP)
    {
        icmphdr  = (IcmpHeader*)(packet + 20 + sizeof(struct ether_header));
        icmpdata = (IcmpData*)(packet + sizeof(IcmpHeader) + 20 + sizeof(struct ether_header));
        if (icmpdata->operation=='S')
        {
            sprintf(ipport, "%s:%i\0", inet_ntoa(ip->ip_src), icmpdata->port);
            printf("%s\n",ipport);
        }
    }
}
    
void callback(u_char *args, const struct pcap_pkthdr* pkthdr, const u_char* packet)
{
    u_int16_t etype=handle_ethernet(args, pkthdr, packet);
    if(etype==ETHERTYPE_IP)    handle_ip(args, pkthdr, packet);
}

int main(int argc, char *argv[])
{
    char *dev;
    char errbuf[PCAP_ERRBUF_SIZE];
    pcap_t* descr;
    const u_char *packet;
    struct pcap_pkthdr hdr;
    struct bpf_program fp;
    struct in_addr addr;
    bpf_u_int32 maskp;
    bpf_u_int32 netp;

    if((dev=pcap_lookupdev(errbuf))==NULL)
    {
        printf("%s\n", errbuf); exit(1);
    }
    pcap_lookupnet(dev, &netp, &maskp, errbuf);
    if((descr=pcap_open_live(dev, BUFSIZ, 1, 0, errbuf))==NULL)
    {
        printf("pcap_open_live(): %s\n", errbuf); exit(1);
    }
    if(pcap_compile(descr, &fp, argv[2], 0, netp)==-1)
    {
        printf("Error pcap_compile()\n"); exit(1);
    }
    if(pcap_setfilter(descr, &fp)==-1)
    {
        printf("Error pcap_setfilter\n"); exit(1);
    }
    printf("DEV: %s\n", dev);
    addr.s_addr=netp;
    printf("NET: %s\n", inet_ntoa(addr));
    addr.s_addr=maskp;
    printf("MASK: %s\n", inet_ntoa(addr));
    pcap_loop(descr, -1, callback, NULL);
    pcap_close(descr);
    return 0;
}

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру