能力值:
( LV2,RANK:10 )
|
-
-
2 楼
顶。。感谢分享。
|
能力值:
( LV15,RANK:670 )
|
-
-
3 楼
挂上代理的肿么办?
|
能力值:
( LV13,RANK:290 )
|
-
-
4 楼
这个例子是仅仅过滤Ip和端口的,
挂上代理的通过解析dns数据包就可以过滤了。
这部分的,我正在写,呵呵。
|
能力值:
( LV13,RANK:290 )
|
-
-
5 楼
NTSTATUS Tdi_SendDataGram( IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp, IN PIO_STACK_LOCATION pIrpStack )
{
PTDI_REQUEST_KERNEL_SENDDG pParam = (TDI_REQUEST_KERNEL_SENDDG*)( &pIrpStack->Parameters );
PTA_ADDRESS pRemoteAddr = ( (TRANSPORT_ADDRESS *)( pParam->SendDatagramInformation->RemoteAddress ) )->Address;
if( 0x35 == ntohs( ( (TDI_ADDRESS_IP *)(pRemoteAddr->Address) )->sin_port ) ) // DNS查询包的端口号为0x35
{
PDNS_MESSAGE_BUFFER pDnsData = (PDNS_MESSAGE_BUFFER)MmGetSystemAddressForMdlSafe( pIrp->MdlAddress, NormalPagePriority );
if( NULL != pDnsData && pDnsData->MessageHead.IsResponse == 0 ) // IsResponse为0表示查询报文
{
WORD wQuestionCount = pDnsData->MessageHead.QuestionCount;
BYTE nQuestionCount = ( (PBYTE)( &wQuestionCount ) )[1]; // 需要查询的问题个数
DbgOutput( "In Tdi_SendDataGram(), LenOfPacket:%d nQuestionCount:%d NameOfDns:(%s).", pParam->SendLength, nQuestionCount, pDnsData->MessageBody );
// 判断是否阻止
if( IsNeedFilterDns( nQuestionCount, pDnsData->MessageBody, pParam->SendLength ) ) // pParam->SendLength 整个dns包的大小
{
DbgOutput( "In Tdi_SendDataGram(), NameOfDns:(%s) is forbided!", pDnsData->MessageBody );
return DispatchComplete( pDeviceObject, pIrp, FALSE );
}
// http://hi.baidu.com/zhanglei3019/blog/item/8a4996f899b4980608244d1e.html
// 其中每个查询的资源记录格式:
//
// 1 1 1 1 1 1
// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
// | |
// / QNAME /
// / /
// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
// | QTYPE |
// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
// | QCLASS |
// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
// QNAME:不定长,表示要查询的域名。(两边的方框用 / 来表示不定长)
// QTYPE:2字节,根据RFC1035及nslookup的帮助文档,我定义以下枚举类型:
// enum QueryType //查询的资源记录类型。
// {
// A=0x01, //指定计算机 IP 地址。
// NS=0x02, //指定用于命名区域的 DNS 名称服务器。
// MD=0x03, //指定邮件接收站(此类型已经过时了,使用MX代替)
// MF=0x04, //指定邮件中转站(此类型已经过时了,使用MX代替)
// CNAME=0x05, //指定用于别名的规范名称。
// SOA=0x06, //指定用于 DNS 区域的“起始授权机构”。
// MB=0x07, //指定邮箱域名。
// MG=0x08, //指定邮件组成员。
// MR=0x09, //指定邮件重命名域名。
// NULL=0x0A, //指定空的资源记录
// WKS=0x0B, //描述已知服务。
// PTR=0x0C, //如果查询是 IP 地址,则指定计算机名;否则指定指向其它信息的指针。
// HINFO=0x0D, //指定计算机 CPU 以及操作系统类型。
// MINFO=0x0E, //指定邮箱或邮件列表信息。
// MX=0x0F, //指定邮件交换器。
// TXT=0x10, //指定文本信息。
// UINFO=0x64, //指定用户信息。
// UID=0x65, //指定用户标识符。
// GID=0x66, //指定组名的组标识符。
// ANY=0xFF //指定所有数据类型。
// };
//
//QTYPE:2字节。 根据RFC1035及nslookup的帮助文档,我定义以下枚举类型:
// enum QueryClass //指定信息的协议组。
// {
// IN=0x01, //指定 Internet 类别。
// CSNET=0x02, //指定 CSNET 类别。(已过时)
// CHAOS=0x03, //指定 Chaos 类别。
// HESIOD=0x04,//指定 MIT Athena Hesiod 类别。
// ANY=0xFF //指定任何以前列出的通配符。
// };
//
// QTYPE中的A,MX,CNAME为常用,QCLASS中的IN为常用。
}
}
return DispatchComplete( pDeviceObject, pIrp, TRUE );
}
|
能力值:
( LV13,RANK:290 )
|
-
-
6 楼
上面的就是通过dns来过滤网址的代码,呵呵,
|
能力值:
( LV13,RANK:290 )
|
-
-
7 楼
|
能力值:
( LV13,RANK:290 )
|
-
-
8 楼
在win7 64位系统下,看了下金山安全卫士和qq管家的网络监控驱动,
发现也都是用的tdi过滤。
很疑惑啊,微软声明tdi技术在vista之后的操作系统中将不再支持。
所以我也编译了一个64位的tdi驱动。
果然在win7 64位系统下可以正常运行。
呵呵,看来微软的声明也是坨屎啊。
FilterDns.rar
kmodurl64.sys
kmodurl64.rar
QMNetflow764.sys
QMNetflow764.rar
|
能力值:
( LV12,RANK:760 )
|
-
-
9 楼
TDI由于TDX存在而继续存在了~但是有些东西变了哦~
|
能力值:
( LV13,RANK:290 )
|
-
-
10 楼
TDX是什么东西,
目前在64位下没有发现问题
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
下载了,试试看。
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
下载学习,谢谢!
|