实现:ARP探测存活主机

学习:

1、对于IP的转换
2、MAC地址的转换

IN_ADDR结构:表示IPv4地址

typedef struct in_addr {
  union {
    struct {
      UCHAR s_b1;
      UCHAR s_b2;
      UCHAR s_b3;
      UCHAR s_b4;
    } S_un_b;
    struct {
      USHORT s_w1;
      USHORT s_w2;
    } S_un_w;
    ULONG S_addr;
  } S_un;
} IN_ADDR, *PIN_ADDR, *LPIN_ADDR;

SendARP:发送一个地址解析协议(ARP)请求,以获取该物理地址对应于指定的目标IPv4地址

IPHLPAPI_DLL_LINKAGE DWORD SendARP(
  IPAddr DestIP,
  IPAddr SrcIP,
  PVOID  pMacAddr,
  PULONG PhyAddrLen
);

单线程扫描实现代码:

#include<Windows.h>
#include <iphlpapi.h>
#include<stdio.h>
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"iphlpapi.lib")

bool WINAPI arpScan(in_addr mAddr) {
    ULONG MacArr[2];
    DWORD AddrLen = 6;

    if (SendARP(mAddr.S_un.S_addr, NULL, MacArr, &AddrLen) == NO_ERROR) {
        printf("存活IP:%s MAC:", inet_ntoa(mAddr));
        BYTE *bPhysAddr = (BYTE *) MacArr;
        for (int i = 0; i < (int)AddrLen; i++) {
            if (i == (AddrLen - 1))
                printf("%.2X\n", (int)bPhysAddr[i]);
            else
                printf("%.2X-", (int)bPhysAddr[i]);
        }
        return true;
    }
    return false;

}

int main(int argc, char * argv[]) {
    in_addr mAddr;
    char ipStart[] = "192.168.1.104";
    mAddr.S_un.S_addr = inet_addr(ipStart)
    arpScan(mAddr);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/zpchcbd/p/12288756.html