• 实现: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
    ", (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;
    }
    

    多线程实现的代码: 这里保证线程安全用的是线程锁

    #include<Windows.h>
    #include <iphlpapi.h>
    #include<stdio.h>
    #pragma comment(lib,"ws2_32.lib")
    #pragma comment(lib,"iphlpapi.lib")
    
    
    CRITICAL_SECTION myLock;
    
    bool WINAPI arpScan(in_addr mAddr);
    
    
    DWORD WINAPI ThreadProc(LPVOID lpParameter) {
    	in_addr addr;
    	addr.S_un.S_addr = (ULONG)lpParameter;
    	arpScan(addr);
    
    	return 0;
    }
    
    
    bool WINAPI arpScan(in_addr mAddr) {
    	ULONG MacArr[2];
    	DWORD AddrLen = 6;
    	EnterCriticalSection(&myLock);
    	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
    ", (int)bPhysAddr[i]);
    			else
    				printf("%.2X-", (int)bPhysAddr[i]);
    		}
    		LeaveCriticalSection(&myLock);
    		return true;
    	}
    	return false;
    
    }
    
    int main(int argc, char * argv[]) {
    	InitializeCriticalSection(&myLock);
    	in_addr mAddrStart;
    	in_addr mAddrEnd;
    
    	mAddrStart.S_un.S_addr = inet_addr("192.168.1.1");  //inet_addr转换包含IPv4的字符串点分十进制地址转换成一个适当的地址 IN_ADDR结构
    	mAddrEnd.S_un.S_addr = inet_addr("192.168.1.255");  //inet_addr转换包含IPv4的字符串点分十进制地址转换成一个适当的地址 IN_ADDR结构
    
    	for (in_addr i = mAddrStart;i.S_un.S_un_b.s_b4<mAddrEnd.S_un.S_un_b.s_b4; i.S_un.S_un_b.s_b4++) {
    		printf("%s
    ", inet_ntoa(i));
    		CreateThread(NULL, 0, ThreadProc, (LPVOID)i.S_un.S_addr, 0, NULL);
    	}
    
    	Sleep(5000);
    	return 0;
    }
    

    参考文章:https://blog.51cto.com/0x007/1619183
    参考文章:https://www.cnblogs.com/17bdw/p/6166497.html

  • 相关阅读:
    运维自动化轻量级工具pssh
    Linux下的tar压缩解压缩命令详解
    [shell] while read line 与for循环的区别
    Linux sed命令
    [转]linux awk命令详解
    Centos7上部署openstack ocata配置详解
    自动化运维工具——puppet详解(一)
    OpenStack 初探(一) -- All-In-One模式部署(初学OpenStack必备)
    shell中的重定向(输入输出)
    vim批量注释和反注释快捷键
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/12288756.html
Copyright © 2020-2023  润新知