⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 activehostscan.cpp

📁 “网络安全技术实践与代码详解”实例代码
💻 CPP
字号:
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <iphlpapi.h>
#pragma comment (lib,"ws2_32.lib")
#pragma comment (lib,"iphlpapi.lib")
char StartIP[20]; //扫描起始IP地址
char EndIP[20]; //扫描结束IP地址
int      ProgressTag=0;    // 进度条标志位
// 解析命令行
void ParseCmd(int argc, char **argv)
{
	if(argc != 2)
	{
		printf("usage : ActiveHostScan.exe [StartIP-EndIP]");
		exit(0);
	}
	char *pdest;
    int result;
	ZeroMemory(StartIP,20);
	ZeroMemory(EndIP,20);
	int  ch = '-'; // 分隔符
	pdest = strchr( argv[1], ch );
    result = pdest - argv[1] + 1; // 寻找‘-’的位置
	strncpy(StartIP,argv[1],result-1); // 提取起始IP地址
	strncpy(EndIP,argv[1]+result,strlen(argv[1])-result); // 提取结束IP地址
}
// 定义进度提示函数 
void   ProgressShow(void)    
{     
	//   进度条     
	char   *progressbar[12]=     
	{     
		"   |   ",     
			"   /   ",     
			"   -   ",     
			"   \\   ",     
			"   |   ",     
			"   /   ",     
			"   -   ",     
			"   \\   ",     
			"   |   ",     
			"   /   ",     
			"   -   ",     
			"   \\   ",     
	};     
	printf("   =%s=\r",   progressbar[ProgressTag]);   
	ProgressTag=(ProgressTag==11)?0:ProgressTag+1;   
	Sleep(2);   
}     

// 扫描目标主机是否存活
int ScanHostState(char *ip)
{
	HRESULT hr;
    IPAddr  ipAddr;
    ULONG   pulMac[2];// MAC地址
    ULONG   ulLen;
    char *szMac;
    // 转换成网络字节顺序
    ipAddr = inet_addr (ip);
	// 设置MAC地址为广播地址0xff 
    memset (pulMac, 0xff, sizeof (pulMac));
    ulLen = 6;
    hr = SendARP (ipAddr, 0, pulMac, &ulLen);
	// 如果返回无错则表明指定目标主机存活
    if(hr == NO_ERROR)
	{
		size_t i, j;
		szMac = new char[ulLen*3];
		PBYTE pbHexMac = (PBYTE) pulMac;

		// 转换MAC地址为字符串格式以便输出
		for (i = 0, j = 0; i < ulLen - 1; ++i) {
			j += sprintf (szMac + j, "%02X:", pbHexMac[i]);
		}
		sprintf (szMac + j, "%02X", pbHexMac[i]);
		printf ("主机 %s 响应!  MAC地址: %s\n",ip, szMac);
		delete [] szMac;
		return 1;
	}
    return 0;

}
// 主函数
int  main(int argc, char **argv)
{
    // 解析命令行
	ParseCmd(argc,argv);
    struct   in_addr  targetaddr; // 目标机地址结构
	unsigned long ips=inet_addr(StartIP); //计算起始IP地址的网络字节
	unsigned long ipe=inet_addr(EndIP); // 计算结束IP地址的网络字节
	ips=ntohl(ips); // 计算起始IP地址的主机字节
	ipe=ntohl(ipe); // 计算结束IP地址的主机字节
	DWORD dwStart = GetTickCount(); //记录开始时间
	// 开始循环探测主机
	for(int k=ips;k<=ipe;k++)
	{      
		ProgressShow();
		targetaddr.S_un.S_addr=htonl(k);
		// 探测指定主机是否存活
		ScanHostState(inet_ntoa(targetaddr));
		Sleep(10);
	}
	printf("\n探测消耗时间:%d ms \n",GetTickCount()-dwStart);

    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -