首页
社区
课程
招聘
[旧帖] [求助]NtDeviceIoControlFile获得IP地址、端口信息 0.00雪花
发表于: 2012-5-15 11:18 2569

[旧帖] [求助]NtDeviceIoControlFile获得IP地址、端口信息 0.00雪花

2012-5-15 11:18
2569
看过之前MJ大牛的帖子
通过SSDT HOOK 挂钩了NtDeviceIoControlFile
但是不知道如何从输入输出buffer里获得TCP/UDP相关的信息,主要就是源、目的IP和端口信息。

请教一下过做相关内容的大牛啊。

另外我这程序之前已经做了关于注册表监控的SSDT了,所以要换NDIS或者TDI(我在XP下做的)来代替HOOK取得TCP/UDP信息可能更加麻烦。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (7)
雪    币: 40
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
好像Win7得用IRP HOOK
2012-5-21 21:58
0
雪    币: 142
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
一些结构体:
typedef struct _TDI_ADDRESS_IP {
        USHORT  sin_port;
        ULONG  in_addr;
        UCHAR  sin_zero[8];
} TDI_ADDRESS_IP, *PTDI_ADDRESS_IP;

typedef struct _TA_ADDRESS {
        USHORT  AddressLength;
        USHORT  AddressType;
        UCHAR  Address[1];
} TA_ADDRESS, *PTA_ADDRESS;

typedef struct _TRANSPORT_ADDRESS {
        LONG  TAAddressCount;
        TA_ADDRESS  Address[1];
} TRANSPORT_ADDRESS, *PTRANSPORT_ADDRESS;

typedef struct  _AFD_CONNECT_INFO {
        BOOLEAN             UseSAN;
        ULONG               Root;
        ULONG               Unknown;
        TRANSPORT_ADDRESS RemoteAddress;
} AFD_CONNECT_INFO , *PAFD_CONNECT_INFO ;
2012-5-21 22:55
0
雪    币: 142
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
获取端口和IP则这样:

        if (IoControlCode == 0x12007)//connect
        {
                if (InputBufferLength == 0x22)//真正的connect
                {
                        PAFD_CONNECT_INFO ConnectInfo = (PAFD_CONNECT_INFO)InputBuffer;
                        TRANSPORT_ADDRESS TrAddr = ConnectInfo->RemoteAddress;
                        struct sockaddr name;
                        RtlZeroMemory(&name,sizeof(struct sockaddr));
                        name.sa_family = ConnectInfo->RemoteAddress.Address[0].AddressType ;
                        RtlCopyMemory(&name.sa_data,ConnectInfo->RemoteAddress.Address[0].Address,sizeof(name.sa_data));
                        struct sockaddr_in *rIP = (struct sockaddr_in *)&name;

                        //端口:
                        int iPort = ntohs(rIP->sin_port);
                        //IP:
                        LPSTR szIP = inet_ntoa(rIP->sin_addr);
                }
        }
2012-5-21 22:56
0
雪    币: 142
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
额,没注意看,SSDT?那个是IAT Hook吧
上面的代码就是在那基础上用的
2012-5-21 22:58
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
HOOK思路差不多的 IAT 和SSDT差距不是很大
关键是buffer如何提取出有用的信息的问题

目前我也就是在connect这里拿了TCP的IP了
UDP的也照样子做了一下(code用的revc和send的),还没验证

另外那个真正的connect是怎么回事?
2012-5-22 20:59
0
雪    币: 142
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
建立连接其实有多次调用NtDeviceIoControlFile,当(InputBufferLength == 0x22)的时候,才能拿到PAFD_CONNECT_INF这个结构,得到IP和端口.具体看nt4的源码还是哪个,时间长了我也记不清了,这是从以前一个代码里扒下来的
2012-5-22 22:28
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
回复很有用 谢了哈~
2012-5-27 11:08
0
游客
登录 | 注册 方可回帖
返回
//