實現: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;
}

多線程實現的代碼: 這里保證線程安全用的是線程鎖

#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\n", (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\n", 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM