首页
社区
课程
招聘
[原创]简单C语言扫描器源码
发表于: 2012-2-10 17:20 4272

[原创]简单C语言扫描器源码

2012-2-10 17:20
4272

#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直播授课

收藏
免费 6
支持
分享
最新回复 (2)
雪    币: 31
活跃值: (48)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
int main和int WinMain在c中有什么不同?难道用main表示是控制台程序?
2012-2-10 22:50
0
雪    币: 26
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
main是int __cdecl main
WinMain是int __stdcall WinMain

主要是启动代码中取命令行参数的方式不同所以有不同的启动代码。并没有什么重要的不同之处。
2012-2-11 02:48
0
游客
登录 | 注册 方可回帖
返回
//