码迷,mamicode.com
首页 > 编程语言 > 详细

mac/unix系统:C++实现一个端口扫描器

时间:2017-01-09 23:37:55      阅读:64      评论:0      收藏:0      [点我收藏+]

标签:margin   net   ima   ons   for   return   socket   oat   更改   

  在比较早以前,我用过S扫描器, 以及大名鼎鼎的nmap扫描器, 可以快速扫描某个主机开放的端口, 今天使用C实现这样一个软件,

  编译环境为Mac, 系统版本10.11.6:

#include <stdio.h>  
#include <stdlib.h>  
#include <sys/socket.h>  
#include <unistd.h>
#include <time.h>  
#include <sys/types.h>  
#include <netinet/in.h>  
#include <netdb.h>
#include <arpa/inet.h>

void msg()  
{  
  printf("EP:scan ip startport endport\nEP:scan ip 127.0.0.1 20 2009\n");  
}  
int main(int argc,char** argv)  
{  
  char *ip;  
  int startport,endport,sockfd,i;  
  struct sockaddr_in to;  
  float costtime;  
  clock_t start,end;  
  if(4!=argc)  
  {  
    msg();  
    return 0;  
  }  
  ip=argv[1];  
  startport=atoi(argv[2]);  
  endport=atoi(argv[3]);  
  if(startport<1 || endport>65535 || endport<startport)  
  {  
    printf("端口范围出错/n");  
    return 0;   
  }  
  else{
    printf("IP:%s %d-%d\n",ip,startport,endport);  
  }
  to.sin_family=AF_INET;  
  to.sin_addr.s_addr=inet_addr(ip);  
  start=clock();  
  for(i=startport;i<=endport;i++)  
  {  
    sockfd=socket(AF_INET,SOCK_STREAM,0);  
    to.sin_port=htons(i);  
    if(connect(sockfd,(struct sockaddr *)&to,sizeof(struct sockaddr)) == 0) {
         printf("%s    %d\n",ip,i);
         close(sockfd);
    };
  }  
  end=clock();  
  costtime=(float)(end-start)/CLOCKS_PER_SEC;  
  printf("用时:%f秒\n",costtime);  
  return 0;  
}  

  亲测可行:

技术分享

  以上的代码只能检测固定的ip, 通过更改源码, 软件可以支持区域ip端口的检测, 多加一个循环:

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <unistd.h>
#include <time.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <string.h>
void msg()
{
    printf( "EP:scan ip startport endport\nEP:scan ip 127.0.0.1 20 2009\n" );
    printf( "EP:scan ip endip startport endport\nEP:scan ip 127.0.0. 250 20 2009\n" );
}


int main( int argc, char** argv )
{
    char            * ip;
    char            * endip;
    int            startport, endport, sockfd, i;
    struct sockaddr_in    to;
    float            costtime;
    clock_t            start, end;
    if ( 4 == argc )
    {
        ip        = argv[1];
        startport    = atoi( argv[2] );
        endport        = atoi( argv[3] );
        if ( startport < 1 || endport > 65535 || endport < startport )
        {
            printf( "端口范围出错/n" );
            return(0);
        }else  {
            printf( "IP:%s %d-%d\n", ip, startport, endport );
        }
        to.sin_family        = AF_INET;
        to.sin_addr.s_addr    = inet_addr( ip );
        start            = clock();
        for ( i = startport; i <= endport; i++ )
        {
            sockfd        = socket( AF_INET, SOCK_STREAM, 0 );
            to.sin_port    = htons( i );
            if ( connect( sockfd, (struct sockaddr *) &to, sizeof(struct sockaddr) ) == 0 )
            {
                printf( "%s    %d\n", ip, i );
                close( sockfd );
            }
            ;
        }
        end        = clock();
        costtime    = (float) (end - start) / CLOCKS_PER_SEC;
        printf( "用时:%f秒\n", costtime );
        return(0);
    }else if ( 5 == argc )
    {
        ip        = argv[1];
        endip        = argv[2];
        startport    = atoi( argv[3] );
        endport        = atoi( argv[4] );
        char *tempip;
        if ( startport < 1 || endport > 65535 || endport < startport )
        {
            printf( "端口范围出错/n" );
            return(0);
        }else  {
            /* 循环ip地址 */
            char *ipval;
            start = clock();
            for ( int i = 1; i < atoi( endip ); i++ )
            {
                sprintf( ipval, "%s%d", ip, i );
                printf( "IP:%s\n", ipval );

                to.sin_family        = AF_INET;
                to.sin_addr.s_addr    = inet_addr( ipval );
                for ( i = startport; i <= endport; i++ )
                {
                    printf("%s => %d\n", ipval , i);
                    sockfd = socket( AF_INET, SOCK_STREAM, 0 );
                    to.sin_port    = htons( i );
                    if ( connect( sockfd, (struct sockaddr *) &to, sizeof(struct sockaddr) ) == 0 )
                    {
                        printf( "%s    %d\n", ip, i );
                        close( sockfd );
                    }
                    printf("end\n");
                }
            }
            end        = clock();
            costtime    = (float) (end - start) / CLOCKS_PER_SEC;
            printf( "用时:%f秒\n", costtime );
        }
        return(0);
    }
    msg();
    return(0);
}

 

  参考链接:

    Linux C语言写的超级简单端口扫描器    http://blog.csdn.net/kongjiajie/article/details/4799986

    Linux的SOCKET编程详解    http://blog.csdn.net/hguisu/article/details/7445768/

  EOF

mac/unix系统:C++实现一个端口扫描器

标签:margin   net   ima   ons   for   return   socket   oat   更改   

(0)
(0)
   
举报
评论 一句话评论(0
0条  
登录后才能评论!
© 2014 mamicode.com 版权所有 京ICP备13008772号-2
迷上了代码!