项目开发中有时候需要在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
分享到:
相关推荐
在Filter驱动内核中获取IP地址 - **获取方法**:通过查询NDIS对象或者使用特定的OID请求可以获得IP地址。 - **应用场景**:网络监控、日志记录等。 #### 49. Ndis过滤驱动:拷贝NetBufferList数据 - **拷贝方法*...
此外,在内核中处理时间与获取IP地址等操作也是中间层驱动程序的常见功能。内核中操作时间可以使用KeQuerySystemTime等函数,而获取IP地址则涉及到对网络数据包中协议层数据的解析。 在过滤驱动开发中,开发者经常...
在Linux内核编程中,调用内核函数通常是编写模块或驱动程序的基础。例如,在Net-Filter框架中,为了实现自定义的数据包处理逻辑,开发者需要调用内核提供的API来注册和注销Net-Filter钩子。 #### 四、各种...
【网络安全技术实验——根据端口、IP地址统计网络流量】 本次实验主要涉及的是网络安全技术,具体任务是根据端口和IP地址来统计网络流量。实验报告涵盖了从实验目的、要求、原理、步骤到设计思想、测试结果、系统...
例如,匹配条件可以是IP地址、端口号等,动作可以是接受、拒绝或者跳转到另一个链条。 4. **Targets**:这是规则执行的结果动作。例如,`ACCEPT` 表示接受数据包,`DROP` 表示丢弃数据包。 #### 三、规则的存储与...
捕获到IP数据包后,你可以解析每个包的头部信息,获取源IP地址、目标IP地址、协议类型、TTL、端口号等关键信息。对于TCP和UDP数据包,还可以获取序列号、确认号、窗口大小等TCP或UDP特定字段。通过对这些信息的分析...
1. **数据包捕获基础**:数据包捕获是通过监听网络接口来获取传输中的数据包,通常涉及操作系统内核级别的网络堆栈。在Windows系统中,可以使用WinPCap或Npcap库,它们提供了API供应用程序直接访问网络接口的原始...
包头包含了诸如源/目标IP地址、端口号、协议类型等关键信息。通过分析这些信息,WFP可以判断数据包的来源、目的地以及其意图,从而实现精细化的过滤策略。 **WFP Filter Package 和 WFP_Filter 文件** 在提供的...
"arp"则指的是地址解析协议(Address Resolution Protocol),它是TCP/IP协议栈的一部分,用于将IP地址映射到MAC地址,以便于在同一网络上的设备之间进行通信。在Linux中,ARP驱动程序处理ARP请求和响应,维护ARP...
XDP的工作原理是,在网络驱动接收到数据包时,它直接操作原始数据包,这在内核空间中位于网络堆栈的最低层。XDP的高性能主要体现在它的处理时机,它在数据包被分配到内存、堆栈或者进入常规的网络处理流程之前就开始...
这些数据包包括IP头部信息,如源IP地址、目标IP地址、协议类型、TTL值等,以及上层协议(如TCP、UDP)的详细信息。用户可以通过命令行参数或交互式界面来配置捕获条件,例如指定特定的IP地址或端口,或者设定捕获的...
对于进一步的数据处理,我们可以解析IP报文头,提取源和目标IP地址,协议类型等信息,甚至可以解析TCP或UDP头来获取端口号。 为了过滤掉不必要的数据包,我们可以使用Berkeley Packet Filter(BPF)语法。BPF是一种...
【描述】: 本文深入探讨了如何利用WinPcap技术捕获和过滤IP分片的数据包,特别是在网络安全和取证中的应用。 【标签】: 教育,网络安全,数据包捕获,WinPcap 【正文】: 在计算机网络中,数据包捕获是网络安全...
Winpcap通过内核驱动与操作系统紧密集成,能够直接访问网络接口的数据包。它包含四个主要功能:数据包捕获、数据包过滤、网络协议分析和数据包注入。在本程序中,主要利用了数据包捕获和过滤功能。 在代码实现上,...
标题中的"ebt_arp.rar_The Fields"可能是指一个关于网络过滤和ARP协议的项目或教程,其中"ebt"可能代表“eBPF(Extended Berkeley Packet Filter)”,这是一种在Linux内核中用于网络数据包过滤的技术。而"arp"则是...
- NPF (Netgroup Packet Filter):这是一个内核级的虚拟设备驱动程序,负责过滤数据包并将其传递给用户空间。它处理操作系统特定的部分。 - packet.dll:这是一个与操作系统无关的API接口,允许在不同版本的...
Winpcap的工作原理是利用设备驱动程序直接与网络接口卡交互,绕过操作系统内核的数据包处理过程,从而实现高效的数据包捕获。它提供了四个主要功能:打开网络接口,设置数据包过滤规则,捕获数据包,以及发送原始...
2. **ARP欺骗原理**:攻击者通过伪造ARP应答包来篡改目标主机的ARP缓存表,使得目标主机误以为攻击者的MAC地址是某个合法IP地址对应的MAC地址,从而导致数据包被发送到攻击者处。 3. **网络数据还原软件设计**: -...
在Linux环境下,Libpcap利用内核级别的网络驱动程序来直接获取数据包,避免了用户空间与内核空间之间的上下文切换,从而提高了捕获效率。 数据包捕获的过程首先需要打开一个网络接口,这可以通过Libpcap的`pcap_...
- **获取已安装设备的高级信息**:说明如何获取设备的详细配置信息,如MTU、IP地址等。 - **打开适配器并捕获数据包**:演示如何选择一个设备并开始捕获数据包。 - **不用回调方法捕获数据包**:介绍了如何不依赖...