VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 2596|回复: 1

[原创] 用Winpcap实现局域网IP扫描及SYN洪水

[复制链接]
001
27_avatar_middle
online_vip 发表于 2016-3-31 16:52:22 | 显示全部楼层 |阅读模式
本帖最后由 weskill 于 2016-4-2 17:52 编辑

多抽出一分钟时间来学习,让你的生命更加精彩。

感谢VC驿站提供这个平台。感谢SYC老师对我们的耐心指导。

本人最近在网上找了一些Winpcap的学习资料,研究了一下winpcap封包方法,整理如下:

首先,是搜索到黑剑的博客 — Winpcap系列文章,索引如下:

黑剑WInpcap

了解了Winpcap基本抓包封包知识后,需要下载Winpcap包,我下载的是4.0.1-WpdPack.zip
然后根据网上的教程配置好Winpcap项目属性:
用Winpcap实现局域网IP扫描及SYN洪水
等等。

//////////////////////////////////////////////////////////////////////////////////
// 备注:本篇文章来自 vc驿站:https://www.cctry.com/thread-263023-1-1.html
// C、C++、VC++ 各种学习资源,免费教程,期待您的加入!
//////////////////////////////////////////////////////////////////////////////////

基本思路如下:

(1)抓取及封装ARP数据包:

首先简单说明一下 环境是基于以太网,根据以太网封装格式

用Winpcap实现局域网IP扫描及SYN洪水

首先是 14个字节的以太网帧,一般为目的地Mac(6个字节),源MAC(6个字节) ,帧类型为ARP(0x0806)
然后是ARP包的数据,依次填入

struct arp_head
{
unsigned short hardware_type;    //硬件类型
unsigned short protocol_type;    //协议类型
unsigned char hardware_add_len; //硬件地址长度
unsigned char protocol_add_len; //协议地址长度
unsigned short operation_field; //操作字段
unsigned char source_mac_add[6]; //源mac地址
unsigned int source_ip_add;    //源ip地址 4位
unsigned char dest_mac_add[6]; //目的mac地址
unsigned int dest_ip_add;      //目的ip地址
};

然后 在不知道对方MAC地址,需要ARP广播的时候:

以太网帧目的地MAC 为0xffffffffffff  
arp_head的目的MAC 为0x000000000000
源IP为本机局域网IP,目的IP为目的IP(如路由器通常为192.168.1.1)等,然后读取回发的ARP包即可获得对方MAC地址。

ARP攻击一般分为

1)网关欺骗攻击,就是将源IP伪造成网关IP,源地址为本机或假冒地址,向固定的局域网IP及MAC不断发送ARP包的过程;
2)IP冲突攻击,就是将源IP伪造成局域网另一相同IP,源地址为本机或假冒地址,向网关IP及MAC不断发送ARP包的过程。


(2)封装TCP包与SYN洪水攻击思路
首先需要了解 TCP三次握手,分别是SYN,SYN/ACK及ACK
在这里我们只要正确封装好SYN包,然后发出即可。

首先,获取固定网址的IP,然后获取本机的MAC,网关及IP,假设路由器IP最后一位为1,则根据本机及网关推算出路由器的IP地址,然后通过
(1)中的ARP广播可以获得路由器的MAC地址。

以太网帧+IP头+TCP包:
1) 14个字节的以太网帧,一般为目的地Mac(6个字节)(这里涉及到局域网外,这个地址需用路由器的MAC地址,然后路由器将这个IP包转到上一级),源MAC(6个字节) ,帧类型为IP(0x0800)

2)IP头,也是一些固定的值,如IP头长,确认号,TTL等,然后源IP是本机IP,目的IP是网址IP
注意的是IP头校验和计算,将在最后介绍计算方法。

3)最后是TCP包,包括源端口(随机),目的端口(一般为80),sequence number(随机),ACK确认号及TCP校验码等。
TCP校验和需要加上伪首部再一起计算,将在最后介绍计算方法。

//////////////////////////////////////////////////////////////////////////////////
// 备注:本篇文章来自 vc驿站:https://www.cctry.com/thread-263023-1-1.html
// C、C++、VC++ 各种学习资源,免费教程,期待您的加入!
//////////////////////////////////////////////////////////////////////////////////

值得注意的是:

(1)多断点及使用Wireshark抓包,可以对照Wireshark的抓包数据,封装自己的包。
(2)源码中用的比较多是memset,一个个数据装填,没有像其他教程那样用结构体填写好后整个装填,因为担心出现结构体内存对齐空隙,造成包内数据错位。

主要部分代码已经上传,仅作学习及技术探讨之用,请不要用于非法用途,谢谢大家。


IP头与TCP校验和的计算方法:

当发送IP包时,需要计算IP报头的校验和:
1、  把校验和字段置为0;
2、  对IP头部中的每16bit进行二进制求和;
3、  如果和的高16bit不为0,则将和的高16bit和低16bit反复相加,直到和的高16bit为0,从而获得一个16bit的值;
4、  将该16bit的值取反,存入校验和字段。
◆当接收IP包时,需要对报头进行确认,检查IP头是否有误,算法同上2、3步,然后判断取反 的结果是否为0,是则正确,否则有错。

实例:
IP头:  
              45 00    00 31
              89 F5    00 00
              6E 06    00 00(校验字段)
              DE B7   45 5D       ->    222.183.69.93
              C0 A8   00 DC     ->    192.168.0.220
计算:   
    4500 + 0031 +89F5 + 0000 + 6e06+ 0000 + DEB7 + 455D + C0A8 + 00DC =3 22C4
    0003 + 22C4 = 22C7
     ~22C7 = DD38      ->即为应填充的校验和
当接受到IP数据包时,要检查IP头是否正确,则对IP头进行检验,方法同上:
计算:
    4500 + 0031 +89F5 + 0000 + 6E06+ DD38 + DEB7 + 455D + C0A8 + 00DC =3 FFFC
    0003 + FFFC = FFFF
     ~FFFF = 00000     ->正确
TCP首部检验和与IP首部校验和的计算方法相同,在程序中使用同一个函数来计算。

需要注意的是,由于TCP首部中不包含源地址与目标地址等信息,为了保证TCP校验的有效性,在进行TCP校验和的计算时,需要增加一个TCP伪首部的校验和。

IP头与TCP校验和的数学计算:

假如IP头有10个2Byte数据,分别为A1-A10,设A10为头校验和,则最初A10 = 0x0000。
则 A1+A2+A3....+A9 = 0x10000*B+C (0<=B<=9,0<=C<=0xffff)
因为对于任何的2Byte的An,都有 0<=An<0x10000;

则根据校验和计算:A10 = ~( A1+A2+A3....+A9)=0xffff - (B+C)

那么当收到IP包时,对IP头进行检验,计算:
A1+A2+......A10 =  0x10000*B +C +  0xffff - (B+C) =  0xffff *(1+B)

因为0<=B<=9,则1<=1+B<=10

有数学规律:99*2=198     99*3 = 297  99*4 = 396
则 0xffff *(1+B)  = (f-1-B)*0x10000 + 0xfff0 + (1+B)
求和  f-1-B + 0xfff0 + 1+B = 0xffff;

IP首部校验和计算正确。



//////////////////////////////////////////////////////////////////////////////////
// 备注:本篇文章来自 vc驿站:https://www.cctry.com/thread-263023-1-1.html
// C、C++、VC++ 各种学习资源,免费教程,期待您的加入!
//////////////////////////////////////////////////////////////////////////////////

最后模拟发了25个SYN握手包:
用Winpcap实现局域网IP扫描及SYN洪水

SYNFLOOD.rar

6.69 KB, 下载次数: 37, 下载积分: 驿站币 -1





上一篇:大家来看看这段驱动代码为什么不能读取DXF游戏的内存
下一篇:MFC对话框的窗口实现 窗口分割
01_avatar_middle
在线会员 发表于 2016-3-31 17:11:11 | 显示全部楼层
可以,不错的demo
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-7-22 10:14

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表