H2003031282_基于半打开的端口扫描技术的实现_第1页
H2003031282_基于半打开的端口扫描技术的实现_第2页
H2003031282_基于半打开的端口扫描技术的实现_第3页
H2003031282_基于半打开的端口扫描技术的实现_第4页
H2003031282_基于半打开的端口扫描技术的实现_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于半打开的端口扫描技术的实现 摘 要 随着互联网的飞速发展,网络入侵行为日益严重,网络安全日益成为人们关 注的焦点。端口扫描技术是网络安全扫描技术的重要技术之一。对目标系统进行 端口扫描,是网络系统入侵者进入目标系统的第一步。本文对端口扫描技术的原 理和应用进行了阐述,并设计了一个简单的基于windows平台上的端口扫描系统。 在论文中介绍了半打开扫描中的SYN探测技术,分析了这种扫描技术实现的原理 和特点。实际设计中采用了扫描安全性和可行性较好的SYN探测技术来实现端口 扫描,并实现了端口列表自定义,扫描结果存储等几大模块化功能。最后结合当 前的实际情况对端口扫描的未来发展方向提出了一点个

2、人的看法。 关键词:网络安全;端口扫描;SYN 探测 The Implementation of a Port-scanning Program Based on Semi-opened Port Technology Abstract With the quick development of the internet, network intrusion behavior becomes more and more serious; Network security becomes the focus which people pay attention to. Port-Scanning

3、 Technology is one of the most important technologies of the safe scanning on internet. The first step that network system intruders enter the target system is the port scanning of the system. This essay explains the principle and application of the port scanning technology, and then designs a simpl

4、e port-scan system which bases on the Windows platform. The paper introduces the SYN probe technology of the semi-open scan technologies, analyzes its implementing principle, approach and characters. In the real design it use the SYN probe technology which has a better scanning security and feasibil

5、ity to achieve the Port Scanning, then realize user-defined port list function, recording of the scanning result, and some other functional modules. At last, combined with the nowadays actual situation, the paper brings a few personal minds for the future direction of the development of the Port-Sca

6、nning. Key words: Network security;Port scanning;SYN probe 目 录 论文总页数:22 页 引言 . 1 1.1 端口扫描概述 . 1 1.2 端口扫描技术的国内外研究现状. 1 1.3 端口扫描原理 . 1 1.4 端口扫描技术概要 . 2 1.5 SYN 技术详解 . 3 1.5.1 TCP 包探测原理 . 3 1.5.2 SYN 包探测 . 4 1.5.3 分组时延 . 4 1.6 端口扫描实现方法 . 4 需求分析 . 4 2.1 端口扫描器的总体要求. 4 2.1.1 设计背景 . 4 2.1.2 用户特点 . 4 2.1.3

7、软件开发及运行环境. 5 2.2 端口扫描器的需求分析. 5 端口扫描器的实现 . 5 3.1 功能模块简介 . 5 3.2 程序实现流程 . 6 3.3 SYN 探测的实现 . 6 3.4 端口扫描功能模块 . 15 3.4.1 端口选择模块 . 15 3.4.2 目标 IP 选取模块. 16 3.4.3 终止扫描 . 17 3.4.4 扫描结果存储模块. 17 测试环境及结果 . 18 4.1 硬件环境 . 18 4.2 软件环境 . 18 4.3 测试结果 . 18 端口扫描技术的发展方向和趋势. 19 论 . 19 1 2 3 4 5 结 参考文献 . 20 致 声 谢 . 21 明

8、. 22 1 引言 1.1 端口扫描概述 网络安全探测在网络安全中起着主动防御的作用,占有非常重要的地位。 网络安全探测的所有功能都是建立在端口扫描的基础上,所以对端口扫描技术 的研究有着非常重要的现实意义。 每一个网络主机都相当于一个"房间",黑客能否进入"房间",取决于是否 发现了打开的"门窗"。也就是说,能否入侵网络主机,或者网络主机是否安全, 关键在于能否查出网络主机的系统信息。而端口是主机与外界通讯交流的数据 出入口,即是"门窗"。端口分为硬件端口和软件端口,所谓硬件端口又称为接 口,包括:USB 端口、

9、串行端口、并行端口等。软件端口一般指网络中面向连 接服务(TCP)和无连接服务(UDP)的通讯协议的端口。一个端口就是一个潜在的 通信通道,也就是一个入侵通道。对目标计算机进行端口扫描,能得到许多有 用的信息。通过端口扫描,发现系统的安全漏洞。它使系统用户了解系统目前 向外界提供了哪些服务,从而为系统用户管理网络提供了一种手段。 1.2 端口扫描技术的国内外研究现状 网络的安全状况取决于网络中最薄弱的环节,任何疏忽都可能引入不安全 的因素,最有效的方法是定期对网络系统进行安全性分析,及时发现并修正存 在的脆弱性,保证系统的安全。 国外安全扫描技术的历史可以追溯到 20 世纪 90 年代,当时因

10、特网刚刚起 步,但是在过去的十多年内,扫描技术飞速发展,迄今为止,其扫描技术己经 非常完善,但是在全面性、隐蔽性和智能性上还有待提高。而安全扫描器从最 初专门为 UNIX 系统而编写的一些只有简单功能的小程序发展到现在,己经出 现了可以运行在多个操作系统平台上的、具有复杂功能的系统程序。 国内的扫描技术是在国外扫描器基础上发展起来的。其中有些专门从事安 全技术的公司包括绿盟科技、启明星辰等等。这些公司的扫描器以硬件为主, 其特点是执行速度快,不像软件一样受到安装主机系统性能的限制。 然而对于更多的基于主机的端口扫描器而言,简单、实用、可靠才是它们 的长处。 1.3 端口扫描原理 端口扫描通常指

11、用同一个信息对目标主机的所有需要扫描的端口进行发送 探测数据包即扫描,然后,根据返回端口的状态来分析目标主机端口是否打开, 是否可用。端口扫描通过与目标主机的 TCP/IP 端口建立连接并请求某些服务, 记录目标主机的应答,收集目标主机相关信息,从而发现目标主机某些内在的 第 页 共 22 页 1 安全弱点,并且确定该端口什么服务正在进行并获取该服务的信息。端口扫描 也可以通过捕获本地主机或服务器的流入流出 IP 数据包来监视本地主机的运 行情况,它仅能对接收到的数据进行分析,帮助我们发现目标主机的某些内在 的弱点,而不会提供进入一个系统的详细步骤。 1.4 端口扫描技术概要 端口扫描途径主要

12、是扫描器。扫描器是一种自动检测远程或本地主机安全 性弱点的程序,通过使用扫描器可以不留痕迹的发现远程服务器的各种 TCP 端 口的分配及提供的服务和它们的软件版本。这就能让我们间接的或直观的了解 到远程主机所存在的安全问题。 扫描器通过选用远程 TCP/IP 不同的端口的服务,并记录目标给予的回答, 通过这种方法,可以搜集到很多关于目标主机的各种有用的信息。扫描器有三 项功能:发现一个主机或网络的能力;一旦发现一台主机,有发现什么服务正 运行在这台主机上的能力;通过测试这些服务,发现漏洞的能力。 为了理解扫描以及它的工作原理,首先应对 TCP 的三次握手机制有所了解。 TCP 的报头包含一个序

13、列号和一些起着特殊作用的标记位。这里仅提到其中的 四个标记位:SYN(同步),ACK(确认),RST(复位)和 FIN(完成)。它们四个的作 用与这里讨论的主题密切相关。 当系统间建立连接和释放连接时,就会用到所谓的握手机制。本文中所提 到的连接均指的是发生在两个 IP 地址间,有一定的端口号的连接。 它的工作原理大致如下:握手的第一步,一台计算机首先请求和另外一台 计算机建立连接,它通过发送一个 SYN 请求来完成,也即前面提到的 SYN 标 记位置位。两台计算机间每条信息都有一个由发送方产生的序列号,序列号的 使用使得双方知道他们之间是同步的,而且还可以起到丢失信息时或接收顺序 错误时发送

14、警告信息的作用。 握手的第二步,接收到 SYN 请求的计算机响应发送来的序列号,它会将 ACK 标记位置位,同时它也提供自己的序列号。到现在为止,发起连接建立请 求的计算机认为连接已经建立起来,然而对方却并不这样认为,对方还要等到 它自己的序列号有了应答后才能确认连接建立起来。因此现在的状态称为"半连 接"。如果发起连接请求的计算机不对收到的序列号做出应答,那么这个连接就 永远也建立不起来,而正因为没有建立连接,所以系统也不会对这次连接做任 何记录。 握手的第三步,发起连接请求的计算机对收到的序列号作出应答,这样, 两台计算机之间的连接才算建立起来。 两台计算机释放连接时的

15、情况与此类似:当一台计算机说没有更多的数据 第 页 共 22 页 2 需要发送了,它发送一个 FIN 信号(将 FIN 标记位置位)通知另一端,接收到 FIN 的另一端计算机可能发送完了数据,也可能没发送完,但它会对此作出应答, 而当它真正完成所有需要发送的数据后,它会再发送一个自己的 FIN 信号,等 对方对此作出应答后,连接才彻底解除。 1.5 SYN 技术详解 1.5.1 TCP 包探测原理 高效的探测方法需要解决 3 个问题:(1)用几个包判断主机和端口状态;(2) 占用双方的资源少;(3)准确的分组时延计算方法。如果不建立完整的 TCP 连接, 直接用 TCP 包来检测 TCP 应用

16、服务端口的状态,会有效地提高探测效率和准 确性。对于问题(1)和(2),可以借鉴 TCP 端口扫描技术,发送特殊 TCP 包解决。 对于问题(3),可以在仿照 Ping 的方式在 TCP 某些字段或选项中嵌入时间戳来 解决。 TCP 端口扫描技术通过发送一些特殊的 TCP 包判断目标主机和端口状态。 端口扫描通过扫描目标主机的大量端口,发现系统的漏洞。而服务器的地址和 端口一般都是公开的,如果只探测服务器的工作端口,不用探测其余的端口, 可以向工作端口发送特殊的 TCP 包,根据返回包判断目标状态。绝大多数 TCP/IP 协议栈的实现遵循以下原则: (1)当一个 SYN 或者 FIN 数据包到

17、达一个关闭的端口,TCP 丢弃数据包同 时发送一个 RST 数据包。 (2)当一个包含 ACK 的数据包到达一个监听端口时,数据包被丢弃,同时 发送一个 RST 数据包。 (3)当一个 SYN 数据包到达一个监听端口时,正常的三阶段握手继续,回 答一个 SYN|ACK 数据包。 (4)当一个 FIN 数据包到达一个监听端口时,数据包被丢弃。"FIN 行为"(关 闭的端口返回 RST,监听端口丢弃包),在 URG 和 PSH 标志位置位时同样要发 生。所有的 URG,PSH 和 FIN,或者没有任何标记的 TCP 数据包都会引起"FIN 行为"。一般 TC

18、P 端口扫描根据以上方式的发包收包来判断主机与端口状态。 因为 FIN 包不能直接探测监听端口,所以通常选择使用 SYN 包或 ACK 包探测 监听端口。一些防火墙出于安全的考虑,将发现和拦截 ACK 与 FIN 探测包, 但不会拦截 SYN 包。通过网络上别人的一些测试和实验发现,对 Internet 中发 布的 60 个 HTTP 代理服务器进行探测。其中,97%的服务器对 SYN 包有应答, 只有 53%的服务器对 ACK 包有应答。实验发现对 SYN 包无应答的主机对任何 TCP 包都无应答。无论服务器有什么样的安全处理规则,根据方式(1)(2),SYN 请求都会得到应答,所以选择 S

19、YN 包作为探测包。 第 页 共 22 页 3 1.5.2 SYN 包探测 第一步:客户端向服务器的工作端口发送 SYN,服务器返回 SYN|ACK 包 或 RST 包。如果客户端收到 SYN|ACK,则可以肯定服务器活动和端口开启。 收到 RST 包,则说明服务器活动但端口关闭,客户端不用执行第二步。如果超 时无应答,则认为包丢失。 第二步:因为不需要建立正常的 TCP 连接,所以对应答 ACK 包的服务器 发送 RST 包,保证服务器端关闭半连接。因为只有少量报文对端口探测,不会 引起安全系统的报警。使用 SYN 包探测,可以检测服务器和端口的状态、分组 时延、丢包率,又可以穿透防火墙,符

20、合网络对安全的要求。 1.5.3 分组时延 假如用定时器来计算分组往返的时间,大量的定时器会造成资源极大消耗。 虽然 TCP 协议规定了时间戳选项(类型 8),用该选项中嵌入时间戳,服务器返 回包的选项部分含有发送的时间戳。然而,在具体 TCP/IP 协议实现中,有些 TCP/IP 协议栈会忽略该选项,或者选项值置 0,无法得到往返时间。如果能像 Ping 一样保证某一字段的数据在往返中不改变,就可以像 Ping 一样嵌入时间戳。 但 TCP 的各字段不能保证往返数据一致。可以考虑用一种变通的方式嵌入时间 戳。对于客户机发送的 SYN 报文,设序号 x,则服务主机返回报文的确认序号 等于 x+

21、1。利用发送序号和确认序号的关系来传递时间戳。设置 SYN 包的发送 序号为时间戳,收到的 SYN|ACK 包或 RST 包的确认序号减 1 即可得到发送包 的时间戳。用收到包的时间减去发送时间戳即得到分组时延。 1.6 端口扫描实现方法 本文通过对基于半打开的端口扫描技术的实现来介绍了现在一些主流的端 口扫描技术,通过对程序的开发加深了对端口扫描技术的认识。经过对端口扫 描技术的了解和认识,本文采用隐蔽性较好基于主机的 SYN 刺探技术来实现。 2 需求分析 2.1 端口扫描器的总体要求 2.1.1 设计背景 该端口扫描器是面向普通用户使用,以期成为一个普通用户用来检测端口 网络主机端口并有

22、效地保护自己。在采用 SYN 刺探方式进行扫描的基础上成为 一个基于半打开的实用、简单、方便的端口扫描工具。 2.1.2 用户特点 由于该端口扫描系统是一个基于半打开的端口扫描器,其面向的是普通的 对于端口扫描有需求的用户,因此需要提供一个简洁、方便、高效的界面和功 第 页 共 22 页 4 能。 2.1.3 软件开发及运行环境 系统开发工具:Visual C+ 6.0 2.2 端口扫描器的需求分析 端口扫描器的一般需求: (1)隐蔽性需求 作为扫描的一方来说,端口扫描除了要能扫出目标主机的端口信息以外, 还需要能有一定的隐蔽性,以最大的可能不在目标主机留下访问信息。如果仍 然采用基于 TCP

23、 connect()的扫描则将很容易被目标主机记录,因此从隐蔽性上 考虑 SYN 半打开扫描或者 FIN 扫描会是很好的选择。 (2)端口选择需求 当我们在使用扫描软件对目标主机进行扫描的时候,有的时候是有目的性 地扫描目标主机的某一个端口,然而在大部分时候却需要扫描批量端口或者是 一些重要的指定端口。这个时候需要端口扫描系统具有自定义端口列表的功能。 (3)扫描结果存储需求 在进行完一次端口扫描之后,需要对结果进行保存。无论是攻击还是检测, 端口扫描器是需要与其他的一些工具配合到一起使用的,所以要求端口扫描器 一定要具有存储结果的功能,以将扫描得到的目标主机端口信息保存下来。 3 端口扫描器

24、的实现 3.1 功能模块简介 所完成的端口扫描器的界面如图 1 所示,相关功能介绍如下: 图1 端口扫描器功能界面 目标 IP 范围选择模块:选择起始 IP 和结束 IP 以确定目标 IP 的范围。 第 页 共 22 页 5 端口范围选择模块:自定义起始端口和结束端口以确定扫描范围。 扫描结果存储模块:自定义扫描结果的显示方式,或将扫描结果保存下来。 自定义默认端口列表模块:对默认的重要端口进行添加或删除以更符合扫 描需要。 3.2 程序实现流程 程序实现的流程如图 2 所示: 开始 Scanstart 主函数 填充本地 IP 列 读取 IP 和端口 本地 IP? 否 是 获得扫描结果 获得扫

25、描结果 保存扫描结果 保存扫描结果 结束 结束 图2 程序实现流程图 主函数首先创建一个侦听线程以准备获得返回信息。然后调用 FillLocalIP 函数将本地 IP 写入 IP 列表中,接着读取要扫描的 IP 和端口,判断是否是本地 IP,若是则调用函数 scanlocal 对本地 IP 和端口发起连接并获得扫描结果;如果 不是本地 IP 就调用 scan 函数对远程 IP 发送 SYN 包,并通过创建的套接字 rawsock 得到从系统中返回的信息,分析数据后得到扫描结果。最后将扫描的结 果插入结果树中排序并可保存为文本文件。 3.3 SYN 探测的实现 定义了一个线程体 ScanStar

26、t 调用其他的函数来实现端口扫描。 (1)DWORD WINAPI ScanStart(LPVOID lpvoid) 第 页 共 22 页 6 CDWordArray& CPortList = *lpPortList; /为侦听线程分配句柄空间 *handle = (HANDLE*)malloc(sizeof(HANDLE)*(numadapter-1); /为 LocalIP 分配空间 *lpLocalIP= (ULONG*)malloc(sizeof(ULONG)*numadapter); HANDLE* hListen=*handle; /创建侦听线程 每块网卡绑定一个线程 wh

27、ile (InforL.num >=0) hListenInforL.num=CreateThread(NULL,0,ListeningFunc,&InforL,NUL L,NULL); /创建一个嗅包的线程,分析接收到的包。 if ( hListenInforL.num = NULL ) AfxMessageBox("创建侦听线程失败!"); Sleep(500); InforL.num-; /Sleep 0.5s.使 ListeningFunc 线程初始化完毕. pProGressCtrl->SetRange32(0,(EndIP-StartIP+1

28、)*CPortList.GetSize(); / 设置显示扫描进度条的大小 / Fill LocalIP FillLocalIPList(*lpLocalIP);/获取本地网卡的 IP /这是为了实现监听功能,接受返回的数据包 DWORD* lpLIP = *lpLocalIP; IPANDPORT lpInfor=0; lpInfor.hTree=lpTreeCtrl; int all=0; int k=1; int TEMP=StartIP; 在对 IP 范围是否符合规则进行判断以后,将端口列表中的端口信息循环读 入到 lpInfor.PORT 中,为即将开始的扫描做准备。 for (St

29、artIP <= EndIP ; StartIP+) /从第一个 IP 到最后一个 IP 第 页 共 22 页 7 lpInfor.NETIP=htonl(StartIP); int Num= CPortList.GetSize(); for ( int i=0 ; i<Num ; i+) /结束线程 if ( ! :OK ) CPortList.RemoveAll(); return 0; /清空端口列表 lpInfor.PORT=(USHORT)CPortListi; if ( k % 300 = 0 ) /等待监听线程 WaitForMultipleObjects(numad

30、apter-1,hListen,FALSE,DelayTime); k=1; else k+; 对本地 IP 和目标(非本地)IP 的扫描方式是不同的,所以这里需要对获取 的 IP 地址和本地 IP 地址作比较,通过函数 IsLocalIP 来实现。 if ( IsLocalIP(lpInfor.NETIP, lpLIP,numadapter) ) scanlocal(&lpInfor); /对本地 IP 进行扫描 else scan(&lpInfor); /对目标 IP,端口发送 SYN 包. all+; pProGressCtrl->SetPos(all); (2)扫

31、描程序在开始的时候将 LocalIPlist 中的 IP 与 scanIP 对比,判断待扫描 的 IP 是否是本地 IP。因为在程序中对目标 IP 和本地 IP 的扫描方式是不一样的, 第 页 共 22 页 8 所以需要在这里作出一个判断。 BOOL IsLocalIP(ULONG scanIP, ULONG* LocalIPlist, int num) for (int i=0; i<num ; i+) if (scanIP = LocalIPlisti) return TRUE; return FALSE; 图 3 SYN 扫描连接示意图 如图 3 所示,在半打开扫描技术中,扫描主机

32、自动向目标计算机的指定端 口发送 SYN 数据段,表示发送建立连接请求。如果目标计算机的回应 TCP 报 文中 SYN=1,ACK=1,则说明该端口是活动的,接着扫描主机传送一个 RST 给目标主机拒绝建立 TCP 连接,从而导致三次握手过程的失败。如果目标计算 机的回应是 RST,则表示该端口为"死端口",这种情况下,扫描主机不用做任 何回应。由于扫描过程中,全连接尚未建立,所以大大降低了被目标计算机的 记录的可能,并且加快了扫描的速度。 (3)在对目标 IP 进行端口扫描的时候,一方面要考虑到在扫描的时候在目标 主机上留下较少的扫描记录,另一方面要能在较小的权限下对目标

33、进行扫描。 所以使用发送 TCP SYN 包的方式来对目标进行扫描。 DWORD WINAPI scan(LPVOID lp) SOCKET sock=NULL; SOCKADDR_IN addr_in=0; 第 页 共 22 页 9 IPANDPORT* lpInfor=(IPANDPORT*)lp; /设置 IP 地址属性 USHORT port=lpInfor->PORT; /设置扫描的端口 addr_in.sin_family=AF_INET; addr_in.sin_port=htons(port); addr_in.sin_addr.S_un.S_addr=lpInfor-&

34、gt;NETIP; /设置 IP 地址 int ULONG iErr; ul=1; if(sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)=INVALI D_SOCKET) AfxMessageBox("Socket Setup Error!n"); /大多数扫描技术要发送原始套接字包来进行探测。因为只有原始套接字 支持对 IP 报头的设置,即构造 IP 数据包。同时,原始套接字也支持发送和接 收 IP 数据包。这样,原始套接字接口实际上成为网络层向上提供的接口。 iErr=ioctlsocket(sock,FIONBIO,(unsi

35、gned long*)&ul); /设置 sock 为非阻 塞 if(iErr=SOCKET_ERROR ) /等待错误信息 AfxMessageBox("set socket FIONBIO falsen"); 在 Windows XP 中,程序使用原始套接字构造和发送 SYN 包。TCP/IP 协议 栈中不会记录该连接请求,所以对于服务器端返回的 SYN|ACK 包,TCP/IP 协 议栈会自动发送 RST,不用在程序中实现 SYN 探测的第二步。 connect(sock,(struct sockaddr *)&addr_in,sizeof(addr_

36、in); /发送 SYN 包 /在发送完 SYN 包以后立即关闭 SOCK 连接,因为程序无法直接收到返 回的信息,返回的数据是到达系统核心,然后通过嗅探抓包的方式获得目标主 机返回信息。 closesocket(sock); return 0; 第 10 页 共 22 页 (4)接着调用 scanlocal 函数对本地 IP 进行扫描,由于对本地 IP 扫描的时候 不需要考虑到扫描的安全性,即不用担心扫描的时候被主机留下扫描记录。另 外一方面,对本地主机扫描的时候就不需要从监听的网卡上抓取返回的包,直 接设置等待连接成功后的信息既方便又快速。所以在扫描本地主机的时候不用 发送 SYN 包。

37、DWORD WINAPI scanlocal(LPVOID lp) SOCKET sock=NULL; SOCKADDR_IN addr_in=0; TCHAR SendBuf256=0;/设置缓冲变量 IPANDPORT* lpInfor=(IPANDPORT*)lp; USHORT port=lpInfor->PORT; CTreeCtrl* hTree=lpInfor->hTree; *省略部分代码* if(sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)=INVALID_S OCKET) /建立 socket 的链接对象 fd_set

38、 r,w; /设置 sock 为非阻塞 iErr=ioctlsocket(sock,FIONBIO,(unsignedlong*)&ul); if(iErr=SOCKET_ERROR ) printf("set socket FIONBIO falsen"); /套接字连接,以对本地 IP 端口进行扫描 connect(sock,(struct sockaddr *)&addr_in,sizeof(addr_in); 在向本地 IP 发起建立连接后,设置 iErr=select(0, &r, &w, 0, &timeout) 等待接受

39、数据和同步函数。如果连接不成功则将返回错误信息,连接成功则将 收到的数据插入结果树中。 if(iErr!=SOCKET_ERROR) && (iErr!=0) /连接成功后返回连接信息 第 11 页 共 22 页 *省略部分代码* /连接成功则将收到的数据插入结果树中 InsertToTree (hTree,strIP,CSPort); closesocket(sock); return 1; (5)原始套接字包发送完后,就可以接收目标主机的回应。当发送原始套接 字包时(如 TCP SYN 数据包),操作系统核心并不知道,也没有此数据发送或者 连接建立的记录。因此,当远端主机回

40、应时,系统核心就把这些包都全部丢掉, 从而到达不了应用程序上。所以,程序中不能简单地使用接收函数来接收这些 数据包。要达到接收数据包的目的,必须采用嗅探,接收所有通过的数据包, 然后进行筛选,留下符合需要的。为此可以表示接收所有的数据。通过设置原 始套接字的 I/0 控制命令,便可以调用 SIO_RCVALL 接收返回的数据包,分析 是不是扫描程序返回的。 DWORD WINAPI ListeningFunc(LPVOID lpvoid) /定义套接字 rawsock,以连接应用程序和监听的本地网卡 SOCKET rawsock; int settimeout = 500; SOCKADDR_

41、IN addr_in=0; INFORLISTEN* lp =(INFORLISTEN*)lpvoid; int num = lp->num; *省略部分代码* if(rawsock=socket(AF_INET,SOCK_RAW,IPPROTO_IP)=INVALID_SO CKET) /建立原始 IPPROTO_IP 套接字 AfxMessageBox("Socket Setup Error!n"); return false; addr_in.sin_family=AF_INET; 构造 SYN 包,最好选用较大的端口号作为发送端口,以免和应用程序正在 使用的端

42、口发生冲突。在这里我们选用的是 8288。另外在构造 TCP 头的时候, 第 12 页 共 22 页 还添加了 TCP 选项 SACK,保证 TCP 连接请求被接受。 addr_in.sin_port=htons(8288); /设置接收的端口为 8288 addr_in.sin_addr.S_un.S_addr=htonl(INADDR_ANY); /监听所有的本地 IP 地址 /对 rawsock 绑定本机 IP 和端口,当系统收到目标的返回信息时,便 可以通过 rawsock 传到应用程序当中。 int ret=bind(rawsock, (struct sockaddr *)&

43、addr_in, sizeof(addr_in); if(ret=SOCKET_ERROR) AfxMessageBox("bind false"); 程序使用两次判断来过滤 IP 包。 首先判断 IP 头部,要求目的地址是本机、协议号是 TCP 协议。然后再判 断 TCP头部,要求目的端口等于选用端口号,控制标志位为 SYN|ACK或者 RST。 因为监听套接字会接收到所有的 IP 包,要保证能尽快处理分组,如图 4 所示。 图4 返回 IP 包的接收及过滤 设置 SIO_RCVALL,包括延时和数据大小等信息,以接收所有的数据包。 在收到返回信息的时候接受并分析数据包是

44、否为应用程序返回的信息。 setsockopt(rawsock,SOL_SOCKET,SO_RCVTIMEO, (char *)&settimeout, sizeof(int); DWORD lpvBuffer = 1; DWORD lpcbBytesReturned = 0; /设置一个套接口的模式,接受所有数据 WSAIoctl(rawsock, SIO_RCVALL, &lpvBuffer, sizeof(lpvBuffer), NULL, 0, &lpcbBytesReturned, NULL, NULL); *省略部分代码* char RecvBuf256=0; /接收数据包 第 13 页 共 22 页 ret=recvfrom(rawsock,RecvBuf,sizeof(RecvBuf),0,(struct sockaddr*)&from,&am

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论