免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4658 | 回复: 8
打印 上一主题 下一主题

发送SYN没有SYN|ACK或RST包响应....... [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-02-29 17:32 |只看该作者 |倒序浏览
在ubuntu下写了个TCPsyn扫描器,拓扑为虚拟机中三台同网段主机。
另外我用自己写的sniffer监视网络情况。
在我发送SYN包后,居然什么回应都没有。我已把XP的防火墙关了,red hat的iptables关闭了。
用telnet随便测试都能监听到回应,哪怕是RST。
请问各位大侠,有没有人能帮帮我?是什么情况,贴图如下。

(上图)telnet关闭端口;
(上图)自己填的端口(没有打开端口,可以不?1088)

论坛徽章:
0
2 [报告]
发表于 2012-02-29 17:34 |只看该作者
telnet的图片没传好,telnet同端口有会有RST回应。。。

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
3 [报告]
发表于 2012-02-29 18:15 |只看该作者
telnet通,你的TCPsyn不通
看来实现有问题,但又看不到代码,爱莫能助了

论坛徽章:
0
4 [报告]
发表于 2012-02-29 18:42 |只看该作者
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<stdio.h>
#include<errno.h>
#include<string.h>
#include<unistd.h>
#include<fcntl.h>
#define MAXLEN 1024

struct Etheader
{
        unsigned char destaddr[6];
        unsigned char sourceaddr[6];
        unsigned short type;
};

struct IpHeader
{
        unsigned char  head;
        unsigned char  tos;
        unsigned short total_len;
        unsigned short flags;
        unsigned short offset;
        unsigned char  ttl;
        unsigned char  protoc;
        unsigned short checksum;
        unsigned int   sourceip;
        unsigned int   destip;
};


struct UdpHeader
{
        unsigned short sourceport;
        unsigned short destport;
        unsigned short len;
        unsigned short checksum;
};

struct pHeader
{
        unsigned int sourceip;
        unsigned int destip;
        unsigned char zero;
        unsigned char protoc;
        unsigned short len;
};

struct TcpHeader
{
        unsigned short sourceport;
        unsigned short destport;
        unsigned int   seq;
        unsigned int   ack;
        unsigned char  head;
        unsigned char  flags;
        unsigned short windows;
        unsigned short checksum;
        unsigned short urg;
};
#pragma pack(1)
struct arp_packet
{
        unsigned short hwtype;
        unsigned short protype;
        unsigned char  hwlen;
        unsigned char  prolen;
        unsigned short op;
        unsigned char  sendhwaddr[6];
        unsigned int   sendipaddr;
        unsigned char  recvhwaddr[6];
        unsigned int   recvipaddr;
};
#pragma pack()

struct IcmpHeader
{
        unsigned char type;
        unsigned char code;
        unsigned short checksum;
        union
        {       
                struct
                {        unsigned short id;
                        unsigned short seq;
                }echo;
                unsigned int gateway;
                struct
                {
                        unsigned short unused;
                        unsigned short mtu;
                }frag;
        }un;
};

int pingflags=0;
int conflags=0;
int synflags=0;
int finflags=0;
int udpflags=0;

unsigned short _checksum(unsigned short *ptr,int nbytes) //校验和
{
        unsigned int sum=0;
        unsigned short checksum;
        unsigned short oddbyte;
        while(nbytes>1)
        {
                sum+=*ptr;
                ptr++;
                nbytes-=2;
        }
        if(nbytes==1)
        {
                oddbyte=0;
                *((char*)&oddbyte)=*(char*)ptr;
                sum+=oddbyte;
        }
        sum=(sum>>16)+(sum&0xffff);
        sum+=(sum>>16);// safe
        checksum=~sum;
        return (checksum);
}

int  ping(char *targetip)//ping程序
{
        int ret;
        char*source;
        char*dest;
        int pingsock;
        int sendbufsize;
        struct sockaddr_in pingtaraddr,fromaddr;
        char *sendbuf;
        char recvbuf[MAXLEN];
        char c[]="192.168.64.102";
        struct IpHeader *ip;
        struct IpHeader *recvip;
        struct IcmpHeader *icmp;
        struct IcmpHeader *recvicmp;
        struct timeval tstart,tend;
        int flags=-1;
        float timeuse=0;
        pingsock=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);
        if(pingsock<0)
        {
                printf("pingsocket error\n";
                exit(1);
        }
        int on=1;
        ret=setsockopt(pingsock,0,IP_HDRINCL,&on,sizeof(on));
        if(ret<0)
        {
                printf("setsockopt IP_HDRINCL error\n";
                exit(1);
        }
        sendbufsize=sizeof(struct IpHeader)+sizeof(struct IcmpHeader);
        sendbuf=(char*)malloc(sendbufsize);
        memset(sendbuf,0,sizeof(sendbuf));
        //pad IP header ;hostbyte to netbyte
        ip=(struct IpHeader*)sendbuf;
        ip->head=0;
        ip->head=(ip->head|0x45);
        ip->tos=0;
        ip->total_len=htons(sizeof(sendbuf));
        ip->flags=rand();
        ip->offset=0x40;
        ip->ttl=64;
        ip->protoc=1;//ICMP
        ip->checksum=0;
        ip->sourceip=inet_addr("192.168.64.102";//to banery;
        ip->destip=inet_addr(targetip);       
        //pad ICMP header
        icmp=(struct IcmpHeader*)(ip+1);
        icmp->type=8;//ICMP_ECHO;
        icmp->code=0;
        icmp->un.echo.id=htons(10086);
        icmp->un.echo.seq=0;
        icmp->checksum=_checksum((unsigned short *)icmp,sizeof(struct IcmpHeader));
        memset(&pingtaraddr,0,sizeof(pingtaraddr));
        pingtaraddr.sin_family=AF_INET;
        pingtaraddr.sin_addr.s_addr=inet_aton(targetip);
//      sizeof(sendbuf) is pointer size,so the NIC not identified this packet and then sendto error(invalied argument)
//        ret=sendto(pingsock,sendbuf,sizeof(sendbuf),0,(struct sockaddr*)&pingtaraddr,sizeof(pingtaraddr));
        ret=sendto(pingsock,sendbuf,sendbufsize,0,(struct sockaddr*)&pingtaraddr,sizeof(pingtaraddr));
        if(ret<0){
                 printf("send to error\n";
                 fprintf(stderr,"%s\n",strerror(errno));
        }
        if(fcntl(pingsock,F_SETFL,O_NONBLOCK)<0)
        {
                printf("set fcntl error\n";
        }
        unsigned int addrlen=sizeof(struct sockaddr_in);
        gettimeofday(&tstart,NULL);
        do
        {
                ret=recvfrom(pingsock,recvbuf,1024,0,(struct sockaddr*)&fromaddr,(socklen_t *)&addrlen);
                if(ret>0)
                {
                        recvip=(struct IpHeader*)recvbuf;
                        recvicmp=(struct IcmpHeader*)(recvbuf+((recvip->head)&0x0f)*4);
                //        printf("%d\n",(char*)recvicmp-(char*)recvip);
                        printf("from %s\n",inet_ntoa(recvip->sourceip));
                        printf("to %s\n",inet_ntoa(recvip->destip));
                        printf("%d\n",recvip->protoc);
                        source=inet_ntoa(recvip->sourceip);
                        dest=inet_ntoa(recvip->destip);
                        if(strcmp(inet_ntoa(recvip->sourceip),targetip)==0)
                        {       
                                if(strcmp(inet_ntoa(recvip->destip),c)==0)
                                {
                                        printf("&&&&&&\n";
                                        return 1;
                                        printf("%c\n",recvicmp->code);
                                        if(recvicmp->type=='0')
                                        {
                                                printf("ping su\n";
                                                flags=1;
                                                break;
                                        }
                                        else printf("!!!!\n";
                                }
                        }
                }
                gettimeofday(&tend,NULL);
                timeuse=1000000*(tend.tv_sec-tstart.tv_sec)+(tend.tv_usec-tstart.tv_usec);
                timeuse=timeuse/1000000.0;
                if(timeuse<3)continue;
                else
                {
                        printf("time out\n";
                        flags=0;
                        break;
                }
        }while(1);


        return 0;
}

int  TCPsynscan(char *targetip,unsigned short localport,unsigned short hostport)//构造SYN包
{
        struct TcpHeader *tcp;
        struct pHeader *ptcp;
        struct sockaddr_in scanaddr,myaddr;
        char * sendbuf;
        unsigned int addrlen;
        int synsock,ret,sendbufsize;
        char c[]="192.168.64.101";
        synsock=socket(AF_INET,SOCK_RAW,IPPROTO_TCP);
        if(synsock<0)
        {
                printf("socket error\n";
                exit(1);
        }
        if(ret<0)
        {
                printf("bind error\n");
                exit(1);
        }
        sendbufsize=sizeof(struct TcpHeader)+sizeof(struct pHeader);
        sendbuf=(char*)malloc(sendbufsize);
        ptcp=(struct pHeader*)sendbuf;
        tcp=(struct TcpHeader*)(sendbuf+sizeof(struct pHeader));
        //pad ptcp header
        ptcp->sourceip=inet_addr("192.168.64.101");
        ptcp->destip=inet_addr(targetip);
        ptcp->zero=0;
        ptcp->protoc=0x06;
        ptcp->len=sizeof(struct TcpHeader);
        //pad tcp header
        memset(tcp,0,sizeof(struct TcpHeader));
        tcp->sourceport=htons(localport);
        tcp->destport=htons(hostport);
        tcp->seq=htonl(1234567;
        tcp->ack=0;
        tcp->head=0x50;
        tcp->flags=0x02;
        tcp->windows=htons(65535);
        tcp->checksum=0;
        tcp->urg=0;
        tcp->checksum=_checksum((unsigned short*)ptcp,sizeof(struct pHeader)+sizeof(struct TcpHeader));
        scanaddr.sin_family=AF_INET;
        scanaddr.sin_port=htons(hostport);
        scanaddr.sin_addr.s_addr=inet_addr(targetip);
        //sendto tcp header;
        //ptcp header not send;
        sendto(synsock,tcp,sizeof(struct TcpHeader),0,(struct sockaddr*)&scanaddr,sizeof(scanaddr));
        if(ret<0)
        {
                 printf("send to error\n");
                 fprintf(stderr,"%s\n",strerror(errno));
    }
        struct IpHeader *recvip;
        struct TcpHeader *recvtcp;
        struct sockaddr_in fromaddr;
        char recvbuf[1024];
        struct timeval tstart,tend;
        float timeuse;
        //unsigned int addrlen;
        addrlen=sizeof(struct sockaddr_in);
        gettimeofday(&tstart,NULL);
        if(fcntl(synsock,F_SETFL,O_NONBLOCK)<0)
        {
                printf("set fcntl error\n");
        }
        do
        {
                ret=recvfrom(synsock,recvbuf,1024,0,(struct sockaddr*)&fromaddr,(socklen_t *)&addrlen);
                if(ret>0)
                {
                        recvip=(struct IpHeader*)recvbuf;
                        recvtcp=(struct TcpHeader*)(recvbuf+((recvip->head)&0x0f)*4);
                        printf("%d\n",(char*)recvtcp-(char*)recvip);
                        printf("from %s\n",inet_ntoa(recvip->sourceip));
                        printf("to %s\n",inet_ntoa(recvip->destip));
                        printf("%d\n",recvip->protoc);
                        if(strcmp(inet_ntoa(recvip->sourceip),targetip)==0)
                        {
                                if(strcmp(inet_ntoa(recvip->destip),c)==0)
                                {
                                        if(recvtcp->flags==0x12)//SYN|ACK
                                        {
                                                printf("this port is opened!\n");
                                                return 1;
                                        }
                                        else if(recvtcp->flags==0x14)//RST|ACK
                                             {
                                                        printf("this port is closed!\n");
                                                        return 0;
                                             }
                                             else printf("iptables!\n");
                                }
                        }
                        else printf("######\n");
                }
                else printf("not recv\n");
                gettimeofday(&tend,NULL);
                timeuse=1000000*(tend.tv_sec-tstart.tv_sec)+(tend.tv_usec-tstart.tv_usec);
                timeuse=timeuse/1000000.0;
                if(timeuse<0.0002)continue;
                else
                {
                        printf("time out\n");
                        break;
                }
        }while(1);
        return -1;
}
int main(int argc,char *argv[])
{
        char sendbuff[MAXLEN];
        char recvbuff[MAXLEN];
        char targetip="";
        int ret=0;
        char message[]=
        "-p        Ping Scan\n-c        TCP connect Scan\n-s        TCP SYN Scan\n-f        TCP FIN Scan\n-u        UDP Scan\n";
        int ch;
        unsigned short localport,hostport;
        if(argc==1)
        {
                printf("%s\n",message);
        }
        else
        {
        while((ch=getopt(argc,argv,"hp:c:s:f:u:"))!=-1)
        {
                switch(ch)
                {
                case 'h':printf("%s\n",message);
                         break;
                case 'p':pingflags=1;
                         break;
                case 'c':pingflags=1;
                         conflags=1;
                         break;
                case 's':pingflags=1;
                         synflags=1;
                         localport=(unsigned short)atoi(argv[3]);
                          hostport=(unsigned short)atoi(argv[4]);
                         break;
                case 'f':pingflags=1;
                         finflags=1;
                         break;
                case 'u':pingflags=1;
                         udpflags=1;
                         break;
                }
        }
        }
        if(pingflags==1)
        {
                ret=ping(argv[2]);
        }
        if(synflags==1)
        {
                printf("syn\n");
                if(ret==1)
                {
                        ret=TCPsynscan(argv[2],localport,hostport);
                }
                else printf("host not exist\n");
        }
        return 0;
}
这是我的代码,运行时候先ping对方,对方ping同了才开始发送SYN
运行./XXX -s 192.168.64.100 2000 5555
2000为自己指定本机端口,5555对方端口
先谢谢了,弄了好久不明白
回复 3# timespace


   

论坛徽章:
0
5 [报告]
发表于 2012-02-29 18:44 |只看该作者
...居然都出表情了。。。

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
6 [报告]
发表于 2012-02-29 18:54 |只看该作者

把代码用code标签阔起来啊。。。
看置顶贴

论坛徽章:
0
7 [报告]
发表于 2012-02-29 19:03 |只看该作者
  1. #include<sys/socket.h>
  2. #include<sys/types.h>
  3. #include<netinet/in.h>
  4. #include<stdio.h>
  5. #include<errno.h>
  6. #include<string.h>
  7. #include<unistd.h>
  8. #include<fcntl.h>
  9. #define MAXLEN 1024

  10. struct Etheader
  11. {
  12.         unsigned char destaddr[6];
  13.         unsigned char sourceaddr[6];
  14.         unsigned short type;
  15. };

  16. struct IpHeader
  17. {
  18.         unsigned char  head;
  19.         unsigned char  tos;
  20.         unsigned short total_len;
  21.         unsigned short flags;
  22.         unsigned short offset;
  23.         unsigned char  ttl;
  24.         unsigned char  protoc;
  25.         unsigned short checksum;
  26.         unsigned int   sourceip;
  27.         unsigned int   destip;
  28. };


  29. struct UdpHeader
  30. {
  31.         unsigned short sourceport;
  32.         unsigned short destport;
  33.         unsigned short len;
  34.         unsigned short checksum;
  35. };

  36. struct pHeader
  37. {
  38.         unsigned int sourceip;
  39.         unsigned int destip;
  40.         unsigned char zero;
  41.         unsigned char protoc;
  42.         unsigned short len;
  43. };

  44. struct TcpHeader
  45. {
  46.         unsigned short sourceport;
  47.         unsigned short destport;
  48.         unsigned int   seq;
  49.         unsigned int   ack;
  50.         unsigned char  head;
  51.         unsigned char  flags;
  52.         unsigned short windows;
  53.         unsigned short checksum;
  54.         unsigned short urg;
  55. };
  56. #pragma pack(1)
  57. struct arp_packet
  58. {
  59.         unsigned short hwtype;
  60.         unsigned short protype;
  61.         unsigned char  hwlen;
  62.         unsigned char  prolen;
  63.         unsigned short op;
  64.         unsigned char  sendhwaddr[6];
  65.         unsigned int   sendipaddr;
  66.         unsigned char  recvhwaddr[6];
  67.         unsigned int   recvipaddr;
  68. };
  69. #pragma pack()

  70. struct IcmpHeader
  71. {
  72.         unsigned char type;
  73.         unsigned char code;
  74.         unsigned short checksum;
  75.         union
  76.         {       
  77.                 struct
  78.                 {        unsigned short id;
  79.                         unsigned short seq;
  80.                 }echo;
  81.                 unsigned int gateway;
  82.                 struct
  83.                 {
  84.                         unsigned short unused;
  85.                         unsigned short mtu;
  86.                 }frag;
  87.         }un;
  88. };

  89. int pingflags=0;
  90. int conflags=0;
  91. int synflags=0;
  92. int finflags=0;
  93. int udpflags=0;

  94. unsigned short _checksum(unsigned short *ptr,int nbytes) //校验和
  95. {
  96.         unsigned int sum=0;
  97.         unsigned short checksum;
  98.         unsigned short oddbyte;
  99.         while(nbytes>1)
  100.         {
  101.                 sum+=*ptr;
  102.                 ptr++;
  103.                 nbytes-=2;
  104.         }
  105.         if(nbytes==1)
  106.         {
  107.                 oddbyte=0;
  108.                 *((char*)&oddbyte)=*(char*)ptr;
  109.                 sum+=oddbyte;
  110.         }
  111.         sum=(sum>>16)+(sum&0xffff);
  112.         sum+=(sum>>16);// safe
  113.         checksum=~sum;
  114.         return (checksum);
  115. }

  116. int  ping(char *targetip)//ping程序
  117. {
  118.         int ret;
  119.         char*source;
  120.         char*dest;
  121.         int pingsock;
  122.         int sendbufsize;
  123.         struct sockaddr_in pingtaraddr,fromaddr;
  124.         char *sendbuf;
  125.         char recvbuf[MAXLEN];
  126.         char c[]="192.168.64.102";
  127.         struct IpHeader *ip;
  128.         struct IpHeader *recvip;
  129.         struct IcmpHeader *icmp;
  130.         struct IcmpHeader *recvicmp;
  131.         struct timeval tstart,tend;
  132.         int flags=-1;
  133.         float timeuse=0;
  134.         pingsock=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);
  135.         if(pingsock<0)
  136.         {
  137.                 printf("pingsocket error\n");
  138.                 exit(1);
  139.         }
  140.         int on=1;
  141.         ret=setsockopt(pingsock,0,IP_HDRINCL,&on,sizeof(on));
  142.         if(ret<0)
  143.         {
  144.                 printf("setsockopt IP_HDRINCL error\n");
  145.                 exit(1);
  146.         }
  147.         sendbufsize=sizeof(struct IpHeader)+sizeof(struct IcmpHeader);
  148.         sendbuf=(char*)malloc(sendbufsize);
  149.         memset(sendbuf,0,sizeof(sendbuf));
  150.         //pad IP header ;hostbyte to netbyte
  151.         ip=(struct IpHeader*)sendbuf;
  152.         ip->head=0;
  153.         ip->head=(ip->head|0x45);
  154.         ip->tos=0;
  155.         ip->total_len=htons(sizeof(sendbuf));
  156.         ip->flags=rand();
  157.         ip->offset=0x40;
  158.         ip->ttl=64;
  159.         ip->protoc=1;//ICMP
  160.         ip->checksum=0;
  161.         ip->sourceip=inet_addr("192.168.64.102");//to banery;
  162.         ip->destip=inet_addr(targetip);       
  163.         //pad ICMP header
  164.         icmp=(struct IcmpHeader*)(ip+1);
  165.         icmp->type=8;//ICMP_ECHO;
  166.         icmp->code=0;
  167.         icmp->un.echo.id=htons(10086);
  168.         icmp->un.echo.seq=0;
  169.         icmp->checksum=_checksum((unsigned short *)icmp,sizeof(struct IcmpHeader));
  170.         memset(&pingtaraddr,0,sizeof(pingtaraddr));
  171.         pingtaraddr.sin_family=AF_INET;
  172.         pingtaraddr.sin_addr.s_addr=inet_aton(targetip);
  173. //      sizeof(sendbuf) is pointer size,so the NIC not identified this packet and then sendto error(invalied argument)
  174. //        ret=sendto(pingsock,sendbuf,sizeof(sendbuf),0,(struct sockaddr*)&pingtaraddr,sizeof(pingtaraddr));
  175.         ret=sendto(pingsock,sendbuf,sendbufsize,0,(struct sockaddr*)&pingtaraddr,sizeof(pingtaraddr));
  176.         if(ret<0){
  177.                  printf("send to error\n");
  178.                  fprintf(stderr,"%s\n",strerror(errno));
  179.         }
  180.         if(fcntl(pingsock,F_SETFL,O_NONBLOCK)<0)
  181.         {
  182.                 printf("set fcntl error\n");
  183.         }
  184.         unsigned int addrlen=sizeof(struct sockaddr_in);
  185.         gettimeofday(&tstart,NULL);
  186.         do
  187.         {
  188.                 ret=recvfrom(pingsock,recvbuf,1024,0,(struct sockaddr*)&fromaddr,(socklen_t *)&addrlen);
  189.                 if(ret>0)
  190.                 {
  191.                         recvip=(struct IpHeader*)recvbuf;
  192.                         recvicmp=(struct IcmpHeader*)(recvbuf+((recvip->head)&0x0f)*4);
  193.                 //        printf("%d\n",(char*)recvicmp-(char*)recvip);
  194.                         printf("from %s\n",inet_ntoa(recvip->sourceip));
  195.                         printf("to %s\n",inet_ntoa(recvip->destip));
  196.                         printf("%d\n",recvip->protoc);
  197.                         source=inet_ntoa(recvip->sourceip);
  198.                         dest=inet_ntoa(recvip->destip);
  199.                         if(strcmp(inet_ntoa(recvip->sourceip),targetip)==0)
  200.                         {       
  201.                                 if(strcmp(inet_ntoa(recvip->destip),c)==0)
  202.                                 {
  203.                                         printf("&&&&&&\n");
  204.                                         return 1;
  205.                                         printf("%c\n",recvicmp->code);
  206.                                         if(recvicmp->type=='0')
  207.                                         {
  208.                                                 printf("ping su\n");
  209.                                                 flags=1;
  210.                                                 break;
  211.                                         }
  212.                                         else printf("!!!!\n");
  213.                                 }
  214.                         }
  215.                 }
  216.                 gettimeofday(&tend,NULL);
  217.                 timeuse=1000000*(tend.tv_sec-tstart.tv_sec)+(tend.tv_usec-tstart.tv_usec);
  218.                 timeuse=timeuse/1000000.0;
  219.                 if(timeuse<3)continue;
  220.                 else
  221.                 {
  222.                         printf("time out\n");
  223.                         flags=0;
  224.                         break;
  225.                 }
  226.         }while(1);


  227.         return 0;
  228. }

  229. int  TCPsynscan(char *targetip,unsigned short localport,unsigned short hostport)//构造SYN包
  230. {
  231.         struct TcpHeader *tcp;
  232.         struct pHeader *ptcp;
  233.         struct sockaddr_in scanaddr,myaddr;
  234.         char * sendbuf;
  235.         unsigned int addrlen;
  236.         int synsock,ret,sendbufsize;
  237.         char c[]="192.168.64.101";
  238.         synsock=socket(AF_INET,SOCK_RAW,IPPROTO_TCP);
  239.         if(synsock<0)
  240.         {
  241.                 printf("socket error\n");
  242.                 exit(1);
  243.         }
  244.         if(ret<0)
  245.         {
  246.                 printf("bind error\n");
  247.                 exit(1);
  248.         }
  249.         sendbufsize=sizeof(struct TcpHeader)+sizeof(struct pHeader);
  250.         sendbuf=(char*)malloc(sendbufsize);
  251.         ptcp=(struct pHeader*)sendbuf;
  252.         tcp=(struct TcpHeader*)(sendbuf+sizeof(struct pHeader));
  253.         //pad ptcp header
  254.         ptcp->sourceip=inet_addr("192.168.64.101");
  255.         ptcp->destip=inet_addr(targetip);
  256.         ptcp->zero=0;
  257.         ptcp->protoc=0x06;
  258.         ptcp->len=sizeof(struct TcpHeader);
  259.         //pad tcp header
  260.         memset(tcp,0,sizeof(struct TcpHeader));
  261.         tcp->sourceport=htons(localport);
  262.         tcp->destport=htons(hostport);
  263.         tcp->seq=htonl(12345678);
  264.         tcp->ack=0;
  265.         tcp->head=0x50;
  266.         tcp->flags=0x02;
  267.         tcp->windows=htons(65535);
  268.         tcp->checksum=0;
  269.         tcp->urg=0;
  270.         tcp->checksum=_checksum((unsigned short*)ptcp,sizeof(struct pHeader)+sizeof(struct TcpHeader));
  271.         scanaddr.sin_family=AF_INET;
  272.         scanaddr.sin_port=htons(hostport);
  273.         scanaddr.sin_addr.s_addr=inet_addr(targetip);
  274.         //sendto tcp header;
  275.         //ptcp header not send;
  276.         sendto(synsock,tcp,sizeof(struct TcpHeader),0,(struct sockaddr*)&scanaddr,sizeof(scanaddr));
  277.         if(ret<0)
  278.         {
  279.                  printf("send to error\n");
  280.                  fprintf(stderr,"%s\n",strerror(errno));
  281.     }
  282.         struct IpHeader *recvip;
  283.         struct TcpHeader *recvtcp;
  284.         struct sockaddr_in fromaddr;
  285.         char recvbuf[1024];
  286.         struct timeval tstart,tend;
  287.         float timeuse;
  288.         //unsigned int addrlen;
  289.         addrlen=sizeof(struct sockaddr_in);
  290.         gettimeofday(&tstart,NULL);
  291.         if(fcntl(synsock,F_SETFL,O_NONBLOCK)<0)
  292.         {
  293.                 printf("set fcntl error\n");
  294.         }
  295.         do
  296.         {
  297.                 ret=recvfrom(synsock,recvbuf,1024,0,(struct sockaddr*)&fromaddr,(socklen_t *)&addrlen);
  298.                 if(ret>0)
  299.                 {
  300.                         recvip=(struct IpHeader*)recvbuf;
  301.                         recvtcp=(struct TcpHeader*)(recvbuf+((recvip->head)&0x0f)*4);
  302.                         printf("%d\n",(char*)recvtcp-(char*)recvip);
  303.                         printf("from %s\n",inet_ntoa(recvip->sourceip));
  304.                         printf("to %s\n",inet_ntoa(recvip->destip));
  305.                         printf("%d\n",recvip->protoc);
  306.                         if(strcmp(inet_ntoa(recvip->sourceip),targetip)==0)
  307.                         {
  308.                                 if(strcmp(inet_ntoa(recvip->destip),c)==0)
  309.                                 {
  310.                                         if(recvtcp->flags==0x12)//SYN|ACK
  311.                                         {
  312.                                                 printf("this port is opened!\n");
  313.                                                 return 1;
  314.                                         }
  315.                                         else if(recvtcp->flags==0x14)//RST|ACK
  316.                                              {
  317.                                                         printf("this port is closed!\n");
  318.                                                         return 0;
  319.                                              }
  320.                                              else printf("iptables!\n");
  321.                                 }
  322.                         }
  323.                         else printf("######\n");
  324.                 }
  325.                 else printf("not recv\n");
  326.                 gettimeofday(&tend,NULL);
  327.                 timeuse=1000000*(tend.tv_sec-tstart.tv_sec)+(tend.tv_usec-tstart.tv_usec);
  328.                 timeuse=timeuse/1000000.0;
  329.                 if(timeuse<0.0002)continue;
  330.                 else
  331.                 {
  332.                         printf("time out\n");
  333.                         break;
  334.                 }
  335.         }while(1);
  336.         return -1;
  337. }
  338. int main(int argc,char *argv[])
  339. {
  340.         char sendbuff[MAXLEN];
  341.         char recvbuff[MAXLEN];
  342.         char targetip="";
  343.         int ret=0;
  344.         char message[]=
  345.         "-p        Ping Scan\n-c        TCP connect Scan\n-s        TCP SYN Scan\n-f        TCP FIN Scan\n-u        UDP Scan\n";
  346.         int ch;
  347.         unsigned short localport,hostport;
  348.         if(argc==1)
  349.         {
  350.                 printf("%s\n",message);
  351.         }
  352.         else
  353.         {
  354.         while((ch=getopt(argc,argv,"hp:c:s:f:u:"))!=-1)
  355.         {
  356.                 switch(ch)
  357.                 {
  358.                 case 'h':printf("%s\n",message);
  359.                          break;
  360.                 case 'p':pingflags=1;
  361.                          break;
  362.                 case 'c':pingflags=1;
  363.                          conflags=1;
  364.                          break;
  365.                 case 's':pingflags=1;
  366.                          synflags=1;
  367.                          localport=(unsigned short)atoi(argv[3]);
  368.                           hostport=(unsigned short)atoi(argv[4]);
  369.                          break;
  370.                 case 'f':pingflags=1;
  371.                          finflags=1;
  372.                          break;
  373.                 case 'u':pingflags=1;
  374.                          udpflags=1;
  375.                          break;
  376.                 }
  377.         }
  378.         }
  379.         if(pingflags==1)
  380.         {
  381.                 ret=ping(argv[2]);
  382.         }
  383.         if(synflags==1)
  384.         {
  385.                 printf("syn\n");
  386.                 if(ret==1)
  387.                 {
  388.                         ret=TCPsynscan(argv[2],localport,hostport);
  389.                 }
  390.                 else printf("host not exist\n");
  391.         }
  392.         return 0;
  393. }
复制代码
回复 6# timespace


   

论坛徽章:
0
8 [报告]
发表于 2012-02-29 19:04 |只看该作者
谢谢了回复 6# timespace


   

论坛徽章:
0
9 [报告]
发表于 2012-03-01 21:11 |只看该作者
我已经自己搞明白了。伪头部的len是双字节的,我忘记转成网络字节了,所以校验和错误,对方TCP层丢弃。现在好了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP