基于tcp的C++扫描器

大作业准备写一个C++扫描器,于是学习一些winsock的编程知识。

我理解最基本的基于tcp的扫描器原理也就是与端口三次握手,connect即为开放。端口扫描器分类如下:

1.开放扫描

会产生大量的审计数据,容易被对方发现,但其可靠性高;

ex:TCP Connect扫描(基于三次握手),TCP反向ident扫描

2.隐蔽扫描

能有效的避免对方入侵检测系统和防火墙的检测,但这种扫描使用的数据包在通过网络时容易被丢弃从而产生错误的探测信息;

ex:TCP FIN扫描,TCP Xmas扫描,TCP Null扫描,TCP ftp proxy扫描,分段扫描

3.半开放扫描

隐蔽性和可靠性介于前两者之间。

ex:TCP Syn扫描,TCP 间接扫描

syn原理:实现原理:扫描器向目标主机端口发送SYN包。如果应答是RST包,那么说明端口是关闭的;如果应答中包含SYN和ACK包,说明目标端口处于监听状态,再传送一个RST包给目标机从而停止建立连接。由于在SYN扫描时,全连接尚未建立,所以这种技术通常被称为半连接扫描

优点:隐蔽性较全连接扫描好,一般系统对这种半扫描很少记录

缺点:通常构造SYN数据包需要超级用户或者授权用户访问专门的系统调用

而tcp与udp最主要区别在于:基于连接与无连接;tcp扫描正确率高,udp扫描范围小,效率高,错误率高

技术太渣,只能尝试实现connect的开放扫描。学习积累的部分winsock知识点如下:

比较全面的基础概念:

http://blog.csdn.net/shihoongbo/article/details/51489875

1.Winsock五种类型的套接字I/O模型:select(选择)、WSAAsyncSelect(异步选择)、WSAEventSelect(事件选择)、overlapped(重叠)、以及completion port(完成端口)。

winsock五种基本套接字I/O(好吧实在繁琐,我也没怎么看,只看了看五个概念)

http://blog.csdn.net/windows_nt/article/details/39456323

2.select实现超时检测。

通俗点讲,select作用就是,防止在在阻塞模式的套接字里被锁死,避免在非阻塞套接字里重复检查

select详解,重点:五个参数作用

blog.csdn.net/inspiron_110/article/details/4764847

3.FD_SET作用:主要为存储socket句柄,用来在select中检测connect连接的可写性。

www.xuebuyuan.com/1206173.html

4.Sockaddr_in部分参数说明

https://baike.baidu.com/item/sockaddr_in/3917215

sockaddr_in常用转换函数说明

blog.csdn.net/joeblackzqq/article/details/8258693

5.开始时,WSAStartup函数加载套接字库结束时,调用WSACleanup解除与库的连接 WSA前缀部分函数使用

blog.csdn.net/clemontine/article/details/53141041

6.#pragma comment使用

blog.csdn.net/njuitjf/article/details/43235859
本地codeblocks报错,百度发现是缺少lib库,明明#pragma comment(lib,"ws2_32.lib")了,还是不行。最后编译设置里手工加上了。此处求大佬解答!

7.实现源码:(寥寥100行,就不上github了的)

#include <winsock2.h>
#include <winsock.h>
#include <iostream>
#include <stdio.h>
#include <sstream>
#include <time.h>
using namespace std;

#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"ws2_32")


int scan(char *Ip, int StartPort, int EndPort);


int main(int argc, char **argv)
{
    int ret;


    if (argc != 4)
    {
        printf("Usage: %s \n", argv[0]);
        exit(1);
    }


    ret = scan(argv[1], atoi(argv[2]), atoi(argv[3]));


    if (ret)
        printf("Scan OK\n");


    return 0;
}


int scan(char *Ip, int StartPort, int EndPort)
{
    clock_t StartTime, EndTime;
    float CostTime;


    TIMEVAL TimeOut;
    FD_SET mask;


    WSADATA wsa;
    SOCKET s;
    struct sockaddr_in server;


    int CurrPort;
    int ret;
    unsigned long mode = 1;  //ioctlsocket函数的最后一个参数


    WSAStartup(MAKEWORD(2, 2), &wsa);


    TimeOut.tv_sec = 0;
    TimeOut.tv_usec = 50;  //超时为50ms


    FD_ZERO(&mask);


    server.sin_family = AF_INET;
    server.sin_addr.s_addr = inet_addr(Ip);


    StartTime = clock();
    for (CurrPort = StartPort; CurrPort <= EndPort; CurrPort++)
    {
        s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        FD_SET(s, &mask);
        ioctlsocket(s, FIONBIO, &mode);  //设置为非阻塞模式


        server.sin_port = htons(CurrPort);
        connect(s, (struct sockaddr *)&server, sizeof(server));


        ret = select(0, NULL, &mask, NULL, &TimeOut);  //查询可写入状态


        if (0 == ret || -1 == ret)
        {
            closesocket(s);
        }
        else
        {
            printf("%s:%d\n", Ip, CurrPort);
            closesocket(s);
        }
    }
    EndTime = clock();
    CostTime = (float)(EndTime - StartTime) / CLOCKS_PER_SEC;
    printf("Cost time:%f second\n", CostTime);


    WSACleanup();


    return 1;
}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,552评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,666评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,519评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,180评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,205评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,344评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,781评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,449评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,635评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,467评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,515评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,217评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,775评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,851评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,084评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,637评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,204评论 2 341

推荐阅读更多精彩内容