加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

【PIN沙盒笔记05】HOOK NtDeviceIoControlFile获取TCP/UDP IP、端口、通信内容

(2016-10-19 17:49:41)
标签:

pin

ntdeviceiocontrolfil

hook

ip端口获取

分类: C&&CPP
      参考链接:
      http://www.cnblogs.com/mayingkun/p/3903730.html
      http://2997ms.github.io/2016/10/09/2016-9月-吭哧咔哧/

      这篇主要内容为,针对NtDeviceIoControlFile系统调用的解析出对应TCP、UDP链接的IP、端口、内容。(在win7 x86和win8.1 x64下测试通过)
      先看看对应函数的参数声明:
      NTSTATUS ZwDeviceIoControlFile(
                _In_      HANDLE           FileHandle,
                _In_opt_  HANDLE           Event,
                _In_opt_  PIO_APC_ROUTINE  ApcRoutine,
                _In_opt_  PVOID            ApcContext,
                _Out_     PIO_STATUS_BLOCK IoStatusBlock,
                _In_      ULONG            IoControlCode,
                _In_opt_  PVOID            InputBuffer,
                _In_      ULONG            InputBufferLength,
                _Out_opt_ PVOID            OutputBuffer,
                _In_      ULONG            OutputBufferLength
        );
      这里主要关注的参数为IoControlCode(对应的AFD命令类型)、InputBuffer(信息数据所在缓冲区)、InputBufferLength(缓冲区长度)

1、TCP
      TCP主要关注的AFD CODE包括:
      #define IO_AFD_BIND 0x12003 
      #define IO_AFD_CONNECT 0x12007 
      #define IO_AFD_RECV 0x12017 
      #define IO_AFD_SEND 0x1201f

      1.1 BIND(IO_AFD_BIND
      BIND在UDP和TCP中,程序为Server时都可以从中提取出对应绑定的端口和IP。
      尝试了网上给的几个结构无果后,手动调试发现,每次在input_buffer最后0x10个字节,为存储IP和端口信息的结构:
    struct sockaddr_in 
   
         short sin_family; 
         u_short sin_port; //大端法存储的端口号
         struct in_addr sin_addr; //大端法存储的IP
         char sin_zero[8]; 
    };
    没有错,就是编写socket的时候用到的SOCKADDR_IN。
http://s16/bmiddle/002S5apNzy75KbCUVKT7f&690NtDeviceIoControlFile获取TCP/UDP IP、端口、通信内容" TITLE="【PIN沙盒笔记05】HOOK NtDeviceIoControlFile获取TCP/UDP IP、端口、通信内容" />

      使用偏移提取得到绑定的IP和端口为(127.0.0.1:1114)
 
      1.2 CONNECT(IO_AFD_CONNECT
      CONNECT和BIND的获取方法一样,同样取input_buffer中的最后0x10个字节,可以正确获得连接SERVER的IP和端口。
 
      1.3 SEND(IO_AFD_SEND
      SEND操作采用的结构体为(注:由于PIN里面需要给windows.h独立的命名空间,所以用到的windows数据类型都加上了WINDOWS::):
      typedef struct AFD_INFO 
     
             PAFD_WSABUF BufferArray ; 
             WINDOWS::ULONG BufferCount ; 
             WINDOWS::ULONG AfdFlags ; 
             WINDOWS::ULONG TdiFlags ; 
      }AFD_INFO, *PAFD_INFO;
      其中:
      typedef struct AFD_WSABUF 
     
             UINT len ; //收发信息长度
             WINDOWS::PCHAR buf ; //收发信息缓冲区
      }AFD_WSABUF, *PAFD_WSABUF;
      直接在系统调用入口处,即可以获取到SEND的内容。

      1.4 RECV(IO_AFD_RECV
      和SEND相同,也可以使用PAFD_INFO在系统调用出口处获取正确的值。但是获取到的长度不正确?

      附上测试截图:
http://s6/bmiddle/002S5apNzy75KdVMQpn65&690NtDeviceIoControlFile获取TCP/UDP IP、端口、通信内容" TITLE="【PIN沙盒笔记05】HOOK NtDeviceIoControlFile获取TCP/UDP IP、端口、通信内容" />
http://s5/mw690/002S5apNzy75Ke1lDKc74&690NtDeviceIoControlFile获取TCP/UDP IP、端口、通信内容" TITLE="【PIN沙盒笔记05】HOOK NtDeviceIoControlFile获取TCP/UDP IP、端口、通信内容" />
(TCP Server Test)

http://s4/bmiddle/002S5apNzy75KejSSCDf3&690NtDeviceIoControlFile获取TCP/UDP IP、端口、通信内容" TITLE="【PIN沙盒笔记05】HOOK NtDeviceIoControlFile获取TCP/UDP IP、端口、通信内容" />
http://s10/mw690/002S5apNzy75Kems09r09&690NtDeviceIoControlFile获取TCP/UDP IP、端口、通信内容" TITLE="【PIN沙盒笔记05】HOOK NtDeviceIoControlFile获取TCP/UDP IP、端口、通信内容" />
(TCP Client Test)

2、UDP
      UDP主要关注的AFD CODE包括:
      #define IO_AFD_BIND 0x12003 
      #define IO_AFD_SENDTO 0x12023 
      #define IO_AFD_RECVFROM 0x1201B
 
      2.1 BIND(IO_AFD_BIND
      和TCP BIND的处理方式相同

      2.2 SENDTO(IO_AFD_SENDTO
      SEND TO操作采用的结构为:
      typedef struct _AFD_SEND_INFO_UDP 
     
            PAFD_WSABUF BufferArray;//存储发送内容
            WINDOWS::ULONG BufferCount; 
            WINDOWS::ULONG AfdFlags; 
            WINDOWS::ULONG Padding[9]; 
            WINDOWS::ULONG AddressLength; 
            WINDOWS::PVOID Address;//PSOCKADDR_IN结构,存储IP和端口,获取方法同上
      }AFD_SEND_INFO_UDP, *PAFD_SEND_INFO_UDP;

      2.3 RECVFROM(IO_AFD_RECVFROM
      RECV FROM操作采用的结构为:
      typedef struct _AFD_RECV_INFO_UDP 
     
            PAFD_WSABUF BufferArray; //存储接收内容
            WINDOWS::ULONG BufferCount; 
            WINDOWS::ULONG AfdFlags; 
            WINDOWS::ULONG TdiFlags; 
            WINDOWS::PVOID Address; //PSOCKADDR_IN结构,存储IP和端口,获取方法同上
            WINDOWS::PINT AddressLength; 
      }AFD_RECV_INFO_UDP, *PAFD_RECV_INFO_UDP;
      但是在系统调用出口处获取时,出现和TCP RECV一样的小问题,即获取到的长度不正确,且作为Server时第一组获取到的内容和IP有问题,原因未知。

      附上测试截图:
http://s16/bmiddle/002S5apNzy75KgIonEj1f&690NtDeviceIoControlFile获取TCP/UDP IP、端口、通信内容" TITLE="【PIN沙盒笔记05】HOOK NtDeviceIoControlFile获取TCP/UDP IP、端口、通信内容" />

http://s6/bmiddle/002S5apNzy75KgJ7BGt75&690NtDeviceIoControlFile获取TCP/UDP IP、端口、通信内容" TITLE="【PIN沙盒笔记05】HOOK NtDeviceIoControlFile获取TCP/UDP IP、端口、通信内容" />
(UDP Server Test)

http://s14/bmiddle/002S5apNzy75Kh76rzD2d&690NtDeviceIoControlFile获取TCP/UDP IP、端口、通信内容" TITLE="【PIN沙盒笔记05】HOOK NtDeviceIoControlFile获取TCP/UDP IP、端口、通信内容" />

http://s11/mw690/002S5apNzy75Kh7pdqO3a&690NtDeviceIoControlFile获取TCP/UDP IP、端口、通信内容" TITLE="【PIN沙盒笔记05】HOOK NtDeviceIoControlFile获取TCP/UDP IP、端口、通信内容" />
(UDP Client Test)

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有