项目开发中有时候需要在Filter驱动中获取有效地Unicast地址,比如用来发送数据等。本来以为内核中需要OID那种强求来完成,结果发现OID_GEN_NETWORK_LAYER_ADDRESSES是不支持查询的。后来求助高人才发现:原来在Ndis6.x,IPHelper
API不仅可以在应用层使用,也可以在内核层使用,这里我们使用的函数是GetUnicastIpAddressTable
:
NETIOAPI_API GetUnicastIpAddressTable(
__in ADDRESS_FAMILY Family,
__out PMIB_UNICASTIPADDRESS_TABLE *Table
);
这里Family可以设置AF_INET, AF_INET6, and AF_UNSPEC。比如AF_INET是只包含ipv4的地址,具体参考文档。
查询的结果保存在MIB_UNICASTIPADDRESS_TABLE
数据结构中:
typedef struct _MIB_UNICASTIPADDRESS_TABLE {
ULONG NumEntries;
MIB_UNICASTIPADDRESS_ROW Table[ANY_SIZE];
} MIB_UNICASTIPADDRESS_TABLE, *PMIB_UNICASTIPADDRESS_TABLE;
NumEntries表示地址项的数目,具体信息保存在MIB_UNICASTIPADDRESS_ROW
:
typedef struct _MIB_UNICASTIPADDRESS_ROW {
SOCKADDR_INET Address;
NET_LUID InterfaceLuid;
NET_IFINDEX InterfaceIndex;
NL_PREFIX_ORIGIN PrefixOrigin;
NL_SUFFIX_ORIGIN SuffixOrigin;
ULONG ValidLifetime;
ULONG PreferredLifetime;
UINT8 OnLinkPrefixLength;
BOOLEAN SkipAsSource;
NL_DAD_STATE DadState;
SCOPE_ID ScopeId;
LARGE_INTEGER CreationTimeStamp;
} MIB_UNICASTIPADDRESS_ROW, *PMIB_UNICASTIPADDRESS_ROW;
我们要的地址保存在Address中:
typedef union _SOCKADDR_INET {
SOCKADDR_IN Ipv4;
SOCKADDR_IN6 Ipv6;
ADDRESS_FAMILY si_family;
} SOCKADDR_INET, *PSOCKADDR_INET;
接下来我们看看SOCKDDR_IN的结构:
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
最后的地址保存在结构in_addr中,它是一个包含多个联合Union的结构:
typedef struct in_addr {
union {
struct {
u_char s_b1,s_b2,s_b3,s_b4;
} S_un_b;
struct {
u_short s_w1,s_w2;
} S_un_w;
u_long S_addr;
} S_un;
} IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;
这个就是你要的地址了。如果你使用的应用层程序,那么可以导入Winsock2.h,然后使用inet_ntoa()函数把 sin_addr 转换为字符信息。但是在内核,估计你只能自己逐
个数据读取了。
ADDRESS_FAMILY Family;
PMIB_UNICASTIPADDRESS_TABLE Table = NULL;
NETIOAPI_API NetIoApi;//没法使用NO_ERROR
SOCKADDR_INET sockaddr_inet;
SOCKADDR_IN Ipv4;
Family = AF_INET;
GetUnicastIpAddressTable(Family, (PMIB_UNICASTIPADDRESS_TABLE *)&(Table));
//本来需要加上判断比如 NetIoApi = GetUnicastIpAddressTable(...)因为NO_ERROR没法识别~
sockaddr_inet = Table->Table[iCount].Address;
Ipv4 = sockaddr_inet.Ipv4;
DEBUGP(DL_TEST,("The %dth address is %d.%d.%d.%d",iCount,Ipv4.sin_addr.S_un.S_un_b.s_b1,Ipv4.sin_addr.S_un.S_un_b.s_b2,Ipv4.sin_addr.S_un.S_un_b.s_b3,Ipv4.sin_addr.S_un.S_un_b.s_b4));
}
----------------------------------------------------------------------------------------------------------------------------
要使用GetUnicastIpAddressTable这个函数,要导入头文件:Netioapi.h文件,而且注意导入的顺序,必须是ndis.h之后。例如:
#include <ndis.h>
#include <filteruser.h>
#include "flt_dbg.h"
#include "filter.h"
#include <Netioapi.h>
其次要通过编译还要在source文件中TARGETLIBS添加如下:
$(DDK_LIB_PATH)\netio.lib
------------------------------------
----------------------------------------------------------------------------------------
最后的效果就是:
最后非常感谢 Thomas 在 Filter driver:get ip address
的热心帮助。
- 大小: 60.6 KB
- 大小: 56.3 KB
分享到:
相关推荐
本教程中以实际例子介绍了过滤器的运行方式,以JSP开发中常见的中文乱码过滤器和限抽客户机IP访问的二个例子,本教程中代码部分转载,都经过本人修改了其中错误,加了详细注释,保证可以正常运行,希望对大家有所帮助
Filter驱动开发笔记,pdf文档,包含DNIS开发
将革命进行到底,再来一个netfilter例子,这次是过滤指定IP地址的数据包。 教程地址:http://blog.csdn.net/sahusoft/archive/2009/09/11/4544030.aspx
华硕(ASUS)笔记本KB_FILTER驱动
这是书的光盘。共分为两个部分,这是第一部分。 本书由浅入深、循序渐进地... 本章总结了在内核模式下的四种等待方法,读者可以利用这些方法灵活地用在自己的驱动程序中。最 后本章还介绍了如何对IRP的超时情况进行...
本章总结了在内核模式下的四种等待方法,读者可以利用这些方法灵活地用在自己的驱动程序中。最后本章还介绍了如何对IRP的超时情况进行处理。 10.1 定时器实现方式一 10.1.1 I/O定时器 10.1.2 示例代码 ...
Netfilter的内核源代码,可以作为研究ARP,IP的HOOK的前提。
如何在 Solaris 安裝 IP Filter 如何在 Solaris 安裝 IP Filter 如何在 Solaris 安裝 IP Filter 如何在 Solaris 安裝 IP Filter
windows系统下usb过滤驱动实现
logstash使用geoip插件解析出来的地理信息是英文。通过GeoIP获取ip所属地,并将国家转换为中文。
基于Trie的算法中具有计数BloomFilter的高效IP地址查找
整理的一些关于NDIS6 Filter开发的资料
MAC 打印机py驱动文件
Laravel开发-laravel-ip-filter 按Laravel的IP地址筛选请求
在Filter Module被安装到驱动栈时,之上的协议驱动和之下的微端口驱动都不需要提供额外的支持功能 3) 因为Filter Module不像中间层驱动(intermediate driver)那样提供一个虚拟的微口,也不与某个设备对象...
ip_filter最新源码,unix主机防火墙ip_filter,学习AIX,Solaris,HPUX内核开发的开源代码
主要知识重点包括:Windows串口与键盘过滤驱动、Windows虚拟存储设备与存储设备过滤驱动、Windows文件系统过滤驱动、文件系统透明加密/解密驱动、Windows各类网络驱动(包括TDI过滤驱动及3类NDIS驱动),以及最新的...
java filter打印请求返回参数
XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制——例如同源策略(same origin...
IP分组过滤驱动.rar 驱动程序; 测试程序.rar 测试程序; /** * 规则函数: addRule(char *driver_name,USHORT type,USHORT protocol,char *sourceIp,char *sourceMask,USHORT sourcePort, char *destinationIp,...