`
yexin218
  • 浏览: 970753 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

在Filter驱动内核中获取IP地址

阅读更多

  项目开发中有时候需要在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
2
1
分享到:
评论

相关推荐

    Filter驱动开发笔记

    在Filter驱动内核中获取IP地址 - **获取方法**:通过查询NDIS对象或者使用特定的OID请求可以获得IP地址。 - **应用场景**:网络监控、日志记录等。 #### 49. Ndis过滤驱动:拷贝NetBufferList数据 - **拷贝方法*...

    NDIS中间层 NDIS6过滤驱动开发笔记

    此外,在内核中处理时间与获取IP地址等操作也是中间层驱动程序的常见功能。内核中操作时间可以使用KeQuerySystemTime等函数,而获取IP地址则涉及到对网络数据包中协议层数据的解析。 在过滤驱动开发中,开发者经常...

    深入Linux内核网络堆栈

    在Linux内核编程中,调用内核函数通常是编写模块或驱动程序的基础。例如,在Net-Filter框架中,为了实现自定义的数据包处理逻辑,开发者需要调用内核提供的API来注册和注销Net-Filter钩子。 #### 四、各种...

    网安第一次实验根据端口、ip地址统计网络流量报告

    【网络安全技术实验——根据端口、IP地址统计网络流量】 本次实验主要涉及的是网络安全技术,具体任务是根据端口和IP地址来统计网络流量。实验报告涵盖了从实验目的、要求、原理、步骤到设计思想、测试结果、系统...

    Linux内核网络部分源码分析-唐文

    例如,匹配条件可以是IP地址、端口号等,动作可以是接受、拒绝或者跳转到另一个链条。 4. **Targets**:这是规则执行的结果动作。例如,`ACCEPT` 表示接受数据包,`DROP` 表示丢弃数据包。 #### 三、规则的存储与...

    利用Winpcap捕获分析局域网内的IP流量

    捕获到IP数据包后,你可以解析每个包的头部信息,获取源IP地址、目标IP地址、协议类型、TTL、端口号等关键信息。对于TCP和UDP数据包,还可以获取序列号、确认号、窗口大小等TCP或UDP特定字段。通过对这些信息的分析...

    捕获IP数据包的delphi源码

    1. **数据包捕获基础**:数据包捕获是通过监听网络接口来获取传输中的数据包,通常涉及操作系统内核级别的网络堆栈。在Windows系统中,可以使用WinPCap或Npcap库,它们提供了API供应用程序直接访问网络接口的原始...

    Wfp进程及包头过滤内核模块

    包头包含了诸如源/目标IP地址、端口号、协议类型等关键信息。通过分析这些信息,WFP可以判断数据包的来源、目的地以及其意图,从而实现精细化的过滤策略。 **WFP Filter Package 和 WFP_Filter 文件** 在提供的...

    ebt_arp.rar_V2

    "arp"则指的是地址解析协议(Address Resolution Protocol),它是TCP/IP协议栈的一部分,用于将IP地址映射到MAC地址,以便于在同一网络上的设备之间进行通信。在Linux中,ARP驱动程序处理ARP请求和响应,维护ARP...

    XDP_DDoS_protecting_osd2017.pdf

    XDP的工作原理是,在网络驱动接收到数据包时,它直接操作原始数据包,这在内核空间中位于网络堆栈的最低层。XDP的高性能主要体现在它的处理时机,它在数据包被分配到内存、堆栈或者进入常规的网络处理流程之前就开始...

    基于winpcap的ip流量分析程序

    这些数据包包括IP头部信息,如源IP地址、目标IP地址、协议类型、TTL值等,以及上层协议(如TCP、UDP)的详细信息。用户可以通过命令行参数或交互式界面来配置捕获条件,例如指定特定的IP地址或端口,或者设定捕获的...

    linux下sniffer程序的实现.pdf

    对于进一步的数据处理,我们可以解析IP报文头,提取源和目标IP地址,协议类型等信息,甚至可以解析TCP或UDP头来获取端口号。 为了过滤掉不必要的数据包,我们可以使用Berkeley Packet Filter(BPF)语法。BPF是一种...

    ip包过滤.pdf

    【描述】: 本文深入探讨了如何利用WinPcap技术捕获和过滤IP分片的数据包,特别是在网络安全和取证中的应用。 【标签】: 教育,网络安全,数据包捕获,WinPcap 【正文】: 在计算机网络中,数据包捕获是网络安全...

    数据包捕获源代码(抓包程序)

    Winpcap通过内核驱动与操作系统紧密集成,能够直接访问网络接口的数据包。它包含四个主要功能:数据包捕获、数据包过滤、网络协议分析和数据包注入。在本程序中,主要利用了数据包捕获和过滤功能。 在代码实现上,...

    ebt_arp.rar_The Fields

    标题中的"ebt_arp.rar_The Fields"可能是指一个关于网络过滤和ARP协议的项目或教程,其中"ebt"可能代表“eBPF(Extended Berkeley Packet Filter)”,这是一种在Linux内核中用于网络数据包过滤的技术。而"arp"则是...

    ip包过滤收集.pdf

    - NPF (Netgroup Packet Filter):这是一个内核级的虚拟设备驱动程序,负责过滤数据包并将其传递给用户空间。它处理操作系统特定的部分。 - packet.dll:这是一个与操作系统无关的API接口,允许在不同版本的...

    使用winpcap进行ip流量包分析

    Winpcap的工作原理是利用设备驱动程序直接与网络接口卡交互,绕过操作系统内核的数据包处理过程,从而实现高效的数据包捕获。它提供了四个主要功能:打开网络接口,设置数据包过滤规则,捕获数据包,以及发送原始...

    福建伊时代笔试题(二).doc

    2. **ARP欺骗原理**:攻击者通过伪造ARP应答包来篡改目标主机的ARP缓存表,使得目标主机误以为攻击者的MAC地址是某个合法IP地址对应的MAC地址,从而导致数据包被发送到攻击者处。 3. **网络数据还原软件设计**: -...

    基于Libpcap数据包捕获与分析.rar

    在Linux环境下,Libpcap利用内核级别的网络驱动程序来直接获取数据包,避免了用户空间与内核空间之间的上下文切换,从而提高了捕获效率。 数据包捕获的过程首先需要打开一个网络接口,这可以通过Libpcap的`pcap_...

    WinPcap_中文技术文档.doc

    - **获取已安装设备的高级信息**:说明如何获取设备的详细配置信息,如MTU、IP地址等。 - **打开适配器并捕获数据包**:演示如何选择一个设备并开始捕获数据包。 - **不用回调方法捕获数据包**:介绍了如何不依赖...

Global site tag (gtag.js) - Google Analytics