1. 程式人生 > >使用 SendARP 獲五分彩平臺出租取 MAC 地址

使用 SendARP 獲五分彩平臺出租取 MAC 地址

-i print 流量 這樣的 soc 由器 pri resp mean

地址解五分彩平臺出租 haozbbs.com Q1446595067析協議(ARP)是通過解析網路層地址來找尋數據鏈路層地址的一個在網絡協議包中極其重要的網絡傳輸協議。ARP 最初在 1982 年的 RFC 826 中提出並納入互聯網標準 STD 37. ARP 也可能指是在多數操作系統中管理其相關地址的一個進程。

ARP 是通過網絡地址(例:IPv4)來定位 MAC 地址(也稱為乙太地址)。ARP 已經在很多網路層和數據鏈接層之間得以實現,包括:IPv4,Chaosnet,DECnet 和 Xerox PARC Universal Packet (PUP) 使用 IEEE 802 標準,光纖分布式數據接口,X.25,幀中繼和異步傳輸模式(ATM),IEEE 802.3 和 IEEE 802.11 標準上 IPv4 占了多數流量。

在 IPv6 中鄰居發現協議(NDP)用於代替地址解析協議。
ARP 基本原理

在每臺安裝有 TCP/IP 協議的計算機或路由器裏都有一個 ARP 緩存表,表裏的 IP 地址與 MAC 地址是一對應的,如下表所示:
主機名稱 IP 地址 MAC 地址
A 192.168.38.10 00-AA-00-62-D2-02
B 192.168.38.11 00-BB-00-62-C2-02
C 192.168.38.12 00-CC-00-62-C2-02
D 192.168.38.13 00-DD-00-62-C2-02
E 192.168.38.14 00-EE-00-62-C2-02
… … …

以主機 A(192.168.38.10)向主機 B(192.168.38.11)發送數據為例:

當發送數據時,主機 A 會在自己的 ARP 緩存表中尋找是否有目標 IP 地址。如果找到就知道目標 MAC 地址為(00-BB-00-62-C2-02),直接把目標 MAC 地址寫入幀裏面發送就可。

如果在 ARP 緩存表中沒有找到相對應的IP地址,主機 A 就會在網絡上發送一個廣播(ARP request),目標 MAC 地址是“FF.FF.FF.FF.FF.FF”,這表示向同一網段內的所有主機發出這樣的詢問:“192.168.38.11 的 MAC 地址是什麽?”

網絡上其他主機並不響應ARP詢問,只有主機 B 接收到這個幀時,才向主機 A 做出這樣的回應(ARP response):“192.168.38.11 的 MAC 地址是 00-BB-00-62-C2-02”,此回應以單播方式。這樣,主機A就知道主機 B 的 MAC 地址,它就可以向主機B發送信息。同時它還更新自己的 ARP 高速緩存(ARP cache),下次再向主機B發送信息時,直接從 ARP 緩存表裏查找就可。

ARP 緩存表采用老化機制,在一段時間內如果表中的某一行沒有使用,就會被刪除,這樣可以大大減少 ARP 緩存表的長度,加快查詢速度。
SendARP 函數

SendARP 函數通過發送一個地址解析協議(ARP)請求,來獲得與指定的目的地 IPv4 地址相對應的物理地址。

語法格式如下:

DWORD SendARP(
In IPAddr DestIP,
In IPAddr SrcIP,
Out PULONG pMacAddr,
Inout PULONG PhyAddrLen
);

1
2
3
4
5
6

四個參數分別是:目的 IP 地址、源 IP 地址(一般默認為 0)、物理地址緩沖區指針、以及緩沖區長度。
獲取 MAC 地址

獲取與指定的 IPv4 地址相關聯的硬件或 MAC 地址:

SendARP

代碼如下:

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <stdlib.h>

#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")

void usage(char *pname)
{
printf("Usage: %s [options] ip-address\n", pname);
printf("\t -h \t\thelp\n");
printf("\t -l length \tMAC physical address length to set\n");
printf("\t -s src-ip \tsource IP address\n");
exit(1);
}

int __cdecl main(int argc, char *argv)
{
DWORD dwRetVal;
IPAddr DestIp = 0;
IPAddr SrcIp = 0; /
default for src ip /
ULONG MacAddr[2]; /
for 6-byte hardware addresses /
ULONG PhysAddrLen = 6; /
default to length of six bytes */

char *DestIpString = NULL;
char *SrcIpString = NULL;

BYTE *bPhysAddr;
unsigned int i;

if (argc > 1) {
    for (i = 1; i < (unsigned int) argc; i++) {
        if ((argv[i][0] == ‘-‘) || (argv[i][0] == ‘/‘)) {
            switch (tolower(argv[i][1])) {
            case ‘l‘:
                PhysAddrLen = (ULONG) atol(argv[++i]);
                break;
            case ‘s‘:
                SrcIpString = argv[++i];
                SrcIp = inet_addr(SrcIpString);
                break;
            case ‘h‘:
            default:
                usage(argv[0]);
                break;
            }               /* end switch */
        } else
            DestIpString = argv[i];
    }                       /* end for */
} else
    usage(argv[0]);

if (DestIpString == NULL || DestIpString[0] == ‘\0‘)
    usage(argv[0]);

DestIp = inet_addr(DestIpString);

memset(&MacAddr, 0xff, sizeof (MacAddr));

printf("Sending ARP request for IP address: %s\n", DestIpString);

dwRetVal = SendARP(DestIp, SrcIp, &MacAddr, &PhysAddrLen);

if (dwRetVal == NO_ERROR) {
    bPhysAddr = (BYTE *) & MacAddr;
    if (PhysAddrLen) {
        for (i = 0; i < (int) PhysAddrLen; i++) {
            if (i == (PhysAddrLen - 1))
                printf("%.2X\n", (int) bPhysAddr[i]);
            else
                printf("%.2X-", (int) bPhysAddr[i]);
        }
    } else
        printf
            ("Warning: SendArp completed successfully, but returned length=0\n");

} else {
    printf("Error: SendArp failed with error: %d", dwRetVal);
    switch (dwRetVal) {
    case ERROR_GEN_FAILURE:
        printf(" (ERROR_GEN_FAILURE)\n");
        break;
    case ERROR_INVALID_PARAMETER:
        printf(" (ERROR_INVALID_PARAMETER)\n");
        break;
    case ERROR_INVALID_USER_BUFFER:
        printf(" (ERROR_INVALID_USER_BUFFER)\n");
        break;
    case ERROR_BAD_NET_NAME:
        printf(" (ERROR_GEN_FAILURE)\n");
        break;
    case ERROR_BUFFER_OVERFLOW:
        printf(" (ERROR_BUFFER_OVERFLOW)\n");
        break;
    case ERROR_NOT_FOUND:
        printf(" (ERROR_NOT_FOUND)\n");
        break;
    default:
        printf("\n");
        break;
    }
}

return 0;

}

使用 SendARP 獲五分彩平臺出租取 MAC 地址