TDI过滤获取IP及端口

2024-04-23 12:08
文章标签 ip 端口 获取 过滤 tdi

本文主要是介绍TDI过滤获取IP及端口,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

TDI过滤驱动获取IP地址及连接端口要涉及关于TDI的一些结构体,当接收到含有TDI的TDI_CONNECT连接IRP请求时,IRP请求栈顶的的参数parameters就是指向TDI_REQUEST_KERNEL_CONNECT结构体的指针,实际上,这个结构体就是TDI_REQUEST_KERNEL。这个结构体定义在tdikrnl.h中定义如下:

typedef struct _TDI_REQUEST_KERNEL {
ULONG  RequestFlags;
PTDI_CONNECTION_INFORMATION  RequestConnectionInformation;
PTDI_CONNECTION_INFORMATION  ReturnConnectionInformation;
PVOID  RequestSpecific;
} TDI_REQUEST_KERNEL, *PTDI_REQUEST_KERNEL;
这里的第二个参数RequestConnectionInformation是一个TDI_CONNECTION_INFORMATION结构体指针,TDI_CONNECTION_INFORMATION在头文件tdi.h中定义如下:

typedef struct _TDI_CONNECTION_INFORMATION {
LONG  UserDataLength;   //用户数据buffer的长度
PVOID  UserData;    //指向用户数据buffer的指针
LONG  OptionsLength;
PVOID  Options;
LONG  RemoteAddressLength;
PVOID  RemoteAddress;   //远程地址
} TDI_CONNECTION_INFORMATION, *PTDI_CONNECTION_INFORMATION;
最后一个参数RemoteAddress是一个指向TRANSPORT_ADDRESS结构体的指针。TRANSPORT_ADDRESS的定义如下:

typedef struct _TRANSPORT_ADDRESS {
LONG  TAAddressCount;   //address的数量
TA_ADDRESS  Address[1];   //这里是一个TA_ADDRESS结构体
} TRANSPORT_ADDRESS, *PTRANSPORT_ADDRESS;
参数AddressType是TDI支持的一些协议类型,当为TCP/IP协议类型时最后一个参数Address指向包含IP地址及连接端口信息的结构体TDI_ADDRESS_IP,在这个结构体里面就包含了我们要获去的IP及端口信息。TDI_ADDRESS_IP定义如下:

typedef struct _TDI_ADDRESS_IP {
USHORT  sin_port;
ULONG  in_addr;
UCHAR  sin_zero[8];
} TDI_ADDRESS_IP, *PTDI_ADDRESS_IP;
现在大概的思路就清楚了,根据上面的信息要获取IP及端口只需按着顺序往下走即可。大体代码如下:

PIO_STACK_LOCATION StackIrpPointer=NULL;
PTDI_REQUEST_KERNEL_CONNECT TDI_connectRequest ;
PTA_ADDRESS TA_Address_data ;
// 要得到IP和端口
PTDI_ADDRESS_IP TDI_data ;
typedef struct _NETWORK_ADDRESS
{
unsigned char address [4];
unsigned char port [2];
} NETWORK_ADDRESS ;
NETWORK_ADDRESS data ; 
unsigned short Port =0;
unsigned long Address =0;
StackIrpPointer=IoGetCurrentIrpStackLocation(Irp);
....
//这里判断如果StackIrpPointer->MinorFunction == TDI_CONNECT的话就输出IP及端口信息
....
TDI_connectRequest =( PTDI_REQUEST_KERNEL_CONNECT )(& StackIrpPointer -> Parameters );
TA_Address_data =( ( PTRANSPORT_ADDRESS )( TDI_connectRequest -> RequestConnectionInformation ->RemoteAddress ))-> Address ;
TDI_data = ( PTDI_ADDRESS_IP ) ( TA_Address_data -> Address );
Address = TDI_data -> in_addr ;
Port = TDI_data -> sin_port ;
data . address [0] = (( char *)& Address )[0];
data . address [1] = (( char *)& Address )[1];
data . address [2] = (( char *)& Address )[2];
data . address [3] = (( char *)& Address )[3];
data . port [0] = (( char *)& Port )[0];
data . port [1] = (( char *)& Port )[1];
Port = data . port [0] + data . port [1];
DbgPrint ("TDIFilter: IP address:port is %d.%d.%d.%d:%d ",data.address [0] ,data.address[1] ,data.address[2] , data.address[3] ,Port ); 
加载驱动后,打开IE 浏览器 显示GOOGLE主页并通过Dbgview观察输出信息,注意IP和端口那一行哦。如下:





这篇关于TDI过滤获取IP及端口的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/928751

相关文章

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

微信公众号脚本-获取热搜自动新建草稿并发布文章

《微信公众号脚本-获取热搜自动新建草稿并发布文章》本来想写一个自动化发布微信公众号的小绿书的脚本,但是微信公众号官网没有小绿书的接口,那就写一个获取热搜微信普通文章的脚本吧,:本文主要介绍微信公众... 目录介绍思路前期准备环境要求获取接口token获取热搜获取热搜数据下载热搜图片给图片加上标题文字上传图片

SpringIntegration消息路由之Router的条件路由与过滤功能

《SpringIntegration消息路由之Router的条件路由与过滤功能》本文详细介绍了Router的基础概念、条件路由实现、基于消息头的路由、动态路由与路由表、消息过滤与选择性路由以及错误处理... 目录引言一、Router基础概念二、条件路由实现三、基于消息头的路由四、动态路由与路由表五、消息过滤

使用Python实现获取网页指定内容

《使用Python实现获取网页指定内容》在当今互联网时代,网页数据抓取是一项非常重要的技能,本文将带你从零开始学习如何使用Python获取网页中的指定内容,希望对大家有所帮助... 目录引言1. 网页抓取的基本概念2. python中的网页抓取库3. 安装必要的库4. 发送HTTP请求并获取网页内容5. 解

java streamfilter list 过滤的实现

《javastreamfilterlist过滤的实现》JavaStreamAPI中的filter方法是过滤List集合中元素的一个强大工具,可以轻松地根据自定义条件筛选出符合要求的元素,本文就来... 目录1. 创建一个示例List2. 使用Stream的filter方法进行过滤3. 自定义过滤条件1. 定

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

Redis如何实现刷票过滤

《Redis如何实现刷票过滤》:本文主要介绍Redis如何实现刷票过滤问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录引言一、概述二、技术选型三、搭建开发环境四、使用Redis存储数据四、使用SpringBoot开发应用五、 实现同一IP每天刷票不得超过次数六

Linux系统中配置静态IP地址的详细步骤

《Linux系统中配置静态IP地址的详细步骤》本文详细介绍了在Linux系统中配置静态IP地址的五个步骤,包括打开终端、编辑网络配置文件、配置IP地址、保存并重启网络服务,这对于系统管理员和新手都极具... 目录步骤一:打开终端步骤二:编辑网络配置文件步骤三:配置静态IP地址步骤四:保存并关闭文件步骤五:重