基于 IMD 驱动 ARP 防火墙设计 (windows 平台 )

IMD 驱动认识

当 IMD 注册的时候,会同时注册协议和端口,他们分别代码着 protocol_block,miniport_block

而 protocol_block 中的 bindinghanle 代码着 IMD 协议驱动和下层 nic 的绑定关系。 Bindinghanle 其实是一个 open_block 结构,里面存有下层 nic 的回调,例如 send 函数,而 miniport_block 结构中则存有上层协议驱动中回调函数,例如 receive,, 所以调用 indicatereceive (miniport_block,xxx ) 时其实就是调用这个结构中的 receive 函数。当然,如果只有一个 IMD 的话,而且上层协议是 tcp/ip 的话,这个 receive 函数就应该是在 tcpip.sys 中实现,所以按我的理解就是上层 tcpip.sys 对应的 open_block 结构中就有 imd 驱动的 miniport 注册的回调。总体先可以这样理解,因为 WINDOWS 下,还有个 NDIS 。 SYS 驱动协同管理的,挺复杂的,我用 WINDBG 看了下,上面对应的结构中的一些回调函数的地址是 NDIS 。 SYS 空间。

其中 passthru 中的 adapter 结构中的 bindingt 和 minporthandle 和上面的 open_block , miniport_block 分别对应

这鸟玩意资料少,只能暂时做此理解。

程序分为应用层和驱动层 :应用层主要是一个 dll ,负责发送过滤控制码和接收数据过滤警报,驱动层主要是负责判断数据的合法性,然后向应用层发送通知

防火墙主要功能分为三块 :

1.  防止本机被欺骗(接收错误的网关 MAC )

2.  防止 IP 冲突

3.  防止本机在网关的 MAC 记录被窜改

具体代码实现:

1.  防止本机被欺骗最重要的是判断出发送方的 ip 为网关时,识别出对应的数据包中的 MAC 是否为网关 MAC

以下代码为判断接收数据的部分实现了功能 1 和 2 。在 passthru 驱动的 receivepacket 中调用

注意,正确网关无法百分百确定,这是 ARP 协议本身的不足,我当时判断的是发送几个 ARP 询问包,如果这些包都有回应,并 MAC 都一致,则就是正确的网关 MAC ,否则无法判断,只能警告用户,让用户确定。

代码部分来源网络,做过修改 :

/

其中正确网关来源于应用层的通知,采用共享内存机制

RAS_OPT

CheckPacketRecvOpt (

ARP_PACKET                     *ArpPacket

)

{

enum RAS_OPT           RetOpt     = OPT_PASS;

ULONG z=0;

if( ArpPacket ->OperateCode != ARP_QUERY &&

ArpPacket ->OperateCode ! = ARP_REPLY &&

ArpPacket ->OperateCode ! = 0x300 &&

ArpPacket ->OperateCode ! = 0x400 )

{

KdPrint ((" 错误 ARP/RARP 协议攻击 /r/n"));

RetOpt = OPT_DROP;

g_pAttacterInfo ->attType =WrongARP ;

goto WrongARPprotocol ;

}

if ((RetOpt =BlackListFilter (ArpPacket ))==OPT_DROP)

{

g_pAttacterInfo ->attType =BLACKLIST;

goto WrongARPprotocol ;

}

//

// 查询时候的判断,是否有人假冒网关来问我 IP

if (ArpPacket ->OperateCode == ARP_QUERY )

{

//     KdPrint (("[R0] 接收到 QUERY 包 /r/n"));

if (!NdisEqualMemory (ArpPacket ->SourceMacAddress,ArpPacket ->SrcAddr,6))

{

KdPrint ((" 发送方的 MAC 头 source macAddr 和 ARP 的 source macAddr 不同 /r/n"));

RetOpt = OPT_DROP;

g_pAttacterInfo ->attType =fakeGetway ;

goto Exit;

}

//IP 是网关 IP ,而 MAC 不是网关的

if( NdisEqualMemory (ArpPacket ->SourceIPAddress,g_pIpInfo ->GetWay_IPAddress,4)  &&

!NdisEqualMemory (ArpPacket ->SourceMacAddress,g_pIpInfo ->GetWay_MacAddress,6)  )

{

// 如果当前网关的 MAC 是空的,则通过

if (NdisEqualMemory (g_pIpInfo ->GetWay_IPAddress,Empty_MacAddress,6))

{

RetOpt = OPT_PASS;

goto Exit;

}

// IP 地址相同 ,Mac 地址不同 ( 禁止该包往上通行 )

KdPrint ((" 伪造网关 Query 攻击报文 /r/n"));

g_pAttacterInfo ->attType =fakeGetway ;

RetOpt = OPT_DROP;

goto Exit;

}

}

//

// 接收到 ARP_REPLY 时候,需要检测是否有人假冒网关回答我

if (ArpPacket ->OperateCode == ARP_REPLY )

{

//     KdPrint (("[R0] 接收到 ARP_REPLY 包 /r/n"));

if (!NdisEqualMemory (ArpPacket ->SourceMacAddress,ArpPacket ->SrcAddr,6))

{

KdPrint ((" 发送方的 MAC 头 source macAddr 和 ARP 的 source macAddr 不同 /r/n"));

RetOpt = OPT_DROP;

g_pAttacterInfo ->attType =fakeGetway ;

goto Exit;

}

if( NdisEqualMemory (ArpPacket ->SourceIPAddress,g_pIpInfo ->GetWay_IPAddress,4)  &&

!NdisEqualMemory (ArpPacket ->SourceMacAddress,g_pIpInfo ->GetWay_MacAddress,6)  )

{

// 发送方的 IP 地址相同 ,Mac 地址不同 ( 禁止该包往上通行 )

KdPrint ((" 伪造网关 Query 攻击报文 /r/n"));

RetOpt = OPT_DROP;

g_pAttacterInfo ->attType =fakeGetway ;

goto Exit;

}

if( NdisEqualMemory (ArpPacket ->SourceIPAddress,g_pIpInfo ->Local_IPAddress,4) &&

!NdisEqualMemory (ArpPacket ->SourceMacAddress,g_pIpInfo ->Local_MacAddress,6) )

{

KdPrint ((" 伪造内网间 IP 冲突攻击报文 /r/n"));

g_pAttacterInfo ->attType =Ipconflict ;

RetOpt = OPT_DROP;

goto Exit;

}

}

Exit:

// 测试的时候,一开始网关的 MAC 还全是 0 ,所以这种情况一律通过 ,

// 同时检测下如果是网关 IP 给我发数据的话,把他的 MAC 保存起来,以后就用这个 MAC 做为标准了。

if (NdisEqualMemory (g_pIpInfo ->GetWay_MacAddress,Empty_MacAddress,6))

{

KdPrint (("[R0] 发现初始化的网卡 MAC 地址是空的 /r/n"));

if (NdisEqualMemory (ArpPacket ->SourceIPAddress,g_pIpInfo ->GetWay_IPAddress,4))

{

KdPrint (("[R0] 收集到一个网关 MAC 地址,以后就是这个为标准 /r/n"));

NdisMoveMemory ( g_pIpInfo ->GetWay_MacAddress,ArpPacket ->SrcAddr,sizeof (g_pIpInfo ->GetWay_MacAddress ));

}

RetOpt = OPT_PASS;

}

WrongARPprotocol :

if (RetOpt ==OPT_DROP)

{

// 把攻击者的 IP 记录到共享内存块中

NdisMoveMemory ( g_pAttacterInfo->Attacter_IPAddress,ArpPacket->SourceIPAddress,sizeof(g_pAttacterInfo ->Attacter_IPAddress ));

}

return RetOpt ;

}

/

2.  防止本机 MAC 在网关中的记录被窜改

这个一般在网上攻击叫做什么踢对方出局域网

这玩意原理是攻击者假装成被攻击者不停发一个 ARP 应答包给网关,网关接收到这个应答包不分真假就把自身的 ARP 表更新,导致被攻击者发给网关信息后,网关无法回复到被攻击者机器,因为那个 ARP 包中的 MAC 地址是假的。

防御方法就只能主动出击了,这也就是一般 ARP 防火墙中提到的主动防御。具体原理就是不停的发送一个正确的 ARP 包给网关,相信这时候也可以看出,我们的防御是在和攻击者在竞赛了。

原理如果看不懂的话,再来个例子:

例如路由器是一个公司的总部,攻击者和被攻击者都是这个公司的员工。

平时员工和总部通信都是通过寄信件来通信。既然寄信件的话就要有物理地址。例如广东省

正常情况下,员工都自觉去告诉公司自己的具体位置,例如 “我在广东”,“我在广西”。这样公司发信件就在于知道怎么发了,可是如果有个员工使坏,员工 A 假冒 B 告诉公司,“我在江苏”,而事实上, B 是在黑龙江省,这时候公司不分真假,当公司要给 B 发信件的时候就发到了江苏去,那自己 B 就收不到信件了。收不到那就断网了。。。。。。

编写难点:

驱动这鸟东西真恐怖。函数调用要注意 IRQL ,内存分布不分布的。不符合就蓝你没商量。嘿嘿

例如刚开始写的时候就知道驱动容易蓝了,所以就想把数据获取之后放到应用层来判断,谁知驱动层的接收函数 IRQL 过高,不能花时间等应用层判断。蓝了好几回,放弃

就拿我主动防御这块来说吧。我一开始的设计思路就是在驱动层开个线程,里面主要的代码就是

Waitfor 一个事件,然后就 ndissend 发送 ARP 数据包。可是我发现蓝了。现在搞得我都忘记是不是线程的 IRQL 不对。后来还是改成用 writefile 的 IOCTL 里面实现。

G 还有报警功能,当截取到非法数据的时候一般要通知应用层。这里也蓝了好多。哈。小心。反正我发现不能在 receivepacket 函数里面 setevent .

还有,调用 ndissend 代码时参数用到的 miniporthandle 我是直接到 mpsend 里面获取,哈。正常人写的都是用 adapter 表里面找

基于IMD驱动ARP防火墙设计(windows平台)相关推荐

  1. 基于VC++包过滤技术防火墙设计与实现

    目录 摘要 I Abstract II 目录 III 1 绪论 1 1.1 研究背景 1 1.2 研究意义 2 1.3 课题内容 3 2 包过滤防火墙技术 4 2.1 包过滤防火墙技术简介 4 2.2 ...

  2. 【技术分享】Windows平台低延迟RTMP、RTSP播放器接口设计探讨

    背景 我们看过了太多介绍RTSP.RTMP播放相关的技术资料,大多接口设计简约,延迟和扩展能力也受到一定的局限,好多开发者希望我们能从接口设计的角度,大概介绍下大牛直播SDK关于RTMP.RTSP播放 ...

  3. c语言迷宫求解毕业设计,毕业设计(论文)-基于Windows平台C语言实现迷宫游戏的设计.doc...

    基于Windows平台C语言实现迷宫游戏的设计 摘 要 随着科技的日益发展,计算机信息知识越来越被人们所认知和使用,在当今知识爆炸的时代计算机毫无疑问成为人们常用的日常工具,而Windows和C语言都 ...

  4. 基于arm-linux的防火墙设计,基于ARM9的Linux驱动开发及防火墙设计

    摘要: 随着通信与信息科技.数字与IC设计技术在我们的日常生活及工作中的的迅猛普及,嵌入式系统设计正在成为现代信息技术中的主流技术.本文主要阐述了嵌入式Linux的概念.基础.网络结构.网络设备驱动程 ...

  5. asp毕业设计——基于asp+access的校园网上购物平台设计与实现(毕业论文+程序源码)——网上购物平台

    基于asp+access的校园网上购物平台设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+access的校园网上购物平台设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦. ...

  6. 连接LilyPad之Windows平台的驱动

    连接LilyPad之Windows平台的驱动 LilyPad和其他的Arduino控制板的不同之处是它是为电子织物和可穿戴设计的.那么,它的大小就必须要紧凑.所以,它并没有板载其他大多数板子都具有的U ...

  7. 基于C++控制台(Windows平台)的一个吃豆人小游戏

    PacManX --南京大学2019秋季学期 "高级程序设计 "课程设计一 基于C++控制台(Windows平台)的一个吃豆人小游戏 已实现的目标: 地图支持自定义编辑(可编辑地图 ...

  8. 基于C++控制台(Windows平台)的一个植物大战僵尸小游戏

    Plants Vs Zombies --南京大学2019秋季学期 "高级程序设计" 课程设计二 基于C++控制台(Windows平台)的一个植物大战僵尸小游戏 已实现的目标: 12 ...

  9. 基于Qt的Windows平台桌面蓝牙调试器软件

    基于Qt的Windows平台桌面蓝牙调试器软件 在进行嵌入式的调试时,我们经常需要下位机给主机打印数据来观察数据变化.绘制波形等进行调试.一般的做法可以是直接通过串口与PC进行数据通信(USB to ...

最新文章

  1. 【人脸表情识别】不得不读的重要论文推荐(2015-2018篇)
  2. memcpy实例(一)
  3. android trace文件分析ANR
  4. Visual Studio 2015 update 3各版本下载地址
  5. iphone查看删除的短信_手机资讯:iPhone手机可以批量删除短信吗如何操作
  6. android10全局黑暗,传Android 11或加入自动切换全局黑暗模式功能
  7. 特殊表情存数据库处理
  8. 繁忙的都市(信息学奥赛一本通-T1392)
  9. inline-block是html5,详解CSS display:inline-block的应用
  10. 给 22 岁的自己六点建议
  11. dz搬家 win linux,Discuz论坛完美搬家 详细分享我的DZ搬家步骤
  12. js获取某一天的零点时刻和某天的23:59
  13. 【Gym 100015A】Another Rock-Paper-Scissors Problem
  14. 8.(高级)CSS形状之:菱形图片
  15. 贝壳DMP平台建设实践
  16. 手机上该怎么合并PDF?这个方法可不要错过
  17. 分享一下PPT常规使用方法和技巧
  18. c语言与编程语言的区别,C语言与其他编程语言的区别
  19. html5 mp3播放器源码,HTML5自定义mp3播放器源码
  20. 怎么用计算机给u盘加密文件,电脑如何使用bitlocker功能给u盘加密

热门文章

  1. Extract Semantic Structure from Documents Using Multimodal Fully Convolutional Neural Networks阅读笔记
  2. Dell SupportAssist软件功能介绍
  3. 求生之路linux和windows,《求生之路2》在Linux上运行快于Windows 7
  4. 全自动六轴飞叉绕线机
  5. grsm.qq.html,光荣使命手游邀请码免费分享 腾讯光荣使命最新邀请码真实有效
  6. 【经验分享】总结自己考了十次四六级才过的历程
  7. 表白弹药库 - 这是我为你写的散文诗(结尾附源码)
  8. ios--iTunes同步应用失败
  9. python xmind 包使用 (其中解决导出的xmind文件 xmind8可以打开 xmind2020及之后版本打开报错问题)
  10. ElasticSearch 基于 Term 的查询