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

  在比较早以前,我用过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

时间: 2024-10-13 22:24:27

mac/unix系统:C++实现一个端口扫描器的相关文章

java编写一个端口扫描器

好久没写java了,学的时候,也没学习网络编程这一块,无意中看到了一本书,于是小小复习一下java,写个端口扫描器,玩玩吧,网上这种小公具有的是,就是自己无聊写着玩玩. 源代码如下: 共两个类,比较简单奥 import javax.swing.*; import java.awt.Dimension; import java.awt.Font; import java.awt.Toolkit; import java.awt.event.*; public class PortScan exte

网络攻防学习 1编写一个端口扫描器

谨以此文献给初学的自己! 我有太多的名词不认识通过学习 一步步巩固基础 一步步提高自己r 任何一个靠谱的网络攻击都是起步于侦查的.我们将学习编写一个扫描主机开放的tcp端口的侦察小脚本,为了与tcp端交互,我们先建立TCP套接字. 套接字: 英文名字为socket, 是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程.

【技术分享】手把手教你使用PowerShell内置的端口扫描器

[技术分享]手把手教你使用PowerShell内置的端口扫描器 引言 想做端口扫描,NMAP是理想的选择,但是有时候NMAP并不可用.有的时候仅仅是想看一下某个端口是否开放.在这些情况下,PowerShell确实能够大放异彩.接下来我们聊聊如何使用PowerShell实现基本的端口扫描功能. 本文中用到的PowerShell命令 PowerShell端口扫描器:针对单个IP的多个端口的扫描 1..1024 | % {echo ((new-object Net.Sockets.TcpClient)

MD5做为文件名。机器唯一码有电脑的CPU信息和MAC地址,这两个信息需要在linux或unix系统下才能获取吧。

可以采用机器(电脑)唯一码 + 上传IP + 当前时间戳 + GUID ( + 随机数),然后MD5做为文件名.机器唯一码有电脑的CPU信息和MAC地址,这两个信息需要在linux或unix系统下才能获取吧. //获取电脑的CPU信息function OnlyU(){        $a = '';        $b = array();        if(function_exists('exec')){                if(mailto:[email protected]

AF_UNIX域通信(基于socket和pipe的通信,只适于UNIX系统S&C同在一个主机上,用于进程通信)

服务器端: #include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include <sys/socket.h>#include <sys/un.h>#include <stddef.h>char buf[100];void main

如何在unix系统中用别的用户运行一个程序?

1.问题的缘由 实际开发系统的时候,经常需要用别的用户运行一个程序.比如,有些系统为保证系统安全,不允许使用root来运行.这里,我们总结了unix系统下如何解决这个问题的一些方法.同时,我们还讨论如何在python脚本里实现. 2.unix系统的方法 2.1.runuser runuser允许使用替代用户和组ID来运行命令.如果选项-u没有给出,则回退到su兼容的语义和shell被执行. runuser和su命令之间的区别在于runuser不要求输入密码(因为它可能仅由root用户执行),它使

Masscan:最快的互联网IP端口扫描器

Masscan:最快的互联网IP端口扫描器 Masscan号称是最快的互联网端口扫描器,最快可以在六分钟内扫遍互联网. masscan的扫描结果类似于nmap(一个很著名的端口扫描器),在内部,它更像scanrand, unicornscan, and ZMap,采用了异步传输的方式.它和这些扫描器最主要的区别是,它比这些扫描器更快.而且,masscan更加灵活,它允许自定义任意的地址范和端口范围. 安装配置 在Debian/Ubuntu系统中,安装方法如下: $ sudo apt-get in

用Python实现一个端口扫描,只需简单几步就好

一.常见端口扫描的原理 0.秘密扫描 秘密扫描是一种不被审计工具所检测的扫描技术. 它通常用于在通过普通的防火墙或路由器的筛选(filtering)时隐藏自己. 秘密扫描能躲避IDS.防火墙.包过滤器和日志审计,从而获取目标端口的开放或关闭的信息.由于没有包含TCP 3次握手协议的任何部分,所以无法被记录下来,比半连接扫描更为隐蔽. 但是这种扫描的缺点是扫描结果的不可靠性会增加,而且扫描主机也需要自己构造IP包.现有的秘密扫描有TCP FIN扫描.TCP ACK扫描.NULL扫描.XMAS扫描和

UNIX系统上的抓包工具tcpdump常用命令说明

tcpdump 介绍 tcpdump采用命令行方式对接口的数据包进行筛选抓取,其丰富特性表现在灵活的表达式上. 不带任何选项的tcpdump,默认会抓取第一个网络接口,且只有将tcpdump进程终止才会停止抓包. 例如: tcpdump - dump traffic on a network tcpdump是一个用于截取网络分组,并输出分组内容的工具.凭借强大的功能和灵活的截取策略,使其成为类UNIX系统下用于网络分析和问题排查的首选工具 tcpdump 支持针对网络层.协议.主机.网络或端口的