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

相关文章

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

Nginx中配置使用非默认80端口进行服务的完整指南

《Nginx中配置使用非默认80端口进行服务的完整指南》在实际生产环境中,我们经常需要将Nginx配置在其他端口上运行,本文将详细介绍如何在Nginx中配置使用非默认端口进行服务,希望对大家有所帮助... 目录一、为什么需要使用非默认端口二、配置Nginx使用非默认端口的基本方法2.1 修改listen指令

Linux实现查看某一端口是否开放

《Linux实现查看某一端口是否开放》文章介绍了三种检查端口6379是否开放的方法:通过lsof查看进程占用,用netstat区分TCP/UDP监听状态,以及用telnet测试远程连接可达性... 目录1、使用lsof 命令来查看端口是否开放2、使用netstat 命令来查看端口是否开放3、使用telnet

Linux查询服务器 IP 地址的命令详解

《Linux查询服务器IP地址的命令详解》在服务器管理和网络运维中,快速准确地获取服务器的IP地址是一项基本但至关重要的技能,下面我们来看看Linux中查询服务器IP的相关命令使用吧... 目录一、hostname 命令:简单高效的 IP 查询工具命令详解实际应用技巧注意事项二、ip 命令:新一代网络配置全

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

Python获取浏览器Cookies的四种方式小结

《Python获取浏览器Cookies的四种方式小结》在进行Web应用程序测试和开发时,获取浏览器Cookies是一项重要任务,本文我们介绍四种用Python获取浏览器Cookies的方式,具有一定的... 目录什么是 Cookie?1.使用Selenium库获取浏览器Cookies2.使用浏览器开发者工具

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

nginx中端口无权限的问题解决

《nginx中端口无权限的问题解决》当Nginx日志报错bind()to80failed(13:Permissiondenied)时,这通常是由于权限不足导致Nginx无法绑定到80端口,下面就来... 目录一、问题原因分析二、解决方案1. 以 root 权限运行 Nginx(不推荐)2. 为 Nginx

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断