zoukankan      html  css  js  c++  java
  • 实现: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

  • 相关阅读:
    2013第五周上机任务【项目1 三角形类(构造函数)】
    Google搜索小技巧
    项目总结:文件上传(MVC uploadify)
    Oracle 触发器 Update 不能操作本表的疑问
    【笔试题STL】求两个vector的交集
    Zookeeper(六)数据模型
    是的,我们真的在遭遇有史以来最大的DDoS攻击,并且还在加剧
    在MFC框架下使用osg报内存泄露的解决办法
    NetBeans 时事通讯(刊号 # 107 Jun 25, 2010)
    VS 2008中的C/C++静态代码分析工具Prefast
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/12288756.html
Copyright © 2011-2022 走看看