精华内容
下载资源
问答
  • ARP表

    2014-06-20 17:43:47
    arp -a 查看arp表 存在路由器和机子

    arp -a 查看arp表  存在路由器和机子

    展开全文
  • 打印ARP表

    2019-09-13 12:13:10
    一、目的:打印ARP表项如下格式 二、流程 1.首先获取ARP表 2.获取IP表(利用IP表 将ARP表项中的适配器接口索引转化为IP地址 ) 3.打印出索引对应适配器上的ARP表项 三、实现代码 环境VS2015 ipexport.h ...

    一、目的:打印ARP表项如下格式


    142334_pXNL_3166429.png

    二、流程

    1.首先获取ARP表

    2.获取IP表(利用IP表  将ARP表项中的适配器接口索引转化为IP地址 )

    3. 打印出索引对应适配器上的ARP表项

    三、实现代码

    环境VS2015

    143530_bbvm_3166429.png

    ipexport.h

    #pragma once
    /********************************************************************/
    /**                     Microsoft LAN Manager                      **/
    /**     Copyright (c) Microsoft Corporation. All rights reserved.  **/
    /********************************************************************/
    /* :ts=4 */
    
    //** IPEXPORT.H - IP public definitions.
    //
    //  This file contains public definitions exported to transport layer and
    //  application software.
    //
    
    #ifndef IP_EXPORT_INCLUDED
    #define IP_EXPORT_INCLUDED  1
    
    #if _MSC_VER > 1000
    #pragma once
    #endif
    
    //
    // IP type definitions.
    //
    typedef ULONG IPAddr;       // An IP address.
    typedef ULONG IPMask;       // An IP subnet mask.
    typedef ULONG IP_STATUS;    // Status code returned from IP APIs.
    
    #ifndef s6_addr
    							//
    							// Duplicate these definitions here so that this file can be included by
    							// kernel-mode components which cannot include ws2tcpip.h, as well as
    							// by user-mode components which do.
    							//
    							/*
    							typedef struct in6_addr {
    							union {
    							UCHAR       Byte[16];
    							USHORT      Word[8];
    							} u;
    							} IN6_ADDR;
    
    							#define in_addr6 in6_addr
    							*/
    							//
    							// Defines to match RFC 2553.
    							//
    #define _S6_un      u
    #define _S6_u8      Byte
    #define s6_addr     _S6_un._S6_u8
    
    							//
    							// Defines for our implementation.
    							//
    #define s6_bytes    u.Byte
    #define s6_words    u.Word
    
    #endif
    
    typedef struct in6_addr IPv6Addr;
    
    /*INC*/
    
    //
    // The ip_option_information structure describes the options to be
    // included in the header of an IP packet. The TTL, TOS, and Flags
    // values are carried in specific fields in the header. The OptionsData
    // bytes are carried in the options area following the standard IP header.
    // With the exception of source route options, this data must be in the
    // format to be transmitted on the wire as specified in RFC 791. A source
    // route option should contain the full route - first hop thru final
    // destination - in the route data. The first hop will be pulled out of the
    // data and the option will be reformatted accordingly. Otherwise, the route
    // option should be formatted as specified in RFC 791.
    //
    
    typedef struct ip_option_information {
    	UCHAR   Ttl;                // Time To Live
    	UCHAR   Tos;                // Type Of Service
    	UCHAR   Flags;              // IP header flags
    	UCHAR   OptionsSize;        // Size in bytes of options data
    	PUCHAR  OptionsData;        // Pointer to options data
    } IP_OPTION_INFORMATION, *PIP_OPTION_INFORMATION;
    
    #if defined(_WIN64)
    
    typedef struct ip_option_information32 {
    	UCHAR   Ttl;
    	UCHAR   Tos;
    	UCHAR   Flags;
    	UCHAR   OptionsSize;
    	UCHAR * POINTER_32 OptionsData;
    } IP_OPTION_INFORMATION32, *PIP_OPTION_INFORMATION32;
    
    #endif // _WIN64
    
    //
    // The icmp_echo_reply structure describes the data returned in response
    // to an echo request.
    //
    
    typedef struct icmp_echo_reply {
    	IPAddr  Address;            // Replying address
    	ULONG   Status;             // Reply IP_STATUS
    	ULONG   RoundTripTime;      // RTT in milliseconds
    	USHORT  DataSize;           // Reply data size in bytes
    	USHORT  Reserved;           // Reserved for system use
    	PVOID   Data;               // Pointer to the reply data
    	struct ip_option_information Options; // Reply options
    } ICMP_ECHO_REPLY, *PICMP_ECHO_REPLY;
    
    #if defined(_WIN64)
    
    typedef struct icmp_echo_reply32 {
    	IPAddr  Address;
    	ULONG   Status;
    	ULONG   RoundTripTime;
    	USHORT  DataSize;
    	USHORT  Reserved;
    	VOID * POINTER_32 Data;
    	struct ip_option_information32 Options;
    } ICMP_ECHO_REPLY32, *PICMP_ECHO_REPLY32;
    
    #endif // _WIN64
    
    typedef struct arp_send_reply {
    	IPAddr  DestAddress;
    	IPAddr  SrcAddress;
    } ARP_SEND_REPLY, *PARP_SEND_REPLY;
    
    typedef struct tcp_reserve_port_range {
    	USHORT  UpperRange;
    	USHORT  LowerRange;
    } TCP_RESERVE_PORT_RANGE, *PTCP_RESERVE_PORT_RANGE;
    
    #define MAX_ADAPTER_NAME 128
    
    typedef struct _IP_ADAPTER_INDEX_MAP {
    	ULONG   Index;
    	WCHAR   Name[MAX_ADAPTER_NAME];
    } IP_ADAPTER_INDEX_MAP, *PIP_ADAPTER_INDEX_MAP;
    
    typedef struct _IP_INTERFACE_INFO {
    	LONG    NumAdapters;
    	IP_ADAPTER_INDEX_MAP Adapter[1];
    } IP_INTERFACE_INFO, *PIP_INTERFACE_INFO;
    
    typedef struct _IP_UNIDIRECTIONAL_ADAPTER_ADDRESS {
    	ULONG   NumAdapters;
    	IPAddr  Address[1];
    } IP_UNIDIRECTIONAL_ADAPTER_ADDRESS, *PIP_UNIDIRECTIONAL_ADAPTER_ADDRESS;
    
    typedef struct _IP_ADAPTER_ORDER_MAP {
    	ULONG   NumAdapters;
    	ULONG   AdapterOrder[1];
    } IP_ADAPTER_ORDER_MAP, *PIP_ADAPTER_ORDER_MAP;
    
    typedef struct _IP_MCAST_COUNTER_INFO {
    	ULONG64 InMcastOctets;
    	ULONG64 OutMcastOctets;
    	ULONG64 InMcastPkts;
    	ULONG64 OutMcastPkts;
    } IP_MCAST_COUNTER_INFO, *PIP_MCAST_COUNTER_INFO;
    
    //
    // IP_STATUS codes returned from IP APIs
    //
    
    #define IP_STATUS_BASE              11000
    
    #define IP_SUCCESS                  0
    #define IP_BUF_TOO_SMALL            (IP_STATUS_BASE + 1)
    #define IP_DEST_NET_UNREACHABLE     (IP_STATUS_BASE + 2)
    #define IP_DEST_HOST_UNREACHABLE    (IP_STATUS_BASE + 3)
    #define IP_DEST_PROT_UNREACHABLE    (IP_STATUS_BASE + 4)
    #define IP_DEST_PORT_UNREACHABLE    (IP_STATUS_BASE + 5)
    #define IP_NO_RESOURCES             (IP_STATUS_BASE + 6)
    #define IP_BAD_OPTION               (IP_STATUS_BASE + 7)
    #define IP_HW_ERROR                 (IP_STATUS_BASE + 8)
    #define IP_PACKET_TOO_BIG           (IP_STATUS_BASE + 9)
    #define IP_REQ_TIMED_OUT            (IP_STATUS_BASE + 10)
    #define IP_BAD_REQ                  (IP_STATUS_BASE + 11)
    #define IP_BAD_ROUTE                (IP_STATUS_BASE + 12)
    #define IP_TTL_EXPIRED_TRANSIT      (IP_STATUS_BASE + 13)
    #define IP_TTL_EXPIRED_REASSEM      (IP_STATUS_BASE + 14)
    #define IP_PARAM_PROBLEM            (IP_STATUS_BASE + 15)
    #define IP_SOURCE_QUENCH            (IP_STATUS_BASE + 16)
    #define IP_OPTION_TOO_BIG           (IP_STATUS_BASE + 17)
    #define IP_BAD_DESTINATION          (IP_STATUS_BASE + 18)
    
    //
    // Variants of the above using IPv6 terminology, where different
    //
    
    #define IP_DEST_NO_ROUTE            (IP_STATUS_BASE + 2)
    #define IP_DEST_ADDR_UNREACHABLE    (IP_STATUS_BASE + 3)
    #define IP_DEST_PROHIBITED          (IP_STATUS_BASE + 4)
    #define IP_DEST_PORT_UNREACHABLE    (IP_STATUS_BASE + 5)
    #define IP_HOP_LIMIT_EXCEEDED       (IP_STATUS_BASE + 13)
    #define IP_REASSEMBLY_TIME_EXCEEDED (IP_STATUS_BASE + 14)
    #define IP_PARAMETER_PROBLEM        (IP_STATUS_BASE + 15)
    
    //
    // IPv6-only status codes
    //
    
    #define IP_DEST_UNREACHABLE         (IP_STATUS_BASE + 40)
    #define IP_TIME_EXCEEDED            (IP_STATUS_BASE + 41)
    #define IP_BAD_HEADER               (IP_STATUS_BASE + 42)
    #define IP_UNRECOGNIZED_NEXT_HEADER (IP_STATUS_BASE + 43)
    #define IP_ICMP_ERROR               (IP_STATUS_BASE + 44)
    #define IP_DEST_SCOPE_MISMATCH      (IP_STATUS_BASE + 45)
    
    //
    // The next group are status codes passed up on status indications to
    // transport layer protocols.
    //
    #define IP_ADDR_DELETED             (IP_STATUS_BASE + 19)
    #define IP_SPEC_MTU_CHANGE          (IP_STATUS_BASE + 20)
    #define IP_MTU_CHANGE               (IP_STATUS_BASE + 21)
    #define IP_UNLOAD                   (IP_STATUS_BASE + 22)
    #define IP_ADDR_ADDED               (IP_STATUS_BASE + 23)
    #define IP_MEDIA_CONNECT            (IP_STATUS_BASE + 24)
    #define IP_MEDIA_DISCONNECT         (IP_STATUS_BASE + 25)
    #define IP_BIND_ADAPTER             (IP_STATUS_BASE + 26)
    #define IP_UNBIND_ADAPTER           (IP_STATUS_BASE + 27)
    #define IP_DEVICE_DOES_NOT_EXIST    (IP_STATUS_BASE + 28)
    #define IP_DUPLICATE_ADDRESS        (IP_STATUS_BASE + 29)
    #define IP_INTERFACE_METRIC_CHANGE  (IP_STATUS_BASE + 30)
    #define IP_RECONFIG_SECFLTR         (IP_STATUS_BASE + 31)
    #define IP_NEGOTIATING_IPSEC        (IP_STATUS_BASE + 32)
    #define IP_INTERFACE_WOL_CAPABILITY_CHANGE  (IP_STATUS_BASE + 33)
    #define IP_DUPLICATE_IPADD          (IP_STATUS_BASE + 34)
    
    #define IP_GENERAL_FAILURE          (IP_STATUS_BASE + 50)
    #define MAX_IP_STATUS               IP_GENERAL_FAILURE
    #define IP_PENDING                  (IP_STATUS_BASE + 255)
    
    
    //
    // Values used in the IP header Flags field.
    //
    #define IP_FLAG_DF      0x2         // Don't fragment this packet.
    
    //
    // Supported IP Option Types.
    //
    // These types define the options which may be used in the OptionsData field
    // of the ip_option_information structure.  See RFC 791 for a complete
    // description of each.
    //
    #define IP_OPT_EOL      0          // End of list option
    #define IP_OPT_NOP      1          // No operation
    #define IP_OPT_SECURITY 0x82       // Security option
    #define IP_OPT_LSRR     0x83       // Loose source route
    #define IP_OPT_SSRR     0x89       // Strict source route
    #define IP_OPT_RR       0x7        // Record route
    #define IP_OPT_TS       0x44       // Timestamp
    #define IP_OPT_SID      0x88       // Stream ID (obsolete)
    #define IP_OPT_ROUTER_ALERT 0x94  // Router Alert Option
    
    #define MAX_OPT_SIZE    40         // Maximum length of IP options in bytes
    
    #ifdef CHICAGO
    
    // Ioctls code exposed by Memphis tcpip stack.
    // For NT these ioctls are define in ntddip.h  (private\inc)
    
    #define IOCTL_IP_RTCHANGE_NOTIFY_REQUEST   101
    #define IOCTL_IP_ADDCHANGE_NOTIFY_REQUEST  102
    #define IOCTL_ARP_SEND_REQUEST             103
    #define IOCTL_IP_INTERFACE_INFO            104
    #define IOCTL_IP_GET_BEST_INTERFACE        105
    #define IOCTL_IP_UNIDIRECTIONAL_ADAPTER_ADDRESS        106
    
    #endif
    
    
    #endif // IP_EXPORT_INCLUDED
    
    

    iphlpapi.h

    /*++
    
    Copyright (c) Microsoft Corporation. All rights reserved.
    
    Module Name:
    
    iphlpapi.h
    
    Abstract:
    Header file for functions to interact with the IP Stack for MIB-II and
    related functionality
    
    --*/
    
    #ifndef __IPHLPAPI_H__
    #define __IPHLPAPI_H__
    
    #if _MSC_VER > 1000
    #pragma once
    #endif
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    	//
    	//                                                                          //
    	// IPRTRMIB.H has the definitions of the strcutures used to set and get     //
    	// information                                                              //
    	//                                                                          //
    	//
    
    #include <iprtrmib.h>
    #include "ipexport.h"
    #include "iptypes.h"
    
    	//
    	//                                                                          //
    	// The GetXXXTable APIs take a buffer and a size of buffer.  If the buffer  //
    	// is not large enough, the APIs return ERROR_INSUFFICIENT_BUFFER  and      //
    	// *pdwSize is the required buffer size                                     //
    	// The bOrder is a BOOLEAN, which if TRUE sorts the table according to      //
    	// MIB-II (RFC XXXX)                                                        //
    	//                                                                          //
    	//
    
    
    	//
    	//                                                                          //
    	// Retrieves the number of interfaces in the system. These include LAN and  //
    	// WAN interfaces                                                           //
    	//                                                                          //
    	//
    
    
    	DWORD
    		WINAPI
    		GetNumberOfInterfaces(
    			OUT PDWORD  pdwNumIf
    		);
    
    	//
    	//                                                                          //
    	// Gets the MIB-II ifEntry                                                  //
    	// The dwIndex field of the MIB_IFROW should be set to the index of the     //
    	// interface being queried                                                  //
    	//                                                                          //
    	//
    
    	DWORD
    		WINAPI
    		GetIfEntry(
    			IN OUT PMIB_IFROW   pIfRow
    		);
    
    	//
    	//                                                                          //
    	// Gets the MIB-II IfTable                                                  //
    	//                                                                          //
    	//
    
    	DWORD
    		WINAPI
    		GetIfTable(
    			OUT    PMIB_IFTABLE pIfTable,
    			IN OUT PULONG       pdwSize,
    			IN     BOOL         bOrder
    		);
    
    	//
    	//                                                                          //
    	// Gets the Interface to IP Address mapping                                 //
    	//                                                                          //
    	//
    
    	DWORD
    		WINAPI
    		GetIpAddrTable(
    			OUT    PMIB_IPADDRTABLE pIpAddrTable,
    			IN OUT PULONG           pdwSize,
    			IN     BOOL             bOrder
    		);
    
    	//
    	//                                                                          //
    	// Gets the current IP Address to Physical Address (ARP) mapping            //
    	//                                                                          //
    	//
    
    	DWORD
    		WINAPI
    		GetIpNetTable(
    			OUT    PMIB_IPNETTABLE pIpNetTable,
    			IN OUT PULONG          pdwSize,
    			IN     BOOL            bOrder
    		);
    
    	//
    	//                                                                          //
    	// Gets the IP Routing Table  (RFX XXXX)                                    //
    	//                                                                          //
    	//
    
    	DWORD
    		WINAPI
    		GetIpForwardTable(
    			OUT    PMIB_IPFORWARDTABLE pIpForwardTable,
    			IN OUT PULONG              pdwSize,
    			IN     BOOL                bOrder
    		);
    
    	//
    	//                                                                          //
    	// Gets TCP Connection/UDP Listener Table                                   //
    	//                                                                          //
    	//
    
    	DWORD
    		WINAPI
    		GetTcpTable(
    			OUT    PMIB_TCPTABLE pTcpTable,
    			IN OUT PDWORD        pdwSize,
    			IN     BOOL          bOrder
    		);
    
    	DWORD
    		WINAPI
    		GetUdpTable(
    			OUT    PMIB_UDPTABLE pUdpTable,
    			IN OUT PDWORD        pdwSize,
    			IN     BOOL          bOrder
    		);
    
    
    	//
    	//                                                                          //
    	// Gets IP/ICMP/TCP/UDP Statistics                                          //
    	//                                                                          //
    	//
    
    	DWORD
    		WINAPI
    		GetIpStatistics(
    			OUT  PMIB_IPSTATS   pStats
    		);
    
    	DWORD
    		WINAPI
    		GetIpStatisticsEx(
    			OUT  PMIB_IPSTATS   pStats,
    			IN   DWORD          dwFamily
    		);
    
    	DWORD
    		WINAPI
    		GetIcmpStatistics(
    			OUT PMIB_ICMP   pStats
    		);
    
    
    	DWORD
    		WINAPI
    		GetTcpStatistics(
    			OUT PMIB_TCPSTATS   pStats
    		);
    
    	DWORD
    		WINAPI
    		GetTcpStatisticsEx(
    			OUT PMIB_TCPSTATS   pStats,
    			IN  DWORD           dwFamily
    		);
    
    	DWORD
    		WINAPI
    		GetUdpStatistics(
    			OUT PMIB_UDPSTATS   pStats
    		);
    
    	DWORD
    		WINAPI
    		GetUdpStatisticsEx(
    			OUT PMIB_UDPSTATS   pStats,
    			IN  DWORD           dwFamily
    		);
    
    	//
    	//                                                                          //
    	// Used to set the ifAdminStatus on an interface.  The only fields of the   //
    	// MIB_IFROW that are relevant are the dwIndex (index of the interface      //
    	// whose status needs to be set) and the dwAdminStatus which can be either  //
    	// MIB_IF_ADMIN_STATUS_UP or MIB_IF_ADMIN_STATUS_DOWN                       //
    	//                                                                          //
    	//
    
    	DWORD
    		WINAPI
    		SetIfEntry(
    			IN PMIB_IFROW pIfRow
    		);
    
    	//
    	//                                                                          //
    	// Used to create, modify or delete a route.  In all cases the              //
    	// dwForwardIfIndex, dwForwardDest, dwForwardMask, dwForwardNextHop and     //
    	// dwForwardPolicy MUST BE SPECIFIED. Currently dwForwardPolicy is unused   //
    	// and MUST BE 0.                                                           //
    	// For a set, the complete MIB_IPFORWARDROW structure must be specified     //
    	//                                                                          //
    	//
    
    	DWORD
    		WINAPI
    		CreateIpForwardEntry(
    			IN PMIB_IPFORWARDROW pRoute
    		);
    
    	DWORD
    		WINAPI
    		SetIpForwardEntry(
    			IN PMIB_IPFORWARDROW pRoute
    		);
    
    	DWORD
    		WINAPI
    		DeleteIpForwardEntry(
    			IN PMIB_IPFORWARDROW pRoute
    		);
    
    	//
    	//                                                                          //
    	// Used to set the ipForwarding to ON or OFF (currently only ON->OFF is     //
    	// allowed) and to set the defaultTTL.  If only one of the fields needs to  //
    	// be modified and the other needs to be the same as before the other field //
    	// needs to be set to MIB_USE_CURRENT_TTL or MIB_USE_CURRENT_FORWARDING as  //
    	// the case may be                                                          //
    	//                                                                          //
    	//
    
    
    	DWORD
    		WINAPI
    		SetIpStatistics(
    			IN PMIB_IPSTATS pIpStats
    		);
    
    	//
    	//                                                                          //
    	// Used to set the defaultTTL.                                              //
    	//                                                                          //
    	//
    
    	DWORD
    		WINAPI
    		SetIpTTL(
    			UINT nTTL
    		);
    
    	//
    	//                                                                          //
    	// Used to create, modify or delete an ARP entry.  In all cases the dwIndex //
    	// dwAddr field MUST BE SPECIFIED.                                          //
    	// For a set, the complete MIB_IPNETROW structure must be specified         //
    	//                                                                          //
    	//
    
    	DWORD
    		WINAPI
    		CreateIpNetEntry(
    			IN PMIB_IPNETROW    pArpEntry
    		);
    
    	DWORD
    		WINAPI
    		SetIpNetEntry(
    			IN PMIB_IPNETROW    pArpEntry
    		);
    
    	DWORD
    		WINAPI
    		DeleteIpNetEntry(
    			IN PMIB_IPNETROW    pArpEntry
    		);
    
    	DWORD
    		WINAPI
    		FlushIpNetTable(
    			IN DWORD   dwIfIndex
    		);
    
    
    	//
    	//                                                                          //
    	// Used to create or delete a Proxy ARP entry. The dwIndex is the index of  //
    	// the interface on which to PARP for the dwAddress.  If the interface is   //
    	// of a type that doesnt support ARP, e.g. PPP, then the call will fail     //
    	//                                                                          //
    	//
    
    	DWORD
    		WINAPI
    		CreateProxyArpEntry(
    			IN  DWORD   dwAddress,
    			IN  DWORD   dwMask,
    			IN  DWORD   dwIfIndex
    		);
    
    	DWORD
    		WINAPI
    		DeleteProxyArpEntry(
    			IN  DWORD   dwAddress,
    			IN  DWORD   dwMask,
    			IN  DWORD   dwIfIndex
    		);
    
    	//
    	//                                                                          //
    	// Used to set the state of a TCP Connection. The only state that it can be //
    	// set to is MIB_TCP_STATE_DELETE_TCB.  The complete MIB_TCPROW structure   //
    	// MUST BE SPECIFIED                                                        //
    	//                                                                          //
    	//
    
    	DWORD
    		WINAPI
    		SetTcpEntry(
    			IN PMIB_TCPROW pTcpRow
    		);
    
    
    	DWORD
    		WINAPI
    		GetInterfaceInfo(
    			IN PIP_INTERFACE_INFO pIfTable,
    			OUT PULONG            dwOutBufLen
    		);
    
    	DWORD
    		WINAPI
    		GetUniDirectionalAdapterInfo(OUT PIP_UNIDIRECTIONAL_ADAPTER_ADDRESS pIPIfInfo,
    			OUT PULONG dwOutBufLen
    		);
    
    	//
    	//                                                                          //
    	// Gets the "best" outgoing interface for the specified destination address //
    	//                                                                          //
    	//
    
    	DWORD
    		WINAPI
    		GetBestInterface(
    			IN  IPAddr  dwDestAddr,
    			OUT PDWORD  pdwBestIfIndex
    		);
    
    	//
    	//                                                                          //
    	// Gets the best (longest matching prefix) route for the given destination  //
    	// If the source address is also specified (i.e. is not 0x00000000), and    //
    	// there are multiple "best" routes to the given destination, the returned  //
    	// route will be one that goes out over the interface which has an address  //
    	// that matches the source address                                          //
    	//                                                                          //
    	//
    
    	DWORD
    		WINAPI
    		GetBestRoute(
    			IN  DWORD               dwDestAddr,
    			IN  DWORD               dwSourceAddr, OPTIONAL
    			OUT PMIB_IPFORWARDROW   pBestRoute
    		);
    
    	DWORD
    		WINAPI
    		NotifyAddrChange(
    			OUT PHANDLE      Handle,
    			IN  LPOVERLAPPED overlapped
    		);
    
    
    	DWORD
    		WINAPI
    		NotifyRouteChange(
    			OUT PHANDLE      Handle,
    			IN  LPOVERLAPPED overlapped
    		);
    
    
    	DWORD
    		WINAPI
    		GetAdapterIndex(
    			IN LPWSTR  AdapterName,
    			OUT PULONG IfIndex
    		);
    
    	DWORD
    		WINAPI
    		AddIPAddress(
    			IPAddr  Address,
    			IPMask  IpMask,
    			DWORD   IfIndex,
    			PULONG  NTEContext,
    			PULONG  NTEInstance
    		);
    
    	DWORD
    		WINAPI
    		DeleteIPAddress(
    			ULONG NTEContext
    		);
    
    	DWORD
    		WINAPI
    		GetNetworkParams(
    			PFIXED_INFO pFixedInfo, PULONG pOutBufLen
    		);
    
    	DWORD
    		WINAPI
    		GetAdaptersInfo(
    			PIP_ADAPTER_INFO pAdapterInfo, PULONG pOutBufLen
    		);
    
    #ifdef _WINSOCK2API_
    
    	//
    	// The following functions require Winsock2.
    	//
    
    	DWORD
    		WINAPI
    		GetAdaptersAddresses(
    			ULONG Family,
    			DWORD Flags,
    			PVOID Reserved,
    			PIP_ADAPTER_ADDRESSES pAdapterAddresses,
    			PULONG pOutBufLen
    		);
    
    #endif
    
    	DWORD
    		WINAPI
    		GetPerAdapterInfo(
    			ULONG IfIndex, PIP_PER_ADAPTER_INFO pPerAdapterInfo, PULONG pOutBufLen
    		);
    
    	DWORD
    		WINAPI
    		IpReleaseAddress(
    			PIP_ADAPTER_INDEX_MAP  AdapterInfo
    		);
    
    
    	DWORD
    		WINAPI
    		IpRenewAddress(
    			PIP_ADAPTER_INDEX_MAP  AdapterInfo
    		);
    
    	DWORD
    		WINAPI
    		SendARP(
    			IPAddr DestIP,
    			IPAddr SrcIP,
    			PULONG pMacAddr,
    			PULONG  PhyAddrLen
    		);
    
    	BOOL
    		WINAPI
    		GetRTTAndHopCount(
    			IPAddr DestIpAddress,
    			PULONG HopCount,
    			ULONG  MaxHops,
    			PULONG RTT
    		);
    
    	DWORD
    		WINAPI
    		GetFriendlyIfIndex(
    			DWORD IfIndex
    		);
    
    	DWORD
    		WINAPI
    		EnableRouter(
    			HANDLE* pHandle,
    			OVERLAPPED* pOverlapped
    		);
    
    	DWORD
    		WINAPI
    		UnenableRouter(
    			OVERLAPPED* pOverlapped,
    			LPDWORD lpdwEnableCount OPTIONAL
    		);
    	DWORD
    		WINAPI
    		DisableMediaSense(
    			HANDLE *pHandle,
    			OVERLAPPED *pOverLapped
    		);
    
    	DWORD
    		WINAPI
    		RestoreMediaSense(
    			OVERLAPPED* pOverlapped,
    			LPDWORD lpdwEnableCount OPTIONAL
    		);
    
    	DWORD
    		WINAPI
    		GetIpErrorString(
    			IN IP_STATUS ErrorCode,
    			OUT PWCHAR Buffer,
    			IN OUT PDWORD Size
    		);
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif //__IPHLPAPI_H__
    #pragma once
    

    iptype.h

    /*++
    
    Copyright (c) Microsoft Corporation. All rights reserved.
    
    Module Name:
    
    iptypes.h
    
    --*/
    
    #ifndef IP_TYPES_INCLUDED
    #define IP_TYPES_INCLUDED
    
    #if _MSC_VER > 1000
    #pragma once
    #endif
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    #pragma warning(disable:4201)
    
    #include <time.h>
    
    	// Definitions and structures used by getnetworkparams and getadaptersinfo apis
    
    #define MAX_ADAPTER_DESCRIPTION_LENGTH  128 // arb.
    #define MAX_ADAPTER_NAME_LENGTH         256 // arb.
    #define MAX_ADAPTER_ADDRESS_LENGTH      8   // arb.
    #define DEFAULT_MINIMUM_ENTITIES        32  // arb.
    #define MAX_HOSTNAME_LEN                128 // arb.
    #define MAX_DOMAIN_NAME_LEN             128 // arb.
    #define MAX_SCOPE_ID_LEN                256 // arb.
    
    	//
    	// types
    	//
    
    	// Node Type
    
    #define BROADCAST_NODETYPE              1
    #define PEER_TO_PEER_NODETYPE           2
    #define MIXED_NODETYPE                  4
    #define HYBRID_NODETYPE                 8
    
    	//
    	// IP_ADDRESS_STRING - store an IP address as a dotted decimal string
    	//
    
    	typedef struct {
    		char String[4 * 4];
    	} IP_ADDRESS_STRING, *PIP_ADDRESS_STRING, IP_MASK_STRING, *PIP_MASK_STRING;
    
    	//
    	// IP_ADDR_STRING - store an IP address with its corresponding subnet mask,
    	// both as dotted decimal strings
    	//
    
    	typedef struct _IP_ADDR_STRING {
    		struct _IP_ADDR_STRING* Next;
    		IP_ADDRESS_STRING IpAddress;
    		IP_MASK_STRING IpMask;
    		DWORD Context;
    	} IP_ADDR_STRING, *PIP_ADDR_STRING;
    
    	//
    	// ADAPTER_INFO - per-adapter information. All IP addresses are stored as
    	// strings
    	//
    
    	typedef struct _IP_ADAPTER_INFO {
    		struct _IP_ADAPTER_INFO* Next;
    		DWORD ComboIndex;
    		char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];
    		char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];
    		UINT AddressLength;
    		BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];
    		DWORD Index;
    		UINT Type;
    		UINT DhcpEnabled;
    		PIP_ADDR_STRING CurrentIpAddress;
    		IP_ADDR_STRING IpAddressList;
    		IP_ADDR_STRING GatewayList;
    		IP_ADDR_STRING DhcpServer;
    		BOOL HaveWins;
    		IP_ADDR_STRING PrimaryWinsServer;
    		IP_ADDR_STRING SecondaryWinsServer;
    		time_t LeaseObtained;
    		time_t LeaseExpires;
    	} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;
    
    #ifdef _WINSOCK2API_
    
    	//
    	// The following types require Winsock2.
    	//
    
    	typedef enum {
    		IpPrefixOriginOther = 0,
    		IpPrefixOriginManual,
    		IpPrefixOriginWellKnown,
    		IpPrefixOriginDhcp,
    		IpPrefixOriginRouterAdvertisement,
    	} IP_PREFIX_ORIGIN;
    
    	typedef enum {
    		IpSuffixOriginOther = 0,
    		IpSuffixOriginManual,
    		IpSuffixOriginWellKnown,
    		IpSuffixOriginDhcp,
    		IpSuffixOriginLinkLayerAddress,
    		IpSuffixOriginRandom,
    	} IP_SUFFIX_ORIGIN;
    
    	typedef enum {
    		IpDadStateInvalid = 0,
    		IpDadStateTentative,
    		IpDadStateDuplicate,
    		IpDadStateDeprecated,
    		IpDadStatePreferred,
    	} IP_DAD_STATE;
    
    	typedef struct _IP_ADAPTER_UNICAST_ADDRESS {
    		union {
    			ULONGLONG Alignment;
    			struct {
    				ULONG Length;
    				DWORD Flags;
    			};
    		};
    		struct _IP_ADAPTER_UNICAST_ADDRESS *Next;
    		SOCKET_ADDRESS Address;
    
    		IP_PREFIX_ORIGIN PrefixOrigin;
    		IP_SUFFIX_ORIGIN SuffixOrigin;
    		IP_DAD_STATE DadState;
    
    		ULONG ValidLifetime;
    		ULONG PreferredLifetime;
    		ULONG LeaseLifetime;
    	} IP_ADAPTER_UNICAST_ADDRESS, *PIP_ADAPTER_UNICAST_ADDRESS;
    
    	typedef struct _IP_ADAPTER_ANYCAST_ADDRESS {
    		union {
    			ULONGLONG Alignment;
    			struct {
    				ULONG Length;
    				DWORD Flags;
    			};
    		};
    		struct _IP_ADAPTER_ANYCAST_ADDRESS *Next;
    		SOCKET_ADDRESS Address;
    	} IP_ADAPTER_ANYCAST_ADDRESS, *PIP_ADAPTER_ANYCAST_ADDRESS;
    
    	typedef struct _IP_ADAPTER_MULTICAST_ADDRESS {
    		union {
    			ULONGLONG Alignment;
    			struct {
    				ULONG Length;
    				DWORD Flags;
    			};
    		};
    		struct _IP_ADAPTER_MULTICAST_ADDRESS *Next;
    		SOCKET_ADDRESS Address;
    	} IP_ADAPTER_MULTICAST_ADDRESS, *PIP_ADAPTER_MULTICAST_ADDRESS;
    
    	//
    	// Per-address Flags
    	//
    #define IP_ADAPTER_ADDRESS_DNS_ELIGIBLE 0x01
    #define IP_ADAPTER_ADDRESS_TRANSIENT    0x02
    
    	typedef struct _IP_ADAPTER_DNS_SERVER_ADDRESS {
    		union {
    			ULONGLONG Alignment;
    			struct {
    				ULONG Length;
    				DWORD Reserved;
    			};
    		};
    		struct _IP_ADAPTER_DNS_SERVER_ADDRESS *Next;
    		SOCKET_ADDRESS Address;
    	} IP_ADAPTER_DNS_SERVER_ADDRESS, *PIP_ADAPTER_DNS_SERVER_ADDRESS;
    
    	//
    	// Per-adapter Flags
    	//
    #define IP_ADAPTER_DDNS_ENABLED            0x01
    #define IP_ADAPTER_REGISTER_ADAPTER_SUFFIX 0x02
    #define IP_ADAPTER_DHCP_ENABLED            0x04
    
    	//
    	// OperStatus values from RFC 2863
    	//
    	typedef enum {
    		IfOperStatusUp = 1,
    		IfOperStatusDown,
    		IfOperStatusTesting,
    		IfOperStatusUnknown,
    		IfOperStatusDormant,
    		IfOperStatusNotPresent,
    		IfOperStatusLowerLayerDown
    	} IF_OPER_STATUS;
    
    	typedef struct _IP_ADAPTER_ADDRESSES {
    		union {
    			ULONGLONG Alignment;
    			struct {
    				ULONG Length;
    				DWORD IfIndex;
    			};
    		};
    		struct _IP_ADAPTER_ADDRESSES *Next;
    		PCHAR AdapterName;
    		PIP_ADAPTER_UNICAST_ADDRESS FirstUnicastAddress;
    		PIP_ADAPTER_ANYCAST_ADDRESS FirstAnycastAddress;
    		PIP_ADAPTER_MULTICAST_ADDRESS FirstMulticastAddress;
    		PIP_ADAPTER_DNS_SERVER_ADDRESS FirstDnsServerAddress;
    		PWCHAR DnsSuffix;
    		PWCHAR Description;
    		PWCHAR FriendlyName;
    		BYTE PhysicalAddress[MAX_ADAPTER_ADDRESS_LENGTH];
    		DWORD PhysicalAddressLength;
    		DWORD Flags;
    		DWORD Mtu;
    		DWORD IfType;
    		IF_OPER_STATUS OperStatus;
    	} IP_ADAPTER_ADDRESSES, *PIP_ADAPTER_ADDRESSES;
    
    	//
    	// Flags used as argument to GetAdaptersAddresses()
    	//
    #define GAA_FLAG_SKIP_UNICAST      0x0001
    #define GAA_FLAG_SKIP_ANYCAST      0x0002
    #define GAA_FLAG_SKIP_MULTICAST    0x0004
    #define GAA_FLAG_SKIP_DNS_SERVER   0x0008
    
    #endif /* _WINSOCK2API_ */
    
    	//
    	// IP_PER_ADAPTER_INFO - per-adapter IP information such as DNS server list.
    	//
    
    	typedef struct _IP_PER_ADAPTER_INFO {
    		UINT AutoconfigEnabled;
    		UINT AutoconfigActive;
    		PIP_ADDR_STRING CurrentDnsServer;
    		IP_ADDR_STRING DnsServerList;
    	} IP_PER_ADAPTER_INFO, *PIP_PER_ADAPTER_INFO;
    
    	//
    	// FIXED_INFO - the set of IP-related information which does not depend on DHCP
    	//
    
    	typedef struct {
    		char HostName[MAX_HOSTNAME_LEN + 4];
    		char DomainName[MAX_DOMAIN_NAME_LEN + 4];
    		PIP_ADDR_STRING CurrentDnsServer;
    		IP_ADDR_STRING DnsServerList;
    		UINT NodeType;
    		char ScopeId[MAX_SCOPE_ID_LEN + 4];
    		UINT EnableRouting;
    		UINT EnableProxy;
    		UINT EnableDns;
    	} FIXED_INFO, *PFIXED_INFO;
    
    #pragma warning(default:4201)
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif
    #pragma once
    

    main.cpp

    //
    // main.cpp文件
    
    
    #include <stdio.h>
    #include <windows.h>
    #include "Iphlpapi.h"
    #include "conio.h"
    
    
    #pragma comment(lib, "Iphlpapi.lib")
    #pragma comment(lib, "WS2_32.lib")
    
    
    PMIB_IPNETTABLE MyGetIpNetTable(BOOL bOrder);
    void MyFreeIpNetTable(PMIB_IPNETTABLE pIpNetTable);
    PMIB_IPADDRTABLE MyGetIpAddrTable(BOOL bOrder);
    void MyFreeIpAddrTable(PMIB_IPADDRTABLE pIpAddrTable);
    BOOL InterfaceId2InterfaceIP(PMIB_IPADDRTABLE pIpAddrTable, DWORD dwIndex, char str[]);
    
    
    // 根据IP地址表,将接口索引转化为IP地址
    // pIpAddrTable是IP地址表
    // dwIndex是接口索引
    // 函数执行成功之后,str将包含接口的IP地址
    BOOL InterfaceId2InterfaceIP(PMIB_IPADDRTABLE pIpAddrTable, DWORD dwIndex, char str[])
    {
    	char* szIpAddr;
    
    	if (pIpAddrTable == NULL || str == NULL)
    		return FALSE;
    	str[0] = '\0';
    	// 遍历IP地址表,查找索引dwIndex对应的IP地址
    	for (DWORD dwIdx = 0; dwIdx < pIpAddrTable->dwNumEntries; dwIdx++)
    	{
    		if (dwIndex == pIpAddrTable->table[dwIdx].dwIndex)
    		{
    			// 以字符串的形式返回查询结果
    			szIpAddr = inet_ntoa(*((in_addr*)&pIpAddrTable->table[dwIdx].dwAddr));
    			if (szIpAddr)
    			{
    				strcpy(str, szIpAddr);
    				return TRUE;
    			}
    			else
    				return FALSE;
    		}
    	}
    	return FALSE;
    }
    
    //----------------------------------------------------------------------------
    //   ARP表将以如下格式打印出来:
    //
    //   Interface:                on Interface    Internet Address       Physical Address       Type
    //   Interface: 157.61.239.34  on Interface 2  159.61.230.39         00-aa-00-61-5d-a4     dynamic
    //  
    //   Interface: 157.54.178.219 on Interface 3  159.54.170.1          00-10-54-42-c0-88     dynamic
    //   Interface: 157.54.178.219 on Interface 3  159.54.170.113        00-aa-00-c0-80-2e     dynamic
    //----------------------------------------------------------------------------
    
    int main()
    {
    	DWORD i, dwCurrIndex;
    	char szPrintablePhysAddr[256];
    	char szType[128];
    	char szIpAddr[128];
    
    	// 首先获取ARP表
    	PMIB_IPNETTABLE pIpNetTable = MyGetIpNetTable(TRUE);
    	if (pIpNetTable == NULL)
    	{
    		printf("pIpNetTable == NULL in line %d\n", __LINE__);
    		return -1;
    	}
    
    	// 获取IP地址表,以便根据它将ARP表项中的接口索引转化为IP地址
    	PMIB_IPADDRTABLE pIpAddrTable = MyGetIpAddrTable(TRUE);
    
    	// 当前的适配器索引。注意,ARP表应该按照接口索引排序
    	/*
    	dwCurrIndex = pIpNetTable->table[0].dwIndex;
    	if (InterfaceId2InterfaceIP(pIpAddrTable, dwCurrIndex, szIpAddr))
    	{
    		printf("\nInterface: %s on Interface 0x%X\n", szIpAddr, dwCurrIndex);
    		printf("  Internet Address      Physical Address      Type      Interface number \n");
    	}
    	else
    	{
    		printf("Error: Could not convert Interface number 0x%X to IP address.\n",
    			pIpNetTable->table[0].dwIndex);
    		return -1;
    	}*/
    
    	printf("\n  Interface: xx.xx.xx.xx   on Interface 0xx Internet Address        Physical Address       Type      Interface number \n");
    	// 打印出索引为dwCurrIndex的适配器上的ARP表项
    
    	for (i = 0; i < pIpNetTable->dwNumEntries; ++i)
    	{
    		// 打印出此ARP表项中的数据
    
    		//表项适配器索引以及对应IP
    		dwCurrIndex = pIpNetTable->table[i].dwIndex;
    		if (!InterfaceId2InterfaceIP(pIpAddrTable, dwCurrIndex, szIpAddr)) {
    			printf("Error: Could not convert Interface number 0x%X to IP address.\n",
    				pIpNetTable->table[0].dwIndex);
    			continue;
    		}
    		// MAC地址
    		u_char *p = pIpNetTable->table[i].bPhysAddr;
    		wsprintf(szPrintablePhysAddr, "%02X-%02X-%02X-%02X-%02X-%02X", p[0], p[1], p[2], p[3], p[4], p[5]);
    		// IP地址
    		struct in_addr inadTmp;
    		inadTmp.s_addr = pIpNetTable->table[i].dwAddr;
    		// 类型	
    		switch (pIpNetTable->table[i].dwType)
    		{
    		case 1:
    			strcpy(szType, "other");
    			break;
    		case 2:
    			strcpy(szType, "invalidated");
    			break;
    		case 3:
    			strcpy(szType, "dynamic");
    			break;
    		case 4:
    			strcpy(szType, "static");
    			break;
    		default:
    			strcpy(szType, "invalidType");
    		}
    		printf("  Interface: %s on Interface 0x%X   %-16s      %-17s     %-11s     0x%X\n", szIpAddr, dwCurrIndex,inet_ntoa(inadTmp), szPrintablePhysAddr, szType,pIpNetTable->table[i].dwIndex);
    	}
    	getch();
    	return 0;
    }
    
    // 获取IP地址到适配器的映射关系,即ARP表
    
    PMIB_IPNETTABLE MyGetIpNetTable(BOOL bOrder)
    {
    	PMIB_IPNETTABLE pIpNetTable = NULL;
    	DWORD dwActualSize = 0;
    
    	// 查询所需缓冲区的大小
    	if (::GetIpNetTable(pIpNetTable,
    		&dwActualSize, bOrder) == ERROR_INSUFFICIENT_BUFFER)
    	{
    		// 为MIB_IPNETTABLE结构申请内存
    		pIpNetTable = (PMIB_IPNETTABLE)::GlobalAlloc(GPTR, dwActualSize);
    		// 获取ARP表
    		if (::GetIpNetTable(pIpNetTable,
    			&dwActualSize, bOrder) == NO_ERROR)
    		{
    			return pIpNetTable;
    		}
    		::GlobalFree(pIpNetTable);
    	}
    	return NULL;
    }
    
    void MyFreeIpNetTable(PMIB_IPNETTABLE pIpNetTable)
    {
    	if (pIpNetTable != NULL)
    		::GlobalFree(pIpNetTable);
    }
    
    
    PMIB_IPADDRTABLE MyGetIpAddrTable(BOOL bOrder)
    {
    	PMIB_IPADDRTABLE pIpAddrTable = NULL;
    	DWORD dwActualSize = 0;
    
    	// 查询所需缓冲区的大小
    	if (::GetIpAddrTable(pIpAddrTable,
    		&dwActualSize, bOrder) == ERROR_INSUFFICIENT_BUFFER)
    	{
    		// 为MIB_IPADDRTABLE结构申请内存
    		pIpAddrTable = (PMIB_IPADDRTABLE)::GlobalAlloc(GPTR, dwActualSize);
    		// 获取IP地址表
    		if (::GetIpAddrTable(pIpAddrTable,
    			&dwActualSize, bOrder) == NO_ERROR)
    			return pIpAddrTable;
    		::GlobalFree(pIpAddrTable);
    	}
    	return NULL;
    }
    
    void MyFreeIpAddrTable(PMIB_IPADDRTABLE pIpAddrTable)
    {
    	if (pIpAddrTable != NULL)
    		::GlobalFree(pIpAddrTable);
    }
    

    参考:l《Visual C++网络通信编程技术详解

    转载于:https://my.oschina.net/u/3166429/blog/918719

    展开全文
  • Python简单的ARP表阅读器 Python简单的ARP表阅读器 免费软件:BSD许可证 文档: : 。 特征 在Linux上将ARP表导出为字典。 用法 arp_table导出两个主要内容: ARPTABLE常量,与导入软件包时相同 get_arp_table()...
  • 2.1 动态ARP表项 2.2 静态ARP表项 2.3 短静态ARP表项 2.4 长静态ARP表项 1 ARP协议报文概述 ARP(Address Resolution Protocal,地址解析协议)是将IP地址解析为以太网的MAC地址(或者称为物理地址)的协议。在...

    目录

    1 ARP协议报文概述

    1.1 ARP/RARP报文格式

    1.2 ARP报文抓包

    1.2.1 arp请求

    1.2.2 arp应答

    2 ARP映射表

    2.1 动态ARP表项

    2.2 静态ARP表项

    2.3 短静态ARP表项

    2.4 长静态ARP表项

    3 ARP攻击(mac地址欺骗)


    1 ARP协议报文概述

    ARP(Address Resolution Protocal,地址解析协议)是将IP地址解析为以太网的MAC地址(或者称为物理地址)的协议。在局域网中,当主机或其他网络设备有数据要发送给另一个主机或设备时,它必须知道对方的网络层地址(即IP地址)。但是仅仅有IP地址还是不够的,因为IP数据报文必须封装成帧才能通过物理网络发送,因为发送站还必须有接收站的物理地址,所以需要一个从IP地址到物理地址的映射。ARP就是实现这个功能的协议。

    1.1 ARP/RARP报文格式

    ARP是一个独立的三层协议,所以ARP报文在向数据链路层传输时不需要经过IP协议的封装,而是直接生成自己的报文,其中包括ARP报头,到数据链路层后再由对应的数据链路层协议(如以太网协议)进行封装。ARP报文分为ARP请求和ARP应答报文两种,它们的报文格式可以统一为下图所示。
    ARP报文格式

    • 硬件类型:占两字节,表示ARP报文可以在哪种类型的网络上传输,值为1时表示为以太网地址。
    • 上层协议类型:占两字节,表示硬件地址要映射的协议地址类型,映射IP地址时的值为0x0800。
    • MAC地址长度:占一字节,标识MAC地址长度,以字节为单位,此处为6。
    • IP协议地址长度:占一字节,标识IP得知长度,以字节为单位,此处为4。
    • 操作类型:占2字节,指定本次ARP报文类型。1 标识ARP请求报文,2 标识ARP应答报文,3 标识RARP请求报文,4 标识RARP应答报文
    • 源MAC地址:占6字节,标识发送设备的硬件地址。
    • 源IP地址:占4字节,标识发送方设备的IP地址。
    • 目的MAC地址:占6字节,表示接收方设备的硬件地址,在请求报文中该字段值全为0,即00-00-00-00-00-00,表示任意地址,因为现在不知道这个MAC地址。
    • 目的IP地址:占4字节,表示接受方的IP地址。

    ARP报文不是直接在网络层上发送的,它还是需要向下传输到数据链路层,所以当ARP报文传输到数据链路层之后,需要再次进行封装。以以太网为例,ARP报文传输到以太网数据链路层后会形成ARP帧。ARP帧如下图所示,他就是在ARP报文前面加了一个以太网帧头。
    ARP帧格式

    以太网帧头的三个字段说明

    • 目的MAC地址:占6字节,如果是ARP请求帧,因为它是一个广播帧,所以要填上广播MAC地址(FF-FF-FF-FF-FF-FF),其目标主机是网络上的所有主机。
    • 源MAC地址:占6字节,这是发送ARP帧的节点MAC地址。
    • 帧类型:占两字节,这里用来标识帧封装的上层协议,因为本帧的数据部分是ARP报文,所以直接用ARP的协议号 0x0806 表示就可以了,而RARP的类型帧为0x8035。

    1.2 ARP报文抓包

    1.2.1 arp请求

    1.2.2 arp应答

    2 ARP映射表

    无论是主机,还是交换机都会有一个用来缓存同一网段设备IP地址和MAC地址的ARP映射表,用于数据帧的转发。设备通过ARP解析到目的MAC之后,将会在自己的ARP映射表中增加IP地址到MAC地址的映射表,以用于后续到同一目的地数据帧的转发。ARP表项分为动态ARP表项和静态ARP表项。

    [root@Node_A ~]# arp
    Address                  HWtype  HWaddress           Flags Mask            Iface
    10.228.90.1              ether   74:4a:a4:0f:07:fc   C                     eth9
    10.228.90.12             ether   00:22:93:75:9c:85   C                     eth9---|
    1.1.0.3                  ether   96:42:4f:e5:e5:31   CM                    tap0   |
    10.228.90.44             ether   74:85:c4:b0:31:65   C                     eth9   |
    192.168.1.12             ether   00:22:93:75:9c:85   C                     eth9---|
    [root@Node_A ~]#
    

    注意:arp表以ip地址为单位,当出现外部 pc的一个接口上配置两个 ip 地址时,本端会有两条arp表项,如上所示:192.168.1.12 、10.228.90.12均属同一个网口。

    2.1 动态ARP表项

    动态ARP表项由ARP协议通过ARP报文自动生成和维护,可以被老化,可以被新的ARP报文更新,也可以被静态ARP表项所覆盖。当到达老化时间或接口关闭时会删除相应的动态ARP表项。

    2.2 静态ARP表项

    静态ARP表项通过手工配置(通过对应设备的IP地址与MAC地址绑定命定进行)和维护。不会被老化,也不会被动态ARP表项覆盖。配置静态ARP表项可以增加通信的安全性,因为静态ARP可以限定和指定IP地址的设备通信时只使用指定的MAC地址(也就是我们通常所说的IP地址和MAC地址的绑定),此时攻击报文无法修改此表项的IP地址和MAC地址的映射关系,从而保护了本设备和指定设备间正常通信。静态ARP表项又分为短静态ARP表项和长静态ARP表项

    2.3 短静态ARP表项

    在配置短静态ARP表项时,只需要配置IP地址和MAC地址项。如果出接口是三层以太网接口,短静态ARP表项可以直接用于报文转发;如果出接口是VLAN虚接口,短静态ARP表项不能直接用于报文转发,当要发送IP数据包时,先发送ARP请求报文,如果收到的相应报文中的源IP地址和源MAC地址与所配置的IP地址和MAC地址相同,则将接受ARP响应报文的接口加入该静态表项中,之后就可以用于IP数据包的转发了。

    2.4 长静态ARP表项

    在配置长静态ARP表项时,除了配置IP地址和MAC地址项外,还必须配置该ARP表所对应的VLAN(虚拟局域网)和出接口。也就是长静态ARP表项同事绑定了IP地址、MAC地址、VLAN和端口,可以直接用于报文转发。

    3 ARP攻击(mac地址欺骗)

    以下转载《ARP原理和ARP***》

    ARP--在TCP/IP协议栈中,最不安全的协议莫过于ARP了,我们经常听到的网络扫描,内网渗透,流量欺骗等等,他们基本上都与ARP有关系,甚至可以说,他们的底层都是基于ARP实现的。但是ARP的是实现仅需一问一答的两个包即可,实现上很简单。

    新建 Microsoft Visio 绘图 (3).png

    我们知道,当PC1对PC2正常通信的时候(先别管攻击者PC3),PC2、PC1会先后建立对方的IP和MAC地址的映射(即建立ARP缓存表),同时对于交换机而言,它也具有记忆功能,会基于源MAC地址建立一个CAM缓存表(记录MAC对应接口的信息),理解为当PC1发送消息至交换机的Port1时,交换机会把源MAC(也就是MAC1)记录下来,添加一条MAC1和Port1的映射,之后交换机可以根据MAC帧的目的MAC进行端口转发,这个时候PC3只是处于监听状态,会把PC1的广播丢弃。

    正常的PC3会把广播包丢弃,同样的PC3可以抓住这一环节的漏洞,把不属于自己的广播包接收,同时回应一个虚假的回应包,告诉PC1我就是PC2(IP2-MAC3),这样PC1会收到两个回应包(一个正确的IP2-MAC2,一个虚假的IP2-MAC3),但是PC1并不知道到底哪个是真的,所以PC1会做出判断,并且判断后到达的为真,那么怎么让虚假的回应包后到达呢,PC3可以连续不断的发送这样的回应包,总会把哪个正确的回应包覆盖掉。

    而后PC1会建立IP2-MAC3这样一条ARP缓存条目,以后当PC1给PC2发送信息的时候,PC1依据OSI模型从上至下在网络层给数据封装目的IP为IP2的包头,在链路层通过查询ARP缓存表封装目的MAC为MAC3的数据帧,送至交换机,根据查询CAM表,发现MAC3对应的接口为Port3,就这样把信息交付到了PC3,完成了一次ARP攻击。

    新建 Microsoft Visio 绘图 (4).png

    如果ARP攻击严重话,会导致同一个局域网(也是同一个广播域)的所有主机的ARP缓存表中都存放着错误的IP和MAC的映射,如上图,每台主机的ARP缓存表中,不论哪个IP,都会映射到攻击者的MAC地址MAC1上,这样该局域网内的所有主机的消息都发送到Hacker的主机上。

    展开全文
  • 使用 Javascript 发送 ARP 数据包并读取 ARP 特征 发送具有完全控制权的 ARP 数据包。 解析操作系统 ARP ARP毒药会给定目标。 安装 npm install arpjs 用法 在您的代码中包含 arpjs var arp = require ...
  • arp命令 清arp表

    2015-06-25 13:41:00
    大量存在的时候 arp -n|awk '/^[1-9]/ {print arp -d $1}' | sh 清除所有arp表,以前用这个来清arp表貌会清空,没注意到存在incomplete。 今天同事发现arp-d后arp表中是incomplete。在大量IP的时候,arp-d就会存在...

    平常删除arp都用arp-d。大量存在的时候 arp -n|awk '/^[1-9]/ {print arp -d $1}' | sh 清除所有arp表,以前用这个来清arp表貌会清空,没注意到存在incomplete。 今天同事发现arp-d后arp表中是incomplete。在大量IP的时候,arp-d就会存在大量的incomplete。

    平常删除arp都用arp -d。大量存在的时候
    arp -n|awk '/^[1-9]/ {print "arp -d "$1}' | sh
    清除所有arp表,以前用这个来清arp表貌似会清空,没注意到存在incomplete。
    今天同事发现arp -d后arp表中是incomplete。在大量IP的时候,arp -d就会存在大量的incomplete。这个要arp到期了才会消失。但是arp表满了,无法ping了。这个时候需要如何解决呢?
    发现用ip link set arp off/on来解决是最好的。
    [root@localhost sbull]# arp -n
    Address HWtype HWaddress Flags Mask Iface
    10.66.20.38 ether 18:03:73:AF:A7:49 C eth0
    10.66.255.254 ether 10:8C:CF:20:85:C4 C eth0
    [root@localhost sbull]# arp -d 10.66.20.38
    [root@localhost sbull]# arp -n
    Address HWtype HWaddress Flags Mask Iface
    10.66.20.38 (incomplete) eth0
    10.66.255.254 ether 10:8C:CF:20:85:C4 C eth0
    [root@localhost sbull]# arp -d 10.66.20.38
    [root@localhost sbull]# arp -n
    Address HWtype HWaddress Flags Mask Iface
    10.66.20.38 (incomplete) eth0
    10.66.255.254 ether 10:8C:CF:20:85:C4 C eth0
    [root@localhost sbull]# ip link set arp off dev eth0
    [root@localhost sbull]# ip link set arp on dev eth0
    [root@localhost sbull]# arp -n
    [root@localhost sbull]# 
    本文链接http://www.cxybl.com/html/czxt/linux/20130112/35993.html

    转载于:https://www.cnblogs.com/zhouhbing/p/4599780.html

    展开全文
  • ARP协议报文格式及ARP表

    万次阅读 多人点赞 2017-05-12 12:45:25
    ARP协议报文格式及ARP表
  • ARP表和MAC表的区别

    千次阅读 2019-09-28 21:04:32
    1.arp表是三层设备才有的,如:路由器、主机电脑,arp:地址解析协议,已知目标ip地址来获取目标mac地址。mac表二层设备才有,如交换机。 2.arp表:阐述ip地址与mac地址的对应关系,而mac表:阐述mac地址与接口的...
  • ARP表 本文对这网络中的最关键的四个表项做一个详细介绍。 目录 1. 路由表(Routing Table)、转发表(Forwarding Table) 2.Mac表(Media Access Control Table) 2.1 地址学习线程: 2.2 报文转发线程: 3....
  • 监视ARP表并保存已知主机列表。 如果检测到新客户端(未存储在列表中),则使用发送通知,并将客户端添加到列表中。 用法: 在arp_alert.js中更改bot_api_key和client_key以匹配您的电报BOT值。 const bot_api_key...
  • MAC表和ARP表的老化时间:

    千次阅读 2020-08-20 18:07:18
    路由表:目的地址、网络掩码、下一条ip地址、...arp表:ip地址、对应的mac地址、ip地址类型 arp -a 命令用来查看计算机本地arp表 mac表:mac地址、出端口 MAC表老化时间 300S ARP表:思科是 5分钟,华为是 20分钟 ...
  • 监视 ARP 并通知更改。 使用包来查找节点。 深受包的启发。 例子 var arpMonitor = new ArpMonitor ( ) ; arpMonitor . on ( "in" , function ( node ) { console . log ( node . mac , node . ip ) ; } ...
  • 获取arp表条目

    2020-04-29 17:43:49
    https://segmentfault.com/a/1190000005365739 获取arp表条目
  • ARP表 MAC表 路由表

    千次阅读 2017-04-01 11:28:19
    ARP表是一个动态表,存储在计算机当中,目的是做一个ip地址与mac地址的对应。 假设在同一子网段,计算机A与计算机B通信 计算机A的ip地址192.168.0.1 MAC地址AA-AA-AA-AA-AA-AA 计算机B的ip地址已知192.168.0.2 ...
  • 通常获取ARP表的时候返回的是电脑的所有的ARP表项,有时候需要获取指定网口的ARP表项,但是ARP表项里面只有网口索引,并没有网口的名称,因此必须找到网口名称和网口索引之间的关系。本demo是先通过网口名称找到网口...
  • MAC表、ARP表和路由表

    2020-06-27 23:14:15
    MAC表、ARP表和路由表 1.mac表 a) MAC表(FDB表,2层):MAC地址—接口; b) 查看命令:show mac-address-table Vlan Mac Address Type Ports All 0100.0ccc.cccc STATIC CPU All 0100.0ccc.cccd STATIC CPU All ...
  • 获得ARP表

    2015-11-25 14:27:45
    // 获取ARP表  ULONG nSize = NULL;  PMIB_IPNETTABLE pMib = NULL;  GetIpNetTable(pMib ,&nSize, TRUE); // 获取缓冲区大小  pMib = (PMIB_IPNETTABLE)new BYTE[nSize]; // 申请缓冲区  // 获取ARP成功 ...
  • 关于arp表的网络问题

    2021-01-29 16:20:31
    不同设备的ARP表老化时间不同 Windows2000/XP系统ARP表项的老化时间是2分钟,95/98以及NT系统是10分钟, 大部分Cisco交换机是5分钟, 华为的设备一般是20分钟, 这些时间可以通过系统注册表或者设备的相关命令...
  • Android10无法读取arp表

    2020-11-06 17:55:06
    通过读取arp表获取局域网设备信息,10.0以下机型测试都没问题,可是10.0系统会报下面的异常: <p>java.io.FileNotFoundException: /proc/net/arp: open failed: EACCES (Permission denied) 有没有大神指导解决...
  • ARP表的作用 三路由控制表的作用 四ARP欺骗和ARP攻击原理 五制作ARP响应包测试ARP欺骗 六番外篇什么是DDOS攻击 二层交换机中只有MAC表; 三层交换机中有路由控制表和ARP表,局域网中是通过ARP表来进行数据转发...
  • ARP表、MAC表及路由表

    2017-09-05 14:28:00
    ARP表(2.5层):MAC地址——IP地址;路由表(FIB表,3层):网段——网关——出接口(网关路由);网段——出接口(直连路由);网络地址(主机路由)。 路由表是IP地址可达范围的一张表,相当于是网络里的地图...
  • 【RIB表与FIB表、ARP表与FDB表】

    千次阅读 2017-11-19 10:08:46
    RIB表与FIB表、ARP表与FDB表转自:http://blog.csdn.net/lanlicen/article/details/6333694RIB与FIB的区别: RIB:路由表 FIB:转发信息表 FIB表更多是出现在需要快速转发的路由器上,这种路由器上的路由表条目通常...
  • 作用 生成方式 ...数据封装(根据目的IP地址,查ARP表获取目的MAC地址,封装目的MAC地址信息) ARP请求、响应 IP、MAC、接口 PC机 IP路由表 网络层转发(路由器根据目的IP地址,查询IP路由表找...
  • 转发表、ARP表与路由表的在网络数据包转发功能中发挥的作用,以及它们协同工作的原理,顺便也会接着之前的文章继续谈谈交换机和路由器的一些事儿。 网络分层协议 计算机网络是将地理上隔离的计算节点从物理上相连(双...
  • 1. ARP表 ip地址与MAC地址的映射。 路由器的arp表中有MAC地址,IP地址,存在时间,类型,接口。 交换机的arp表如果仅仅是普通交换为空;如果……待研究 下面的介绍会有图。 2.MAC地址表 物理地址与接口的映射。 ...
  • Windows7 arp表删除方法

    千次阅读 2020-09-26 23:03:00
    Windows7 arp表删除方法1 使用arp命令删除新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居...
  • arp表与mac表的区别

    2012-05-11 11:11:12
    arp表与mac表区别 1、arp表是三层设备才有的,如:路由器、主机电脑,arp:地址解析协议,已知目标ip地址来获取目标mac地址。mac表二层设备才有,如交换机。 2、arp表:阐述ip地址与mac地址的对应关系,而mac表:...
  • linux清空arp表

    千次阅读 2014-12-12 18:05:00
    今天帮助同事解决一个问题,遇到一个新问题,清空arp表,Windows或者交换机上一个命令就搞定,Linux服务器上却没有找到这个命令,后来找了好久,终于找到一个好使的命令:ip neigh flush dev eth0 清空eth0的arp表 ...
  • 一个采集华为交换机ARP表并保存到Excel中的脚本。已经测试过93,35等交换机。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,754
精华内容 1,101
关键字:

arp表