当前位置:  编程技术>c/c++/嵌入式

C实现的非阻塞方式命令行端口扫描器源码

    来源: 互联网  发布时间:2014-10-26

    本文导语:  该实例是一个C实现的基于命令行模式端口扫描代码,并且是以非阻塞方式来实现对IP和端口的连接测试。为了大家使用和学习方便,已在代码中尽可能多的地方加入了注释,相信对于帮助大家理解C端口扫描有很大帮助。 具体...

该实例是一个C实现的基于命令行模式端口扫描代码,并且是以非阻塞方式来实现对IP和端口的连接测试。为了大家使用和学习方便,已在代码中尽可能多的地方加入了注释,相信对于帮助大家理解C端口扫描有很大帮助。

具体功能代码如下:

#include 
#include 
// 编译时需使用的库
#pragma comment(lib,"wsock32.lib")
// select()成员定义
#define ZERO (fd_set *)0
// 变量定义
int maxth, scanok, scannum;
int portip, hoststart, hoststop, startport, endport; //定义了开始I和结束P地址,开始和结束端口
long searchnum, searched;
void usage(char *); // 定义显示使用方法函数
void playx(int); // 定义状态提示函数
void setip2(char *); // 定义设置IP函数
void customport(char *, char *, char *); // 定义自定义扫描端口函数
void portscannow(int); // 定义端口扫描扫描
int main(int argc, char *argv[])
{
WSADATA wsadata;
// 清屏
system("cls.exe");
// 显示版本信息
printf("rn============== 命令行端口扫描器 PortScanner V1.0 ==============");
// 检查输入
if ((argc < 3) || (argc > 4))
{
// 显示帮助提示
usage(argv[0]);
return -1;
}
// 检测是否为port扫描
if(!(stricmp(strlwr(argv[1]), "-p") == 0))
{
usage(argv[0]);
return -1;
}
// 程序初始化
if (WSAStartup(MAKEWORD(1,1), &wsadata) != 0) //如果初始化错误
{
printf("rnWsatartup error");      //出错信息
return -1;
}
// 端口扫描参数转换
// 如果参数为三个
if (argc == 3)
{
// 直接设置IP
setip2(argv[2]);
}
// 如果参数为四个
else
if (argc == 4)
{
// 进入定制端口扫描处理
customport(argv[0], argv[2], argv[3]);
}
// 参数过多显示帮助
else
{
usage(argv[0]);
return -1;
}
// 扫描端口开始
portscannow(argc);
WSACleanup();
return 0;
}
// 帮助提示函数
void usage(char * prog)
{
printf("Usage: %s ", prog);
printf("rnn :");
printf("rn -p [ Port|StartPort-EndPort ] < HostName|IP|StartIP-EndIP >");
printf("rnn Example: ");
printf("rn %s -p 192.168.0.1", prog);
printf("rn %s -p 192.168.0.1-192.168.0.254", prog);
printf("rn %s -p 21-80 192.168.0.1", prog);
printf("rn %s -p 21-80 192.168.0.1-192.168.0.254rn", prog);
return;
}
// 进度提示
void playx(int play = 0)
{
// 进度条
char *plays[12]=
{
" | ",
" / ",
" - ",
" \ ",
" | ",
" / ",
" - ",
" \ ",
" | ",
" / ",
" - ",
" \ ",
};
if (searchnum != 0)
{
for (int i = 0 ; i  15 && strlen(cp) < 32)
{
// 提取出结束IP
endip = strchr(cp, '-') + 1;
// 提取出开始IP
strncpy(startip, cp, strlen(cp) - strlen(strchr(cp, '-')));
// 给控制要扫描IP段的变量赋值
hoststart = ntohl(inet_addr(startip));
hoststop = ntohl(inet_addr(endip));
}
else
{
// 取得输入的主机地址
testhost = gethostbyname(startip);

// 如果地址不存在
if(!testhost)
{
 WSACleanup( );
 printf("rnCan't get ip of: %s", cp);
 exit(-1);
}
// 给控制要扫描IP段的变量赋值
memcpy(&host, testhost->h_addr, 4);
hoststop = hoststart = ntohl(host);
}
}
// 测试线程是否已满
void TestThread(int thread = 200)
{
for (;;)
{
playx();
// 测试线程是否已满
if (maxth > thread)
 Sleep(100);
else break;
}
return;
}
// 等待线程结束函数
void WaitThreadEnd()
{
// 延时
Sleep(6000);
// 显示等待提示
printf("r   rn");
printf(" Wait ( %d )Thread end...rn", maxth);
for(;;)
{
// 判断所有线程是否已经结束
if (maxth > 0)
{
 // 延时等待线程序结束
 Sleep(100);
 playx();
 continue;
}
else break;
}
printf("rn");
return;
}
// 定制端口扫描参数
void customport(char *cp, char *cp2, char *cp3)
{
int intport;
char *checker;
// 处理要扫描的端口
// 扫描开始端口变量赋值
startport = atoi(cp2);
// 扫描结束端口变量赋值
endport = atoi(cp2);
// 判断是否 21-80 形式
if (strstr(cp2,"-"))
{
intport = atoi(checker = strchr(cp2, '-') + 1);
if (intport > 0 && intport < 65536)
 // 扫描结束端口变量赋值
 endport = intport;
}
// 端口大小判断
if (startport < 0 || startport > 65536 || endport < 0 || endport > 65535)
{
usage(cp);
exit(-1);
}
// 处理ip地址
setip2(cp3);
}
// 端口扫描函数
UINT portscan(LPVOID port)
{
int addr = portip; // 取得要扫描的地址
int sock;
struct fd_set mask;
struct timeval timeout;
struct sockaddr_in server;
unsigned long flag = 1;
// 创建一个sock
sock = socket(AF_INET, SOCK_STREAM, 0);
// 创建sock失败处理
if (sock == INVALID_SOCKET)
{
printf("rnSock Error:%s", WSAGetLastError());
maxth --;
return -1;
}
// 给sock成员赋值
server.sin_family=AF_INET;
server.sin_addr.s_addr = htonl(addr); // 要扫描的地址
server.sin_port = htons(short(port)); // 要扫描的端口
// 显示进度
playx();
// 调用ioctlsocket()设置套接字为非阻塞模式
if (ioctlsocket(sock, FIONBIO, &flag) != 0)
{
// 设置失败处理
printf("rnSock Error:%s", WSAGetLastError());
closesocket(sock);
maxth --;
return -1;
}
// 调用connect()连接远程主机端口
connect(sock, (struct sockaddr*)&server, sizeof(server));
timeout.tv_sec = 18; // 超时限制为18秒
timeout.tv_usec = 0;
FD_ZERO(&mask); // 清空集合mask
FD_SET(sock, &mask); // 将sock放入集合mask中

// 用select() 处理扫描结果
switch(select(sock + 1, ZERO, &mask, ZERO, &timeout))
{
case -1:
{
 printf("rnSelect() error");
 maxth --;
 return -1;
}
// sock超时处理
case 0:
{
 maxth --;
 closesocket(sock);
 return -1;
}
default:
if(FD_ISSET(sock, &mask))
{
 // 禁止sock发送和接受数据
 shutdown(sock, 0);
 // 设置输出结果格式
 printf(" [Found:] %s Port: %d open.rn", inet_ntoa(server.sin_addr), ntohs(server.sin_port));
 // 关闭sock
 closesocket(sock);
 scanok ++;
 maxth --;
 return 1;
}
}
return 0;
}
// 扫描开始主函数
void portscannow(int xp)
{
int sport;
char *timenow, timebuf[32];
// 默认扫描的端口
char *ports[32]={
"21",
"22",
"23",
"25",
"53",
"79",
"80",
"110",
"111",
"113",
"123",
"135",
"139",
"143",
"443",
"512",
"513",
"514",
"515",
"540",
"1080",
"1433",
"1521",
"1524",
"3306",
"3389",
"5631",
"6000",
"6112",
"8000",
"8080",
"12345"//这里你也可以自己要扫描的端口
};
// 显示扫描开始的时间
timenow = _strtime(timebuf);
printf("rnPortScan Start Time: %srnn",timenow);
// 计数器初始化.
maxth = 0;
scanok = 0;
scannum = 0;
searched = 0;
// 计算要扫描的端口数量
searchnum = hoststop - hoststart +1;
if(xp == 3)
searchnum = searchnum * 32;
if(xp == 4)
searchnum = searchnum * (endport - startport +1);
// 端口扫描开始
for (portip = hoststart; portip  11) i = 0;
// 默认端口扫描
// scan 192.168.0.1
// scan 192.168.0.1-192.168.0.254
if (xp == 3)
{
 for (sport = 0; sport < 32; sport ++, maxth ++, searched ++)
 {
 // 测试当前线程是否大于180
 TestThread(180);
 // 产生新的线程处理端口扫描
 CWinThread * pthread = AfxBeginThread(portscan,LPVOID(atoi((char*)ports[sport])));
 //延时
 Sleep(120);
 }
}
// 自端口扫描
// scan -p 21 192.168.0.1
// scan -p 21-80 192.168.0.1-192.168.0.254
if (xp == 4)
{ // 计算要扫描的端口
 sport = endport - startport;
 if(sport > 500 )
 {
 // 扫描自的端口
 for(sport = startport; sport 

    
 
 

您可能感兴趣的文章:

  • 基于C#实现的端口扫描器实例代码
  • select如何实现发送的阻塞和解除阻塞?
  • 如何实现一次非阻塞的串口写?
  • 请教大家:有关阻塞模式的实现
  • stdio和read/write,缓冲区写满时阻塞的实现机制是什么
  • 哪位为高手能解释一下 NIO(非阻塞的IO)的实现原理?谢谢!
  • 我需要一个模型,在 LINUX C 下。实现线程间的控制,执行,阻塞,再执行。。。。。不知道如何实现。
  • unix环境高级编程 第十章十九节sleep函数实现为什么要先阻塞SIGALRM?
  • 如何实现异步非阻塞io.
  • python实现AutoResetEvent类的阻塞模式方法解析
  • 如何使用shell脚本实现监控程序消息队列阻塞情况?
  • linux下怎么实现等待一个标志位为1前,一直睡眠(阻塞)
  • 初学管道实现时的阻塞问题~
  • 互斥锁和信号量,能不能实现先阻塞先唤醒,顺序获取互斥锁和信号量
  • 非阻塞connect实现端口扫描的问题-connect提前返回怎么处理?
  • 如何用命名管道(FIFO)实现非阻塞模式进程间通讯(IPC)?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux下的Socket通信如何断开连接的端口从而实现重复使用该端口
  • windows 下的PortTunnel 在linux下怎么实现?或者相应的已经实现的软件?端口映射
  • 求教用一个端口能否实现3G视频传输
  • 在linux下能实现多端口映射吗?
  • 怎样编程实现I/O端口的读写?
  • 怎样在TURBO LINUX下实现静态端口映射
  • bind9架设内部dns+硬件防火墙端口映射,不能实现域名解析
  • 在一个socket守护服务进程中,如何实现同时监听两个端口?
  • python判断端口是否打开的实现代码
  • 一般的tcpip实现都会提供ftp,telnet,daytime,以及time等基本服务,linux上提供13端口的daytime服务吗?
  • 我想在服务器端口获得连结上来机子的IP,不知道有什么方法可以实现!!!?
  • 使用python实现扫描端口示例
  • 求助!如何使用同一个套接字和端口实现反复下载
  • 关于使用iptables实现udp端口的nat的问题
  • shell脚本结合iptables防端口扫描的实现
  • Python实现根据指定端口探测服务器/模块部署的方法
  • python实现数通设备端口监控示例
  • Python实现端口复用实例代码
  • 通过javascript实现DIV居中,兼容各浏览器版本
  • socket实现多文件并发传输,求助多线程实现问题?
  • Python GUI编程:tkinter实现一个窗口并居中代码
  • interface 到底有什么用???实现接口,怎么实现??
  • 通过javascript库JQuery实现页面跳转功能代码
  • 怎么用Jsp实现在页面实现树型结构?
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • 网站重定向用C语言实现iptables,ACL实现
  • php实现socket实现客户端和服务端数据通信源代码
  • 在linux下如何编程实现nslookup命令实现的IP地址和域名互相转换的功能?
  • flash AS3反射实现(describeType和getDefinitionByName)
  • 求在freebsd+Squid下实现pc上网的透明代理的实现方法!给出具体配置方法的高分谢!
  • boost unordered_map和std::list相结合的实现LRU算法




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3