-
-
[原创]简单C语言扫描器源码
-
发表于:
2012-2-10 17:20
4275
-
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
//本源码由Willix独家提供......
void Help()
{
printf("使用方法(qq:515984350):\n dos中输入:scan 127.0.0.1 135 445\n");
}
int main(int argc,char* argv[])
{
//申明变量
WORD wVersion = MAKEWORD(2,0); //socket的版本
WSADATA wsaData;
//sockaddr_in结构
struct sockaddr_in sin;
int iFromPort; //开始端口
int iToPort; //结束端口
int iNowPort; //正在扫描的端口
char* cHost; //要扫描的主机
SOCKET s; //保存创建socket时返回的值
int iOpenPort; //开放端口的个数
iOpenPort=0;
//如果命令行下参数不是4个(包括程序本身),提示正确的用法
if(argc != 4)
{
//printf("参数的错误\n");
Help();
return -1;
}
//保存用户输入的要扫面的开始端口和结束端口
//由于用户输入的是char型,所以要转换成int型号
iFromPort = atoi(argv[2]);
iToPort = atoi(argv[3]);
cHost = argv[1];
//对用户输入的端口进行判断
if(iFromPort>iToPort || iFromPort<0 || iFromPort>65535 || iToPort<0 || iToPort>65535)
{
printf("错误的端口号\n");
return 0;
}
if(WSAStartup(wVersion,&wsaData))
{
printf("初始化失败\n");
return -1;
}
printf("==========================开始扫描==============================\n");
//循环连接端口,判断端口是否开放
for(iNowPort = iFromPort;iNowPort <= iToPort;iNowPort++)
{
s=socket(AF_INET,SOCK_STREAM,0);
if(s == INVALID_SOCKET)
{
printf("创建socket失败\n");
WSACleanup();
}
//给结构成员赋值
sin.sin_family = AF_INET;
sin.sin_port = htons(iNowPort);
sin.sin_addr.S_un.S_addr = inet_addr(cHost);
//建立连接
if(connect(s,(struct sockaddr*)&sin,sizeof(sin)) == SOCKET_ERROR)
{
printf("%s->%d:未开放\n",cHost,iNowPort);
closesocket(s);
}
else
{
printf("%s->%d开放\n",cHost,iNowPort);
iOpenPort++;
closesocket(s);
}
}
printf("==========================结束扫描==============================\n");
printf("主机:%s扫描到%d个端口开放",cHost,iOpenPort);
//关闭socket
closesocket(s);
WSACleanup();
return 0;
}
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课