Часть 1
Часть 2
Часть 3
В этой части даются определения структур ndis!_NDIS_IF_BLOCK, описывающих сетевые интерфейсы (доступны начиная с висты), как получить адреса ndisIfListLock и ndisIfList и почему windbg в данном случае врет
Список интерфейсов можно посмотреть в плагине windbg ndiskd с помощью команды interfaces, при этом сам список хранится в глобальной переменной ndisIfList
Достать пару ndisIfList и лок очень просто - техника полностью идентична ранее описанной, экспортируемая функция для дизассемблирования называется NdisIfDeregisterInterface, указатель на следующий интерфейс всегда идет в самом начале структуры (поле по смещению 0).
И тут я задумался как такое может быть - если посмотреть на определения структур _NDIS_IF_BLOCK из WinDbg - первым полем идет Header, а Link идет следующим. После некоторых опытов выяснилось что таки да - в данном конкретном случае WinDbg неправ - для практического использования нужно считать что поля Header в этих структурах нет
Как выглядит структура _NDIS_IF_BLOCK под некоторыми доступными мне версиями windows:
dt ndis!_NET_PHYSICAL_LOCATION_LH
+0x000 BusNumber : Uint4B
+0x004 SlotNumber : Uint4B
+0x008 FunctionNumber : Uint4B
dt ndis!_IF_COUNTED_STRING_LH
+0x000 Length : Uint2B
+0x002 String : [257] Wchar
dt ndis!_IF_PHYSICAL_ADDRESS_LH
+0x000 Length : Uint2B
+0x002 Address : [32] UChar
vista 32 bit
dt ndis!_NDIS_IF_BLOCK
+0x000 Header : _NDIS_OBJECT_HEADER
+0x004 Link : _LIST_ENTRY
+0x00c ProviderLink : _LIST_ENTRY
+0x014 NetworkLink : _LIST_ENTRY
+0x01c ifRcvAddressTable : Ptr32 _NDIS_IF_RCV_ADDRESS
+0x020 ifRcvAddressCount : Uint4B
+0x024 LowerLayerIfCount : Uint4B
+0x028 HigherLayerIfCount : Uint4B
+0x02c Ref : Int4B
+0x030 MiniportRef : Int4B
+0x038 NetLuid : _NET_LUID_LH
+0x040 ProviderIfContext : Ptr32 Void
+0x044 ProviderHandle : Ptr32 _NDIS_IF_PROVIDER_BLOCK
+0x048 Flags : Uint4B
+0x04c PhysicalLocation : _NET_PHYSICAL_LOCATION_LH
+0x058 WanTunnelType : Uint4B
+0x05c PortNumber : Uint4B
+0x060 ifLastChange : Uint8B
+0x068 ifCounterDiscontinuityTime : Uint8B
+0x070 RosInfo : UChar
+0x070 ifIndex : Uint4B
+0x074 ifDescr : _IF_COUNTED_STRING_LH
+0x278 ifType : Uint2B
+0x27c AccessType : _NET_IF_ACCESS_TYPE
+0x280 DirectionType : _NET_IF_DIRECTION_TYPE
+0x284 ConnectionType : _NET_IF_CONNECTION_TYPE
+0x288 InterfaceGuid : _GUID
+0x298 ifConnectorPresent : UChar
+0x29c ifFlags : Uint4B
+0x2a0 MediaType : _NDIS_MEDIUM
+0x2a4 PhysicalMediumType : _NDIS_PHYSICAL_MEDIUM
+0x2a8 RodInfo : UChar
+0x2a8 CompartmentId : Uint4B
+0x2ac NetworkGuid : _GUID
+0x2bc ifAlias : _IF_COUNTED_STRING_LH
+0x4c0 ifOperStatus : _NET_IF_OPER_STATUS
+0x4c4 ifOperStatusFlags : Uint4B
+0x4c8 ifMtu : Uint4B
+0x4cc ifPhysAddress : _IF_PHYSICAL_ADDRESS_LH
+0x4ee PermanentPhysAddress : _IF_PHYSICAL_ADDRESS_LH
+0x510 ifAdminStatus : _NET_IF_ADMIN_STATUS
+0x518 XmitLinkSpeed : Uint8B
+0x520 RcvLinkSpeed : Uint8B
+0x528 ifPromiscuousMode : UChar
+0x529 ifDeviceWakeUpEnable : UChar
+0x52c MediaConnectState : _NET_IF_MEDIA_CONNECT_STATE
+0x530 MediaDuplexState : _NET_IF_MEDIA_DUPLEX_STATE
+0x538 Network : Ptr32 _NDIS_IF_NETWORK_BLOCK
+0x53c Compartment : Ptr32 _NDIS_IF_COMPARTMENT_BLOCK
+0x540 AsyncEvent : Ptr32 _KEVENT
+0x544 MiniportAsyncEvent : Ptr32 _KEVENT
+0x548 bNdisIsProvider : UChar
+0x549 MiniportPresent : UChar
+0x54c SupportedStatistics : Uint4B
vista 64 bit
dt ndis!_NDIS_IF_BLOCK
+0x000 Header : _NDIS_OBJECT_HEADER
+0x008 Link : _LIST_ENTRY
+0x018 ProviderLink : _LIST_ENTRY
+0x028 NetworkLink : _LIST_ENTRY
+0x038 ifRcvAddressTable : Ptr64 _NDIS_IF_RCV_ADDRESS
+0x040 ifRcvAddressCount : Uint4B
+0x044 LowerLayerIfCount : Uint4B
+0x048 HigherLayerIfCount : Uint4B
+0x04c Ref : Int4B
+0x050 MiniportRef : Int4B
+0x058 NetLuid : _NET_LUID_LH
+0x060 ProviderIfContext : Ptr64 Void
+0x068 ProviderHandle : Ptr64 _NDIS_IF_PROVIDER_BLOCK
+0x070 Flags : Uint4B
+0x074 PhysicalLocation : _NET_PHYSICAL_LOCATION_LH
+0x080 WanTunnelType : Uint4B
+0x084 PortNumber : Uint4B
+0x088 ifLastChange : Uint8B
+0x090 ifCounterDiscontinuityTime : Uint8B
+0x098 RosInfo : UChar
+0x098 ifIndex : Uint4B
+0x09c ifDescr : _IF_COUNTED_STRING_LH
+0x2a0 ifType : Uint2B
+0x2a4 AccessType : _NET_IF_ACCESS_TYPE
+0x2a8 DirectionType : _NET_IF_DIRECTION_TYPE
+0x2ac ConnectionType : _NET_IF_CONNECTION_TYPE
+0x2b0 InterfaceGuid : _GUID
+0x2c0 ifConnectorPresent : UChar
+0x2c4 ifFlags : Uint4B
+0x2c8 MediaType : _NDIS_MEDIUM
+0x2cc PhysicalMediumType : _NDIS_PHYSICAL_MEDIUM
+0x2d0 RodInfo : UChar
+0x2d0 CompartmentId : Uint4B
+0x2d4 NetworkGuid : _GUID
+0x2e4 ifAlias : _IF_COUNTED_STRING_LH
+0x4e8 ifOperStatus : _NET_IF_OPER_STATUS
+0x4ec ifOperStatusFlags : Uint4B
+0x4f0 ifMtu : Uint4B
+0x4f4 ifPhysAddress : _IF_PHYSICAL_ADDRESS_LH
+0x516 PermanentPhysAddress : _IF_PHYSICAL_ADDRESS_LH
+0x538 ifAdminStatus : _NET_IF_ADMIN_STATUS
+0x540 XmitLinkSpeed : Uint8B
+0x548 RcvLinkSpeed : Uint8B
+0x550 ifPromiscuousMode : UChar
+0x551 ifDeviceWakeUpEnable : UChar
+0x554 MediaConnectState : _NET_IF_MEDIA_CONNECT_STATE
+0x558 MediaDuplexState : _NET_IF_MEDIA_DUPLEX_STATE
+0x560 Network : Ptr64 _NDIS_IF_NETWORK_BLOCK
+0x568 Compartment : Ptr64 _NDIS_IF_COMPARTMENT_BLOCK
+0x570 AsyncEvent : Ptr64 _KEVENT
+0x578 MiniportAsyncEvent : Ptr64 _KEVENT
+0x580 bNdisIsProvider : UChar
+0x581 MiniportPresent : UChar
+0x584 SupportedStatistics : Uint4B
windows 7 32 bit
ndis!_NDIS_IF_BLOCK
+0x000 Header : _NDIS_OBJECT_HEADER
+0x004 Link : _LIST_ENTRY
+0x00c ProviderLink : _LIST_ENTRY
+0x014 NetworkLink : _LIST_ENTRY
+0x01c ifRcvAddressTable : Ptr32 _NDIS_IF_RCV_ADDRESS
+0x020 ifRcvAddressCount : Uint4B
+0x024 ifMaxRcvAddressCount : Uint4B
+0x028 LowerLayerIfCount : Uint4B
+0x02c HigherLayerIfCount : Uint4B
+0x030 Ref : Int4B
+0x034 MiniportRef : Int4B
+0x038 NetLuid : _NET_LUID_LH
+0x040 ProviderIfContext : Ptr32 Void
+0x044 ProviderHandle : Ptr32 _NDIS_IF_PROVIDER_BLOCK
+0x048 Flags : Uint4B
+0x04c PhysicalLocation : _NET_PHYSICAL_LOCATION_LH
+0x058 WanTunnelType : Uint4B
+0x05c PortNumber : Uint4B
+0x060 ifLastChange : Uint8B
+0x068 ifCounterDiscontinuityTime : Uint8B
+0x070 RosInfo : UChar
+0x070 ifIndex : Uint4B
+0x074 ifDescr : _IF_COUNTED_STRING_LH
+0x278 ifType : Uint2B
+0x27c AccessType : _NET_IF_ACCESS_TYPE
+0x280 DirectionType : _NET_IF_DIRECTION_TYPE
+0x284 ConnectionType : _NET_IF_CONNECTION_TYPE
+0x288 InterfaceGuid : _GUID
+0x298 ifConnectorPresent : UChar
+0x29c ifFlags : Uint4B
+0x2a0 MediaType : _NDIS_MEDIUM
+0x2a4 PhysicalMediumType : _NDIS_PHYSICAL_MEDIUM
+0x2a8 RodInfo : UChar
+0x2a8 CompartmentId : Uint4B
+0x2ac NetworkGuid : _GUID
+0x2bc ifAlias : _IF_COUNTED_STRING_LH
+0x4c0 ifOperStatus : _NET_IF_OPER_STATUS
+0x4c4 ifOperStatusFlags : Uint4B
+0x4c8 ifMtu : Uint4B
+0x4cc ifPhysAddress : _IF_PHYSICAL_ADDRESS_LH
+0x4ee PermanentPhysAddress : _IF_PHYSICAL_ADDRESS_LH
+0x510 ifAdminStatus : _NET_IF_ADMIN_STATUS
+0x518 XmitLinkSpeed : Uint8B
+0x520 RcvLinkSpeed : Uint8B
+0x528 ifPromiscuousMode : UChar
+0x529 ifDeviceWakeUpEnable : UChar
+0x52c MediaConnectState : _NET_IF_MEDIA_CONNECT_STATE
+0x530 MediaDuplexState : _NET_IF_MEDIA_DUPLEX_STATE
+0x538 Network : Ptr32 _NDIS_IF_NETWORK_BLOCK
+0x53c Compartment : Ptr32 _NDIS_IF_COMPARTMENT_BLOCK
+0x540 AsyncEvent : Ptr32 _KEVENT
+0x544 MiniportAsyncEvent : Ptr32 _KEVENT
+0x548 bNdisIsProvider : UChar
+0x549 MiniportPresent : UChar
+0x54c SupportedStatistics : Uint4B
+0x550 ifL2NetworkInfo : _IF_COUNTED_STRING_LH
windows 7 64 bit
dt ndis!_NDIS_IF_BLOCK
+0x000 Header : _NDIS_OBJECT_HEADER
+0x008 Link : _LIST_ENTRY
+0x018 ProviderLink : _LIST_ENTRY
+0x028 NetworkLink : _LIST_ENTRY
+0x038 ifRcvAddressTable : Ptr64 _NDIS_IF_RCV_ADDRESS
+0x040 ifRcvAddressCount : Uint4B
+0x044 ifMaxRcvAddressCount : Uint4B
+0x048 LowerLayerIfCount : Uint4B
+0x04c HigherLayerIfCount : Uint4B
+0x050 Ref : Int4B
+0x054 MiniportRef : Int4B
+0x058 NetLuid : _NET_LUID_LH
+0x060 ProviderIfContext : Ptr64 Void
+0x068 ProviderHandle : Ptr64 _NDIS_IF_PROVIDER_BLOCK
+0x070 Flags : Uint4B
+0x074 PhysicalLocation : _NET_PHYSICAL_LOCATION_LH
+0x080 WanTunnelType : Uint4B
+0x084 PortNumber : Uint4B
+0x088 ifLastChange : Uint8B
+0x090 ifCounterDiscontinuityTime : Uint8B
+0x098 RosInfo : UChar
+0x098 ifIndex : Uint4B
+0x09c ifDescr : _IF_COUNTED_STRING_LH
+0x2a0 ifType : Uint2B
+0x2a4 AccessType : _NET_IF_ACCESS_TYPE
+0x2a8 DirectionType : _NET_IF_DIRECTION_TYPE
+0x2ac ConnectionType : _NET_IF_CONNECTION_TYPE
+0x2b0 InterfaceGuid : _GUID
+0x2c0 ifConnectorPresent : UChar
+0x2c4 ifFlags : Uint4B
+0x2c8 MediaType : _NDIS_MEDIUM
+0x2cc PhysicalMediumType : _NDIS_PHYSICAL_MEDIUM
+0x2d0 RodInfo : UChar
+0x2d0 CompartmentId : Uint4B
+0x2d4 NetworkGuid : _GUID
+0x2e4 ifAlias : _IF_COUNTED_STRING_LH
+0x4e8 ifOperStatus : _NET_IF_OPER_STATUS
+0x4ec ifOperStatusFlags : Uint4B
+0x4f0 ifMtu : Uint4B
+0x4f4 ifPhysAddress : _IF_PHYSICAL_ADDRESS_LH
+0x516 PermanentPhysAddress : _IF_PHYSICAL_ADDRESS_LH
+0x538 ifAdminStatus : _NET_IF_ADMIN_STATUS
+0x540 XmitLinkSpeed : Uint8B
+0x548 RcvLinkSpeed : Uint8B
+0x550 ifPromiscuousMode : UChar
+0x551 ifDeviceWakeUpEnable : UChar
+0x554 MediaConnectState : _NET_IF_MEDIA_CONNECT_STATE
+0x558 MediaDuplexState : _NET_IF_MEDIA_DUPLEX_STATE
+0x560 Network : Ptr64 _NDIS_IF_NETWORK_BLOCK
+0x568 Compartment : Ptr64 _NDIS_IF_COMPARTMENT_BLOCK
+0x570 AsyncEvent : Ptr64 _KEVENT
+0x578 MiniportAsyncEvent : Ptr64 _KEVENT
+0x580 bNdisIsProvider : UChar
+0x581 MiniportPresent : UChar
+0x584 SupportedStatistics : Uint4B
+0x588 ifL2NetworkInfo : _IF_COUNTED_STRING_LH
Комментариев нет:
Отправить комментарий