阅读:2087回复:12
防火墙应用程序与驱动程序交互的问题
对于是否发送未决的包我想交于应用程序提示用户是否通过,将包信息存于链表中,等待应用程序读取了这些信息后将向驱动程序回写一个是否通过的信息,本打算用KeWaitForSingleObject()等待应用程序的提示信息,但阅读DDK开发文档说明,在DISPATCH_LEVEL等待时间只能为零,也就是说我仍然需要循环读取是否通过的信息,这样就会严重消耗CPU甚至系统根本无法运行,哪位仁兄有更好的实现方式呢?
|
|
沙发#
发布于:2003-06-18 10:26
只在驱动里设置规则,然后根据这些规则拦截封包
而用户态进程可以对这些规则操作 一般的防火墙都是这种模式 |
|
板凳#
发布于:2003-06-18 21:32
对于是否发送未决的包我想交于应用程序提示用户是否通过,将包信息存于链表中,等待应用程序读取了这些信息后将向驱动程序回写一个是否通过的信息,本打算用KeWaitForSingleObject()等待应用程序的提示信息,但阅读DDK开发文档说明,在DISPATCH_LEVEL等待时间只能为零,也就是说我仍然需要循环读取是否通过的信息,这样就会严重消耗CPU甚至系统根本无法运行,哪位仁兄有更好的实现方式呢? 如果对于一个包来说,你如果决定和应用层交互以后那是不可想象的 比如一个UDP过来,你认为它可疑的话,等你交互完以后,应用层可能早就发出一个重新连接的请求了。 对TCP更是如此,一个可以的TCP连接,你断了一个包,那么应用层就在等,等到你的交互完成的时候,可能连时钟都启动好机会了 那样的话反而增加了额外的开销, 你的程序如果很频繁的访问内核,虽然包能及时通过,但是效率很低 你的程序如果很好访问内核,那么很多该通过的包,没有通过,不断造成重传,定时器时间,大大增加了系统开销。 这是我的理解不知道对不对? |
|
|
地板#
发布于:2003-06-20 08:32
[quote如果对于一个包来说,你如果决定和应用层交互以后那是不可想象的比如一个UDP过来,你认为它可疑的话,等你交互完以后,应用层可能早就发出一个重新连接的请求了。
对TCP更是如此,一个可以的TCP连接,你断了一个包,那么应用层就在等,等到你的交互完成的时候,可能连时钟都启动好机会了 那样的话反而增加了额外的开销, 你的程序如果很频繁的访问内核,虽然包能及时通过,但是效率很低 你的程序如果很好访问内核,那么很多该通过的包,没有通过,不断造成重传,定时器时间,大大增加了系统开销。 这是我的理解不知道对不对? [/quote] |
|
地下室#
发布于:2003-06-20 08:34
[quote
如果对于一个包来说,你如果决定和应用层交互以后那是不可想象的 比如一个UDP过来,你认为它可疑的话,等你交互完以后,应用层可能早就发出一个重新连接的请求了。 对TCP更是如此,一个可以的TCP连接,你断了一个包,那么应用层就在等,等到你的交互完成的时候,可能连时钟都启动好机会了 那样的话反而增加了额外的开销, 你的程序如果很频繁的访问内核,虽然包能及时通过,但是效率很低 你的程序如果很好访问内核,那么很多该通过的包,没有通过,不断造成重传,定时器时间,大大增加了系统开销。 这是我的理解不知道对不对? [/quote] 即使把所有的包提交到应用层处理也没有你想象的那么慢。 |
|
5楼#
发布于:2003-06-20 09:04
也许吧。但是我们考虑一种极端情况,假设CPU达到100%的情况下,
又来了很多需要用户来判断的情况,这是肯定出问题。 不过我认为你说的在正常情况是应该是可以的。 |
|
|
6楼#
发布于:2003-06-20 10:58
因为我看到天网防火墙就可以提示用户是否允许某一应用程序访问网络,不知道他是不是也是在NDIS这一层做的呢?另外在驱动程序中如何得到肖前应用程序的完全路径名呢?下面的费尔给的一段代码,但并不适合所有的机器:被注释掉的代码就是获得完全路径。
PCWSTR CPacketPool::GetCurrentProcessFileName(bool &bFullPath) { DWORD dwAddress=0; bFullPath=false; const char *pImageName=NULL; char *p=NULL; KIRQL kIrql=KeGetCurrentIrql( ); if(kIrql!=DISPATCH_LEVEL) return NULL; dwAddress= (DWORD)PsGetCurrentProcess(); if(dwAddress == 0 || dwAddress == 0xFFFFFFFF) return NULL; pImageName=(char*)dwAddress + 0x1FC; /* if(!strstr(pImageName,\".exe\")//如果有“.exe”则是 //应用程序,要继续查全 //路径 */ return (PCWSTR)(pImageName); /* bFullPath=true; dwAddress += 0x1B0; if((dwAddress = *(DWORD*)dwAddress) == 0) return 0; dwAddress += 0x10; if((dwAddress = *(DWORD*)dwAddress) == 0) return 0; dwAddress += 0x3C; if((dwAddress = *(DWORD*)dwAddress) == 0) return 0; return (PCWSTR)dwAddress; */ } |
|
7楼#
发布于:2003-06-20 11:01
请问怎么给分呢?
|
|
8楼#
发布于:2003-06-20 15:11
你按下CTRL+7,找“给分”啊
随便问一声我是不是有分啊 |
|
|
9楼#
发布于:2003-06-20 15:49
可是我的问题还没得到解决啊,我给了分我的问题怎么解决啊?555555555555
|
|
10楼#
发布于:2003-06-20 23:40
可是我的问题还没得到解决啊,我给了分我的问题怎么解决啊?555555555555
―――――――――――――――――――――――――――――― 真是汗~~~~你不会解决了再给分吗?^o^ 不清楚的就再问啊,如果有必要再另外开帖放分呗:) 比如放点分给我~~~~ :D |
|
|
11楼#
发布于:2003-06-21 02:04
先放点分出来鼓励鼓励嘛
|
|
12楼#
发布于:2003-06-21 13:09
我想天网应该有两个层,一个是SPI的,这层的作用就是像你列举的,“允许xxx访问网络”,因为做在其他层都十分麻烦,要考虑端口-进程映射的问题。而做在SPI就很简单。我觉得天网应该还有一层,就是处理接收数据,我猜测应该是处于NDIS层,基于hook技术的。你可以借鉴一下它的“规则”,简单而且实用。或者也可以参照一下linux下的iptable,那个规则很全很完善,只是太复杂了,处理起来相应效率较低
|
|