基于libpcap的嵌入式linux 抓包工具,运用telnet 解决嵌入式设备抓包实时显示问题方便

2019-07-12 16:38发布

主要是为了测试时能实时捕捉和显示嵌入式设备上的数据包:
这样操作设备同时可以实时查看数据包。当然我做有配套日客户端接收程序;
编写环境:ubuntu 14      arm-linux-gcc4.4.3       libpcap库   libpcap-1.7.4.tar.gz
图片
实现原理为登入设备telnet 然后运行抓包代码如下图是不用客户端直接登入设备:(抓包器会自动屏蔽23号telnet端口数据包防止抓包数据无限增长)
图片
下面贴出了程序源码,欢迎大家讨论和一起学习:
XX1.c

/*########################################################
###### 日期:2016-5-1                                #######
###### 作者:zhj                                          #######
###### 作用:通过telnet进行远程网络数据包捕捉      #######
###### 版本:v1.4                                                #######
###### 特征:支持端口,IP,MAC,tcp,tcp长度,udp过滤           #######
########################################################*/ //过滤规则指令如下:
//tcp.len.123  tcp.len=123  
//#    tcp.tcp   tcp 过滤
//#   udp.udp  udp过滤
//# tcp.len.123   表示tcp.数据区长度大于123的包
//# tcp.len=123    表示tcp.数据区长度等于123的包                        
//#    adr.port=123    表示过滤端口为123的数据包
//#    dst.port=123   表示过滤目标端口为123的数据包
//#     src.port=123  表示过滤源端口为123的数据包
//#    adr.ip=192.168.1.1  表示过IP口为192.168.1.1的数据包
//#    dsr.ip=192.168.1.1   表示过滤目标IP为192.168.1.1的数据包 
//#    src.ip=192.168.1.1   表示过滤源IP为192.168.1.1的数据包
//#    adr.mac=112233445566   表示过滤MAC地址为112233445566的数据包
//#     dst.mac=112233445566   表示过滤目标MAC地址为112233445566的数据包 
//#     src.mac=112233445566   表示过滤源MAC地址为112233445566的数据包

#include
#include
#include
#include
#include
#include
#include
#include
#include #include
int dst_port[2]={0,0};
int src_port[2]={0,0};
int adr_port[2]={0,0};
short dst_mac[6]={0,0,0,0,0,0};
short src_mac[6]={0,0,0,0,0,0};
short adr_mac[6]={0,0,0,0,0,0};
int dst_ip[4]={0,0,0,0};
int src_ip[4]={0,0,0,0};
int adr_ip[4]={0,0,0,0};
int tcp_len[6]={0,0,0,0,0,0};
struct tm *p;
int dst_portb[2]={0,0};
int src_portb[2]={0,0};
short dst_macb[6]={0,0,0,0,0,0};
short src_macb[6]={0,0,0,0,0,0};
int dst_ipb[4]={0,0,0,0};
int src_ipb[4]={0,0,0,0};
int io;
time_t timep;
unsigned char jjbuf[65535],jjbufer[65535];
int jjbuflen,jjbuflock=0,forx=0; char bb=0,tcp=0,tcplenx=0,tcplen=0,udp=0,srcport=0,dstport=0,adrport=0,srcmac=0,dstmac=0,adrmac=0,srcip=0,dstip=0,adrip=0,dec_gl=1; /*########################################################
#################  捕捉数据包回调函数 ####################
########################################################*/
void my_callback(u_char *useless,const struct pcap_pkthdr* pkthdr,const u_char* packet)//抓包回调函数——处理抓包数据
{
 if(((packet[34]==0x00)&(packet[35]==0x17))|((packet[36]==0x00)&(packet[37]==0x17)))//过滤23号端口网络包(即telnet协议)防止网络数据泛滥
 {
  
 }
 else
 {
  int Iplen=0,Tcplen=0,packetlen=0;
  Iplen=((packet[14])&0x0f)<<2;//计算IP头度
  if(0x06==packet[23])//TCP
  {
   Tcplen=((packet[26+Iplen]&0xf0)>>2);//计算TCP头长度
   packetlen=(((int)packet[16])<<8)+packet[17];//计算IP包长度
  }
  
 /*#########################################################################
###################       tcp长度过滤是否开启      ########################
#########################################################################*/
  for(forx=0;forx<1;forx++)
  {
   if(tcplenx==1)//判断是否开启___tcp___长度过滤
   {
    if(tcplen==1){
     if(0x06==packet[23]){
      if((packetlen-Iplen-Tcplen)==tcp_len[0]){}//计算数据区长度
      else{break;}}
     else{break;}}
    else{
     if(0x06==packet[23]){
      if((packetlen-Iplen-Tcplen)>tcp_len[0]){}//计算数据区长度
      else{break;}}
     else{break;}}
   }  /*#########################################################################
 ###################      判断协议过滤是否开启      ########################
 #########################################################################*/
   if(tcp==1)//判断是否开启___tcp___过滤
   {
    if(0x06==packet[23]){}
    else{break;}
   }
   
   if(udp==1)//判断是否开启___udp___过滤
   {
    if(0x11==packet[23]){}
    else{break;}
   }  /*#########################################################################
 ###################      判断端口过滤是否开启      ########################
 #########################################################################*/
   if(srcport==1)//判断是否开启___源端口___过滤
   {
    if((src_port[0]==packet[Iplen+14])&(src_port[1]==packet[Iplen+15])){}
    else{break;}
   }
   
   if(dstport==1)//判断是否开启___目标端口___过滤
   {
    if((dst_port[0]==packet[Iplen+16])&(dst_port[1]==packet[Iplen+17])){}
    else{break;}
   }
   
   if(adrport==1)//判断是否开启___全部端口___过滤
   {
    if(((adr_port[0]==packet[Iplen+16])&(adr_port[1]==packet[Iplen+17]))|((adr_port[0]==packet[Iplen+14])&(adr_port[1]==packet[Iplen+15]))){}
    else{break;}
   }
   
 /*#########################################################################
 ####################      判断MAC过滤是否开启      ########################
 #########################################################################*/
   if(srcmac==1)//判断是否开启___源MAC___过滤
   {
    if((src_mac[0]==packet[6])&(src_mac[1]==packet[7])&(src_mac[2]==packet[8])&(src_mac[3]==packet[9])&(src_mac[4]==packet[10])&(src_mac[5]==packet[11])){}
    else{break;}
   }
   
   if(dstmac==1)//判断是否开启___目标MAC___过滤
   {
    if((dst_mac[0]==packet[0])&(dst_mac[1]==packet[1])&(dst_mac[2]==packet[2])&(dst_mac[3]==packet[3])&(dst_mac[4]==packet[4])&(dst_mac[5]==packet[5])){}
    else{break;}
   }
   
   if(adrmac==1)//判断是否开启___全部MAC___过滤
   {
    if(((adr_mac[0]==packet[0])&(adr_mac[1]==packet[1])&(adr_mac[2]==packet[2])&(adr_mac[3]==packet[3])&(adr_mac[4]==packet[4])&(adr_mac[5]==packet[5]))|
    ((adr_mac[0]==packet[6])&(adr_mac[1]==packet[7])&(adr_mac[2]==packet[8])&(adr_mac[3]==packet[9])&(adr_mac[4]==packet[10])&(adr_mac[5]==packet[11]))){}
    else{break;}
   }
   
 /*#########################################################################
 #####################      判断IP过滤是否开启      ########################
 #########################################################################*/
   if(srcip==1)//判断是否开启___源IP___过滤
   {
    if((src_ip[0]==packet[26])&(src_ip[1]==packet[27])&(src_ip[2]==packet[28])&(src_ip[3]==packet[29])){}
    else{break;}
   }
   
   if(dstip==1)//判断是否开启___目标IP___过滤
   {
    if((dst_ip[0]==packet[30])&(dst_ip[1]==packet[31])&(dst_ip[2]==packet[32])&(dst_ip[3]==packet[33])){}
    else{break;}
   }
   
   if(adrip==1)//判断是否开启___全部IP___过滤
   {
    if(((adr_ip[0]==packet[30])&(adr_ip[1]==packet[31])&(adr_ip[2]==packet[32])&(adr_ip[3]==packet[33]))|
       ((adr_ip[0]==packet[26])&(adr_ip[1]==packet[27])&(adr_ip[2]==packet[28])&(adr_ip[3]==packet[29]))){}
    else{break;}
   }   /*#########################################################################
  #######################      输出捕捉的数据包     #########################
  #########################################################################*/
   if(jjbuflock==0)
   {
    time(&timep);
    jjbuflock=1;
    jjbuflen=pkthdr->len;
    memcpy(jjbuf,packet,jjbuflen);
    p=localtime(&timep); /*取得当地时间*/
    printf ("%d-%d-%d-", (1900+p->tm_year),( 1+p->tm_mon), p->tm_mday);
    //时间矫正8小时
    int timehour=p->tm_hour+8;
    if(timehour>24){timehour-=24;}
    printf("%d:%d:%d----", timehour, p->tm_min, p->tm_sec);
    for(io=0;io     {
     if (jjbuf[io]<16){printf("0");}
     printf("%x",jjbuf[io]);
    }
    printf("_");
    if (bb==1){printf(" ");}
    fflush(stdout);
    jjbuflock=0;
   }
  }
 }
}   /*########################################################
#################  字符转数字函数 ########################
########################################################*/ 
int ascii_int(char argc)
{
 if(58>(argc))
 {
  argc=argc-48;
 }
 if(argc>96)
 {
  argc=argc-87;
 }
 return argc;
}   /*########################################################
##################### 主main函数 ##########################
########################################################*/ 
int main(int argc,char **argv)
{
    int i;
    char *dev;
    char errbuf[PCAP_ERRBUF_SIZE];
 int vile=-1;
    pcap_t* devfd;
    const u_char *packet;
    struct pcap_pkthdr hdr;   
    struct ether_header *eptr;
 char c,c1,c2=0,c3,c4,c5,c6=0,c7,c8,c9;
 int bufdata[40]={};
 int ipbuff[4]={0,0,0,0};
 
/*########################################################
#################  过滤数据整理  #########################
############  所有数据转换成16进制数据   #################
########################################################*/ 
 for(c=0;c  {
  for(c1=0;c1<30;c1++)
  {
   if(argv[c][c1]=='