首页
社区
课程
招聘
[原创]一个比较ip的tdi例子
发表于: 2012-6-13 14:31 8952

[原创]一个比较ip的tdi例子

2012-6-13 14:31
8952
收藏
免费 6
支持
分享
最新回复 (11)
雪    币: 41
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
顶。。感谢分享。
2012-6-13 17:25
0
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
3
挂上代理的肿么办?
2012-6-13 17:38
0
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
4
这个例子是仅仅过滤Ip和端口的,
挂上代理的通过解析dns数据包就可以过滤了。
这部分的,我正在写,呵呵。
2012-6-13 17:52
0
雪    币: 585
活跃值: (568)
能力值: ( 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 );
}
2012-6-13 17:53
0
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
6
上面的就是通过dns来过滤网址的代码,呵呵,
2012-6-13 17:54
0
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
7
根据dns来过滤网址

FilterDns.rar
上传的附件:
2012-6-14 17:58
0
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
8
在win7 64位系统下,看了下金山安全卫士和qq管家的网络监控驱动,
发现也都是用的tdi过滤。

很疑惑啊,微软声明tdi技术在vista之后的操作系统中将不再支持。

所以我也编译了一个64位的tdi驱动。

果然在win7 64位系统下可以正常运行。

呵呵,看来微软的声明也是坨屎啊。

FilterDns.rar

kmodurl64.sys
kmodurl64.rar

QMNetflow764.sys
QMNetflow764.rar
上传的附件:
2012-6-15 11:01
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
9
TDI由于TDX存在而继续存在了~但是有些东西变了哦~
2012-6-15 17:37
0
雪    币: 585
活跃值: (568)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
10
TDX是什么东西,
目前在64位下没有发现问题
2012-6-18 17:59
0
雪    币: 67
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
下载了,试试看。
2012-10-9 11:09
0
雪    币: 123
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
下载学习,谢谢!
2012-10-10 08:57
0
游客
登录 | 注册 方可回帖
返回
//