zoukankan      html  css  js  c++  java
  • [转]NDIS HOOK及MINIPORT HOOK的实现

    [0x00]

       网上有很多讨论关于NDIS HOOK的文章,但大多只讲了WIN7之前的HOOK NDIS_OPEN_BLOCK下的例程,至于WIN7下怎么
    HOOK以及如何做MINIPORT-HOOK,网络上则鲜有提及.根据前阵子的相关分析,我把NDIS HOOK总结一下,网上有一些讨论
    NDIS HOOK的文章,请读者先阅读那些文章对NDIS HOOK有个基本了解.

    [0x01]

        首先是获取物理网卡的设备GUID,如果只是做普通的NDIS HOOK则可以忽略此步.为什么要获取物理网卡的GUID呢,
    因为系统内可能有多个MINIPORT,每个MINIPORT对应一个网卡设备,无论这个网卡是虚拟的还是物理的.
        
        所以我们要做MINIPORT HOOK的话就必须找到物理网卡对应的miniport.下面是两种获得物理网卡GUID的方法。

       方法1:通过注册表项\\REGISTRY\\MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards
    获得网卡的设备名,比如{F0AFC092-E841-48DF-909F- 78146070F5D3},不过在有些系统下没有这个注册表项,所以这种
    方法不通用.

       方法2:还是通过注册表,首先遍历HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI下的子键,当遍历到第
    二级的时候,比如
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI\VEN_10DE&DEV_0BE4&SUBSYS_00000000&REV_A1\4&2f49a5f6&0&0108.
       
       则获取当前设备的ClassGUID,如果ClassGUID为{4d36e972-e325-11ce-bfc1-08002be10318},则说明当前设备为网络
    适配器设备,那么我们再继续读名为Driver的键值,其数据一般为类似{4d36e972-e325-11ce-bfc1-08002be10318}\0007
    这样的值.

       然后我们把这个值拼接到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class这个路径后面组成
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0007,
    这个子键下的键值NetCfgInstanceId即为物理网卡的设备GUID.
     
    [0x02]

        XP NDIS HOOK:通过注册假协议,遍历所有NDIS_OPEN_BLOCK,挂接TCPIP协议下所有的NDIS_OPEN_BLOCK里的相关例程
    即可(ReceiveHandler,ReceivePacketHandler,WanSendHandler,SendHandler,SendPacketsHandler等),这在其他讲述
    NDIS HOOK的文章里均有描述,这里不再赘述.

        XP NDIS MINIPORT HOOK:仍然先要注册假协议,找到DeviceName是物理网卡设备GUID的NDIS_OPEN_BLOCK,挂接其
    WSendHandler或者WSendPacketsHandler即可.只有这个NDIS_OPEN_BLOCK才是绑定到物理网卡的.从而避免挂接到绑定
    到其他虚拟网卡的NDIS_OPEN_BLOCK或者中间层过滤驱动同上层协议之间的绑定关系(还记得吗,中间层过滤驱动的
    upperlayer向上对协议驱动表现为MINIPORT).

    [0x03]

        WIN7 NDIS HOOK:仍然是遍历所有NDIS_OPEN_BLOCK:拦截Send操作需要Inline Hook ndis!NdisSendNetBufferLists,
    或者HOOK TCPIP.SYS的IAT里的ndis!NdisSendNetBufferLists,拦截Receive操作需要Hook NDIS_OPEN_BLOCK里的
    ReceiveNetBufferListsHandler.

        WIN7 MINIPORT HOOK:遍历NDIS_OPEN_BLOCK,找到DeviceName是物理网卡设备GUID的NDIS_OPEN_BLOCK,根据NDIS_OPEN_BLOCK
    定位到对应的NDIS_MINIPORT_BLOCK,然后定位到M_DRIVER_BLOCK结构体(offset:0xE04),然后M_DRIVER_BLOCK的偏移0x60
    处就是MINIPORT的发送函数SendNetBufferListsHandler,直接挂接这里即可.
     
    [0x04]

    其他说明:
    NDIS_PRPTOCOL_BLOCK:这个结构表示协议相关的信息,每个协议对应一个

    NDIS_OPEN_BLOCK:这个结构是表示协议(PROTOCOL)和网卡(MINIPORT)的绑定关系的

    NDIS_MINIPORT_BLOCK:这个结构是表示小端口信息的,除了物理网卡和虚拟网卡存在这个结构外,IMD(中间层过滤驱动)由
    于是向上表现为MINIPORT,所以IMD也存在一个本结构

    IMD:向上表现为MINIORT,向下表现为PROTCOL,所以IMD和PROTOCOL之间也存在NDIS_OPEN_BLOCK,而IMD和下层的MINIOPORT
    也存在NDIS_OPEN_BLOCK

    以上为本人通过分析研究而得,并在实际项目中应用.如有错误或者问题请发送邮件到robinh00d_AT_sina.com指教.

  • 相关阅读:
    leetcode教程系列——Binary Tree
    《Ranked List Loss for Deep Metric Learning》CVPR 2019
    《Domain Agnostic Learning with Disentangled Representations》ICML 2019
    Pytorch从0开始实现YOLO V3指南 part5——设计输入和输出的流程
    Pytorch从0开始实现YOLO V3指南 part4——置信度阈值和非极大值抑制
    Pytorch从0开始实现YOLO V3指南 part3——实现网络前向传播
    Pytorch从0开始实现YOLO V3指南 part2——搭建网络结构层
    Pytorch从0开始实现YOLO V3指南 part1——理解YOLO的工作
    让我佩服的人生 文章
    win8.1配置cordova+ionic等一系列东西
  • 原文地址:https://www.cnblogs.com/adylee/p/2972529.html
Copyright © 2011-2022 走看看