单个端口信息抓取

通过判断连接返回的套接字信息来判断端口是否开放,然后抓取端口对应的信息。

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>using namespace std;void port_open(char *, int);int main(int argc, char *argv[])
{port_open("192.168.3.132", atoi(argv[1]));return 0;
}void port_open(char * addr, int port){int socketClient;socketClient = socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in addrSrv;memset(&addrSrv, 0 , sizeof(addrSrv));addrSrv.sin_family = AF_INET;addrSrv.sin_addr.s_addr = inet_addr(addr);addrSrv.sin_port = htons(port);cout << "-----scaning---port: " << port << endl;if(connect(socketClient, (struct sockaddr*) & addrSrv, sizeof(addrSrv)) == -1){cout << "[-] " << port << " closed!" << endl;}else{cout << "[+] " << port << " open!" << endl;int end_index;char message[65536];end_index = recv(socketClient, message, 65536, 0);cout << end_index << endl;if(end_index == -1)cout << "read failed!" << endl;else{message[end_index] = '\0';cout << message << endl;}}close(socketClient);
}

多个端口单线程扫描

  • 通过getopt和switch来解析命令行参数,此处提供了三个参数,分别时主机地址、开始端口、结束端口。开始端口和结束端口都有对应的默认值。
  • 考虑了一下异常的影响。
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <pthread.h>
#include <exception>using namespace std;char addr[30];void port_scan(int);
void order_port_scan(int, int);int main(int argc, char **argv){int start_port=1, end_port=1000;int opt;const char *optstring = "a:s:e:";while((opt = getopt(argc, argv, optstring)) != -1){switch(opt){case 'a':strcpy(addr, argv[optind-1]);break;case 's':start_port = atoi(argv[optind-1]);break;case 'e':end_port = atoi(argv[optind-1]);break;default:cout << "parameter error" << endl;exit(0);}}if(addr == nullptr)cout << "address is not supplyed!" << endl;cout << "*********** Scanning " << addr << " from port " << start_port << " to port " << end_port << " *************************"<<endl;order_port_scan(start_port, end_port);return 0;
}void order_port_scan(int start_port, int end_port){ for(int port=start_port; port <= end_port; port++)port_scan(port);
}
void port_scan(int port){int socketClient;struct sockaddr_in addrSrv;try{socketClient = socket(AF_INET, SOCK_STREAM, 0);memset(&addrSrv, 0, sizeof(addrSrv));addrSrv.sin_family = AF_INET;addrSrv.sin_addr.s_addr = inet_addr(addr);addrSrv.sin_port = htons(port);if(connect(socketClient, (struct sockaddr*) &addrSrv, sizeof(addrSrv)) >= 0){cout << "[+] " << port << " open! " << endl; }else{cout << "[-] " << port << " closed! " << endl; }}catch(exception e){cout << "error!" << endl;}close(socketClient);
}

多端口多线程实现

  • 多线程中加入静态互斥锁,可以通过-p参数指定线程数,但是建议的线程数不要太大,不能超过100,因为此处定义的线程数组大小为100。
  • linux下sleep函数的单位时是秒,可以通过usleep来指定更短的时间。
  • 在编程实现的过程中考虑线程数的多少,而不是一共有多少个要扫描的端口。
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <pthread.h>
#include <exception>using namespace std;pthread_mutex_t mutex_x=PTHREAD_MUTEX_INITIALIZER;
char addr[30];
struct threadPort{int thread_port;
};void * port_scan(void *threadarg);int main(int argc, char **argv){int start_port=1, end_port=1000;int thread_num = 5;int opt;const char *optstring = "a:s:e:p:";struct threadPort tp[100];int time_thread = 10000;pthread_t threads[100];int thread_id;int id = 0;int rc;while((opt = getopt(argc, argv, optstring)) != -1){switch(opt){case 'a':strcpy(addr, argv[optind-1]);break;case 's':start_port = atoi(argv[optind-1]);break;case 'e':end_port = atoi(argv[optind-1]);break;case 'p':thread_num = atoi(argv[optind-1]);break;default:cout << "parameter error" << endl;exit(0);}}if(addr == nullptr)cout << "address is not supplyed!" << endl;cout << thread_num << endl;cout << "*********** Scanning " << addr << " from port " << start_port << " to port " << end_port << " *************************"<<endl;for(int port=start_port; port <= end_port; port++, id++){thread_id = id % thread_num;tp[thread_id].thread_port = port;rc = pthread_create(&threads[thread_id], NULL, port_scan, &tp[thread_id]);if(rc){cout << "Error, return code from pthread_create() is "<< rc << endl;exit(-1);}usleep(time_thread);}pthread_exit(NULL);return 0;
}void * port_scan(void *threadarg){ // 注意函数的原型要这么定义pthread_mutex_lock(&mutex_x);struct threadPort * data = (struct threadPort *) threadarg;int port = data->thread_port;int socketClient;struct sockaddr_in addrSrv;try{socketClient = socket(AF_INET, SOCK_STREAM, 0);memset(&addrSrv, 0, sizeof(addrSrv));addrSrv.sin_family = AF_INET;addrSrv.sin_addr.s_addr = inet_addr(addr);addrSrv.sin_port = htons(port);if(connect(socketClient, (struct sockaddr*) &addrSrv, sizeof(addrSrv)) >= 0){cout << "[+] " << port << " open! " << endl; }else{cout << "[-] " << port << " closed! " << endl; }}catch(exception e){cout << "error!" << endl;}close(socketClient);pthread_mutex_unlock(&mutex_x);pthread_exit(NULL);return NULL;
}
#编译命令
g++ simple_pthread_port_scan.cpp -o simple_pthread_port_scan -lpthread
#执行命令
./simple_pthread_port_scan -a 192.168.3.132 -p 20 -s 20 -e 100

C++实现端口扫描器相关推荐

  1. python写端口扫描器_使用Python编写简单的端口扫描器的实例分享

    #!/usr/bin/env python import socket if __name__=='__main__': port=3389 s=socket.socket() for cnt in ...

  2. 端口扫描器——ZenmapKail Linux渗透测

    3.3  端口扫描器--Zenmap Zenmap(端口扫描器)是一个开放源代码的网络探测和安全审核的工具.它是Nmap安全扫描工具的图形界面前端,它可以支持跨平台.使用Zenmap工具可以快速地扫描 ...

  3. 3. Port scanners (端口扫描器 4个)

    3. Port scanners (端口扫描器 4个) 愤怒的IP扫描器是一个小的开源Java应用程序,它执行主机发现("ping扫描")和端口扫描. 旧的2.x版本只有Windo ...

  4. Python3实现TCP端口扫描器

    本文来自 高海峰对 玄魂工作室 的投稿 作者:高海峰 QQ:543589796 在渗透测试的初步阶段通常我们都需要对攻击目标进行信息搜集,而端口扫描就是信息搜集中至关重要的一个步骤.通过端口扫描我们可 ...

  5. 实例探究Python以并发方式编写高性能端口扫描器的方法

    来源:http://www.jb51.net/article/86615.htm 关于端口扫描器 端口扫描工具(Port Scanner)指用于探测服务器或主机开放端口情况的工具.常被计算机管理员用于 ...

  6. 蓝蛇端口扫描器 v2.8.4.724

    简介: 蓝蛇端口扫描器--一款快速.专业.灵活.好用的端口扫描软件,蓝蛇端口扫描器是在原有v1.0的基础上升级打造而成.它不仅具备原有的面向IP扫描功能,还实现了面向端口扫描.此外,开放原有的端口字典 ...

  7. python调用扫描仪_使用Python编写简单的端口扫描器的实例分享

    单线程实现单线程实现道理比较简单,这里尝试Soket连接3389,连接成功说明端口开放,否则说明没有开远程服务.随便修改了一下就ok了,代码如下,最终得到自己的IP地址. #!/usr/bin/env ...

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

    简易端口扫描器 在比较早以前,我用过S扫描器, 以及大名鼎鼎的nmap扫描器, 可以快速扫描某个主机开放的端口, 今天使用C实现这样一个软件, 编译环境为Mac, 系统版本10.11.6: #incl ...

  9. 使用python-nmap 搭建基本端口扫描器

    代码地址如下: http://www.demodashi.com/demo/13255.html 一.前言 注意: 本文相关教程仅供个人学习使用,切勿用于非法用途,否则造成的相关损失及影响,作者不承担 ...

  10. 小小黑客之路(一)——端口扫描器

    在之前了解过黑客,曾经在网易上写过一篇关于黑客的文章--<黑客初识>,由于各种原因没有继续学习去,由于前几天的机房讲课,又激起我那不安的心,故找到一本<小小黑客之路>进行学习. ...

最新文章

  1. 获取人口_Human Terrain——世界人口三维可视化
  2. 关于Redis缓存,这3个问题一定要知道!
  3. 最新视觉Transformer综述(2017-2020年)
  4. 简单的mysql热备
  5. java mp4 视频时间戳_MP4文件中音视频时间戳的计算
  6. BZOJ 3527: [ZJOI2014]力(FFT)
  7. 从壹开始前后端分离【 .NETCore2.1 +Vue 2 +AOP+DI】框架之一 || 前言
  8. 访问者模式(Visitor)
  9. linux yum libsasl2,CentOS8 yum 凡是安装 安装mysql +需要:libsasl2.so.2()(64bit)
  10. Phaser开源2d引擎 html5游戏框架中文简介
  11. php去掉 部分字符,输出,php如何去除某个字符
  12. 在Gutsy安装Freewins插件手记
  13. java ognl表达式_OGNL表达式基本语法与用法详解
  14. I18N和L10N测试工具
  15. pg数据库的基本操作
  16. 正定矩阵与半正定矩阵
  17. Linux 普通用户su root 权限的开启和禁止
  18. 和生活一起理解51单片机② 先利其器,开箱51单片机开发板
  19. Shaolin(map)
  20. 计组知识点总结 指令系统

热门文章

  1. 追本溯源,回归根本:第一届区块链技术及应用峰会(BTA)·中国“区块链核心技术”分论坛预告大放送...
  2. 我和你,不是影子一样的朋友,只在光明的日子里相随
  3. android画布橡皮,Android绘图实现橡皮擦功能
  4. 海马玩模拟器离线安装包下载方法
  5. 光盘在服务器上装系统,如何通过DELL引导光盘在戴尔11G服务器上安装Win2003操作系统?.docx...
  6. JavaScript中的break
  7. png转ico 或如何制作ico文件
  8. PNG图片怎么转成ICO?分享两种思路
  9. 微信小程序-仿智行火车票12306
  10. 【绝知此事要躬行】线性表之链表OJ(上)