基于IMD驱动ARP防火墙设计(windows平台)
基于 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平台)相关推荐
- 基于VC++包过滤技术防火墙设计与实现
目录 摘要 I Abstract II 目录 III 1 绪论 1 1.1 研究背景 1 1.2 研究意义 2 1.3 课题内容 3 2 包过滤防火墙技术 4 2.1 包过滤防火墙技术简介 4 2.2 ...
- 【技术分享】Windows平台低延迟RTMP、RTSP播放器接口设计探讨
背景 我们看过了太多介绍RTSP.RTMP播放相关的技术资料,大多接口设计简约,延迟和扩展能力也受到一定的局限,好多开发者希望我们能从接口设计的角度,大概介绍下大牛直播SDK关于RTMP.RTSP播放 ...
- c语言迷宫求解毕业设计,毕业设计(论文)-基于Windows平台C语言实现迷宫游戏的设计.doc...
基于Windows平台C语言实现迷宫游戏的设计 摘 要 随着科技的日益发展,计算机信息知识越来越被人们所认知和使用,在当今知识爆炸的时代计算机毫无疑问成为人们常用的日常工具,而Windows和C语言都 ...
- 基于arm-linux的防火墙设计,基于ARM9的Linux驱动开发及防火墙设计
摘要: 随着通信与信息科技.数字与IC设计技术在我们的日常生活及工作中的的迅猛普及,嵌入式系统设计正在成为现代信息技术中的主流技术.本文主要阐述了嵌入式Linux的概念.基础.网络结构.网络设备驱动程 ...
- asp毕业设计——基于asp+access的校园网上购物平台设计与实现(毕业论文+程序源码)——网上购物平台
基于asp+access的校园网上购物平台设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+access的校园网上购物平台设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦. ...
- 连接LilyPad之Windows平台的驱动
连接LilyPad之Windows平台的驱动 LilyPad和其他的Arduino控制板的不同之处是它是为电子织物和可穿戴设计的.那么,它的大小就必须要紧凑.所以,它并没有板载其他大多数板子都具有的U ...
- 基于C++控制台(Windows平台)的一个吃豆人小游戏
PacManX --南京大学2019秋季学期 "高级程序设计 "课程设计一 基于C++控制台(Windows平台)的一个吃豆人小游戏 已实现的目标: 地图支持自定义编辑(可编辑地图 ...
- 基于C++控制台(Windows平台)的一个植物大战僵尸小游戏
Plants Vs Zombies --南京大学2019秋季学期 "高级程序设计" 课程设计二 基于C++控制台(Windows平台)的一个植物大战僵尸小游戏 已实现的目标: 12 ...
- 基于Qt的Windows平台桌面蓝牙调试器软件
基于Qt的Windows平台桌面蓝牙调试器软件 在进行嵌入式的调试时,我们经常需要下位机给主机打印数据来观察数据变化.绘制波形等进行调试.一般的做法可以是直接通过串口与PC进行数据通信(USB to ...
最新文章
- 【人脸表情识别】不得不读的重要论文推荐(2015-2018篇)
- memcpy实例(一)
- android trace文件分析ANR
- Visual Studio 2015 update 3各版本下载地址
- iphone查看删除的短信_手机资讯:iPhone手机可以批量删除短信吗如何操作
- android10全局黑暗,传Android 11或加入自动切换全局黑暗模式功能
- 特殊表情存数据库处理
- 繁忙的都市(信息学奥赛一本通-T1392)
- inline-block是html5,详解CSS display:inline-block的应用
- 给 22 岁的自己六点建议
- dz搬家 win linux,Discuz论坛完美搬家 详细分享我的DZ搬家步骤
- js获取某一天的零点时刻和某天的23:59
- 【Gym 100015A】Another Rock-Paper-Scissors Problem
- 8.(高级)CSS形状之:菱形图片
- 贝壳DMP平台建设实践
- 手机上该怎么合并PDF?这个方法可不要错过
- 分享一下PPT常规使用方法和技巧
- c语言与编程语言的区别,C语言与其他编程语言的区别
- html5 mp3播放器源码,HTML5自定义mp3播放器源码
- 怎么用计算机给u盘加密文件,电脑如何使用bitlocker功能给u盘加密
热门文章
- Extract Semantic Structure from Documents Using Multimodal Fully Convolutional Neural Networks阅读笔记
- Dell SupportAssist软件功能介绍
- 求生之路linux和windows,《求生之路2》在Linux上运行快于Windows 7
- 全自动六轴飞叉绕线机
- grsm.qq.html,光荣使命手游邀请码免费分享 腾讯光荣使命最新邀请码真实有效
- 【经验分享】总结自己考了十次四六级才过的历程
- 表白弹药库 - 这是我为你写的散文诗(结尾附源码)
- ios--iTunes同步应用失败
- python xmind 包使用 (其中解决导出的xmind文件 xmind8可以打开 xmind2020及之后版本打开报错问题)
- ElasticSearch 基于 Term 的查询