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

📄 jiemiandlg.cpp

📁 此程序可以扫描多的IP和端口。另外可以多线程训话扫描
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//	返回:UINT
//************************************************************
UINT ThreadScan(LPVOID pParam)
{
	threadInfo *thInfo = (threadInfo*)pParam;
	CString strIPAddress = thInfo->strIP;
	HTREEITEM hItem = thInfo->hCurItem;
	//在内部重新打开互斥量
	HANDLE hCounterIn=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"sam sp 44");
	WaitForSingleObject(hCounterIn,INFINITE);
	UINT v=m_nCounter;
	m_nCounter++;
	ReleaseMutex(hCounterIn);
	CloseHandle(hCounterIn);
	int IpPort;
	IpPort=v;
	CString pPort;
	pPort.Format("%d",IpPort);
	SetDlgItemText(hDlg,IDC_SCANIP,strIPAddress);
	SetDlgItemText(hDlg,IDC_SCANPORT,pPort);
	if (bIsSYN)
	{
		CSYNPing ObjSYN;
		//CSYPing::Ping 返回2时表示正在开放此端口
		if (ObjSYN.Ping((LPSTR)(LPCSTR)strIPAddress,IpPort) == 2)
		{
			m_GbTree->InsertItem(pPort,1,1,hItem);
			m_GbTree->Expand(hItem,TVE_EXPAND);
		}
	}
	else
	{
		struct sockaddr_in sin;
		// Create the local socket
		SOCKET sd = socket (AF_INET, SOCK_STREAM, IPPROTO_IP);
		if (sd == INVALID_SOCKET) 
		{
			SetDlgItemText(hDlg,IDC_PINGIP,"error");
			printf("Create socket error!");
			return 1;
		}
		// Connect to the victim IP Address
		sin.sin_family=AF_INET;
		sin.sin_addr.s_addr=inet_addr((LPSTR)(LPCSTR)strIPAddress);
		sin.sin_port=htons((short)IpPort);
		if (connect (sd, (struct sockaddr *)&sin, sizeof (sin)) == SOCKET_ERROR) 
		{
			//	AfxMessageBox("Connect the remote IP error!");
			closesocket (sd);
			return 1;
		}
		else
		{
			m_GbTree->InsertItem(pPort,1,1,hItem);
			m_GbTree->Expand(hItem,TVE_EXPAND);
			
		}
		closesocket (sd);
	}
	
	return TRUE;
}
//************************************************************
//	函数名:ThreadManager
//	功能描述:组织ping和扫描多个IP
//	参数:LPVOID pParam
//	返回:UINT
//************************************************************
UINT ThreadManager(LPVOID pParam)
{
	CJIEMIANDlg *dlg=(CJIEMIANDlg*)AfxGetApp()->GetMainWnd();
	HANDLE hCounter=NULL;
	if( (hCounter=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"sam sp 44"))==NULL)
	{
		//如果没有其他进程创建这个互斥量,则重新创建
		hCounter = CreateMutex(NULL,FALSE,"sam sp 44");
	}
	if (!bIsScanByhand)
	{
		PingHost();
		dlg->m_pingIP.SetWindowText("");
		
		CWinThread *pT[201];
		HANDLE hThread[201];
		int v;
		if(nStartPort==nEndPort)
		{
			v=1;
		}
		else
		{
			v=(nEndPort-nStartPort+1)/nThreadCount;
			if((nEndPort-nStartPort+1)%nThreadCount > 0)
			{
				v++;
			}
		}
		HTREEITEM tempItem = m_GbTree->GetNextItem(m_hRoot,TVGN_NEXT);
		while(tempItem != NULL)
		{
			int nImage,nSelectedImage ;
			if (!m_GbTree->GetItemImage(tempItem,nImage,nSelectedImage))
			{
				tempItem = m_GbTree->GetNextItem(tempItem,TVGN_NEXT);
				continue;
			}
			if (nImage==3)
			{
				tempItem = m_GbTree->GetNextItem(tempItem,TVGN_NEXT);
				continue;
			}
			CString strTemp = m_GbTree->GetItemText(tempItem);
			m_nCounter = nStartPort;
			for(int i=0; i <= v; i++)
			{
				int nThreadCounter=0;//每次批量创建的线程实际个数,最后一次是一个余数值
				int k;
				for(k=0;k<nThreadCount;k++)
				{
					if(m_nCounter>nEndPort)
					{
						break;
					}
					if (bIsStopPing)
					{
						SetDlgItemText(hDlg,IDC_SCANIP,"");
						SetDlgItemText(hDlg,IDC_SCANPORT,"");
						AfxEndThread(0);
						break;
					}
					//内循环计数
					nThreadCounter++;
					dlg->m_progressScan.StepIt();
					threadInfo thInfo;
					thInfo.hCurItem = tempItem;
					thInfo.strIP = strTemp;
					
					pT[k]=AfxBeginThread((AFX_THREADPROC)ThreadScan,&thInfo);
					hThread[k]=pT[k]->m_hThread;
					
					Sleep(10);
				}
				
				hThread[k]=NULL;//非常重要,如果不加这一句的话,会经常出错,有点奇怪
				//如果k=0,表示没有开启线程
				if(k!=0)
				{
					//WaitForMultipleObjects(nThreadCounter,hThread,TRUE,INFINITE);
					WaitForMultipleObjects(nThreadCounter,hThread,TRUE,500);
				}
				
			}
			tempItem = m_GbTree->GetNextItem(tempItem,TVGN_NEXT);
		}
		CloseHandle(hCounter);
		//设置提示
		//	dlg->StateInital();
		dlg->m_startScan.EnableWindow(true);
		dlg->m_stopScan.EnableWindow(false);
		SetDlgItemText(hDlg,IDC_SCANIP,"");
		SetDlgItemText(hDlg,IDC_SCANPORT,"");
		AfxEndThread(0);
		return TRUE;
	}
	else
	{
		if (!bIsSpecScan)
		{
			PingHost();
			dlg->m_pingIP.SetWindowText("");
			return true;
		}
		if (bIsFocused == false)
			return TRUE;
		//先清除原来的扫描结果
		HTREEITEM tempItem1 = m_hCurrentItem;
		if (m_GbTree->GetParentItem(tempItem1)!=NULL)
			return true;
		HTREEITEM tempItem2 =  m_GbTree->GetChildItem(tempItem1);
		while(tempItem2 != NULL)
		{
			m_GbTree->DeleteItem(tempItem2);
			tempItem2 = m_GbTree->GetChildItem(tempItem1);
		}
		CWinThread *pT[201];
		HANDLE hThread[201];
		int v;
		if(nStartPort==nEndPort)
		{
			v=1;
		}
		else
		{
			v=(nEndPort-nStartPort+1)/nThreadCount;
			if((nEndPort-nStartPort+1)%nThreadCount > 0)
			{
				v++;
			}
		}
		
		int nImage,nSelectedImage ;
		if (!m_GbTree->GetItemImage(tempItem1,nImage,nSelectedImage))
		{
			return true;
		}
		if (nImage==3)
		{
			return true;
		}
		CString strTemp = m_GbTree->GetItemText(tempItem1);
		m_nCounter = nStartPort;
		
		for(int i=0; i <= v; i++)
		{
			int nThreadCounter=0;//每次批量创建的线程实际个数,最后一次是一个余数值
			int k;
			for(k=0;k<nThreadCount;k++)
			{
				if (bIsStopPing)
				{
					SetDlgItemText(hDlg,IDC_SCANIP,"");
					SetDlgItemText(hDlg,IDC_SCANPORT,"");
					AfxEndThread(0);
					break;
				}
				if(m_nCounter>nEndPort)
				{
					break;
				}
				
				//内循环计数
				nThreadCounter++;
				dlg->m_progressScan.StepIt();
				threadInfo thInfo;
				thInfo.hCurItem = tempItem1;
				thInfo.strIP = strTemp;
				
				pT[k]=AfxBeginThread((AFX_THREADPROC)ThreadScan,&thInfo);
				hThread[k]=pT[k]->m_hThread;
				
				Sleep(10);
			}
			
			hThread[k]=NULL;//非常重要,如果不加这一句的话,会经常出错,有点奇怪
			//如果k=0,表示没有开启线程
			if(k!=0)
			{
				//WaitForMultipleObjects(nThreadCounter,hThread,TRUE,INFINITE);
				WaitForMultipleObjects(nThreadCounter,hThread,TRUE,500);
			}
			
		}
		
		CloseHandle(hCounter);
		//设置提示
		//	dlg->StateInital();
		dlg->m_startScan.EnableWindow(true);
		dlg->m_stopScan.EnableWindow(false);
		SetDlgItemText(hDlg,IDC_SCANIP,"");
		SetDlgItemText(hDlg,IDC_SCANPORT,"");
		AfxEndThread(0);
		return TRUE;
	}
	
	return TRUE;
}

//************************************************************
//	函数名:PingHost
//	功能描述:单线程ping主机
//	参数:无
//	返回:void
//************************************************************
void PingHost()
{
	CJIEMIANDlg *dlg=(CJIEMIANDlg*)AfxGetApp()->GetMainWnd();
	CString strTempIP;
	int flag = 0;
	if (nIpWay == 0)
	{
		strTempIP = IPChange(dStartIP);
		if (bIsSYN)
		{
			CSYNPing ObjSYNPing;
			flag = ObjSYNPing.Ping((LPSTR)(LPCSTR)strTempIP,21);
		}
		else
		{
			CPing ObjPing;
			flag = ObjPing.Ping((LPSTR)(LPCSTR)strTempIP);
			ObjPing.Cleanup();
		}
		if(flag)
		{
			m_GbTree->InsertItem(strTempIP,2,2);
		}
		else
		{
			if (!bIsShowResHost)
			{
				m_GbTree->InsertItem(strTempIP,3,3);
			}
		}
		m_GbTree->Expand(m_hCurrentItem,TVE_EXPAND);
		dlg->m_pingIP.SetWindowText(strTempIP);
	}
	if (nIpWay == 1)
	{
		DWORD i = dStartIP;
		while (i <= dEndIP)
		{
			if (bIsStopPing)
			{
				AfxEndThread(0);
				return;
			}
			strTempIP = IPChange(i);
			if (bIsSYN)
			{
				CSYNPing ObjSYNPing;
				flag = ObjSYNPing.Ping((LPSTR)(LPCSTR)strTempIP,21);
			}
			else
			{
				CPing ObjPing;
				flag = ObjPing.Ping((LPSTR)(LPCSTR)strTempIP);
				ObjPing.Cleanup();
			}
			if(flag)
			{
				m_GbTree->InsertItem(strTempIP,2,2);
			}
			else
			{
				if (!bIsShowResHost)
				{
					m_GbTree->InsertItem(strTempIP,3,3);
				}
			}
			m_GbTree->Expand(m_hCurrentItem,TVE_EXPAND);
			dlg->m_pingIP.SetWindowText(strTempIP);
			i++;
		}
	}
	if (nIpWay == 2)
	{
		for (int i = 0; i < nLineCount; i++)
		{
			if (bIsStopPing)
			{
				AfxEndThread(0);
				return;
			}
			if (bIsSYN)
			{
				CSYNPing ObjSYNPing;
				flag = ObjSYNPing.Ping((LPSTR)(LPCSTR)dFileIP[i],21);
			}
			else
			{
				CPing ObjPing;
				flag = ObjPing.Ping((LPSTR)(LPCSTR)dFileIP[i]);
				ObjPing.Cleanup();
			}
			if(flag)
			{
				m_GbTree->InsertItem(dFileIP[i],2,2);
			}
			else
			{
				if (!bIsShowResHost)
				{
					m_GbTree->InsertItem(strTempIP,3,3);
				}
			}
			m_GbTree->Expand(m_hCurrentItem,TVE_EXPAND);
			dlg->m_pingIP.SetWindowText(dFileIP[i]);
		}
	}
}

//************************************************************
//	函数名:GetPort
//	功能描述:获取端口,并将初始端口分别保留在nStartPort与nEndPort 
//	参数:无
//	返回:bool
//************************************************************
bool CJIEMIANDlg::GetPort()
{
	if(((CButton *)GetDlgItem(IDC_SINGLE_PORT))->GetCheck())
	{
		nStartPort = nEndPort = GetDlgItemInt(IDC_PORT);
		return true;
	}
	else
	{
		nStartPort = GetDlgItemInt(IDC_SPORT);
		nEndPort = GetDlgItemInt(IDC_EPORT);
		if (nEndPort < nStartPort)
		{
			MessageBox("请正确填写的端口",_T("错误"),MB_ICONWARNING|MB_OK);
			GetDlgItem(IDC_START_SCAN)->EnableWindow(TRUE);
			GetDlgItem(IDC_SPORT)->SetWindowText("");
			GetDlgItem(IDC_EPORT)->SetWindowText("");
			GetDlgItem(IDC_SPORT)->SetFocus();
			return false;	
		}
		return true;
		
	}
}

void CJIEMIANDlg::OnSelchangedTree1(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	// TODO: Add your control notification handler code here
	TVITEM item = pNMTreeView->itemNew;
	m_hCurrentItem = item.hItem;
	*pResult = 0;
}

//************************************************************
//	函数名:OnSetfocusTree1
//	功能描述:树型控件获取焦点 
//	参数:系统消息参数
//	返回:void
//************************************************************
void CJIEMIANDlg::OnSetfocusTree1(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	bIsFocused = true;
	*pResult = 0;
}

//************************************************************
//	函数名:OnKillfocusTree1
//	功能描述:树型控件失去焦点 
//	参数:系统消息参数
//	返回:void
//************************************************************
void CJIEMIANDlg::OnKillfocusTree1(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	bIsFocused = true;
	*pResult = 0;
}

void CJIEMIANDlg::OnScanSelected() 
{
	// TODO: Add your control notification handler code here
	bIsSpecScan = true;
	bIsScanByhand = true;
	GetPort();
	nThreadCount = m_iThCount;
	m_progressScan.SetRange32(0,nEndPort - nStartPort + 1);
	m_progressScan.SetPos(0);
	AfxBeginThread(ThreadManager,GetSafeHwnd());
}


void CJIEMIANDlg::OnWaysyn() 
{
	// TODO: Add your control notification handler code here
	bIsSYN = true;
}

void CJIEMIANDlg::OnWayconn() 
{
	// TODO: Add your control notification handler code here
	bIsSYN = false;
}

void CJIEMIANDlg::OnStopScan() 
{
	bIsStopPing = true;
	// TODO: Add your control notification handler code here
	GetDlgItem(IDC_START_SCAN)->EnableWindow(true);
	GetDlgItem(IDC_STOP_SCAN)->EnableWindow(false);
}

void CJIEMIANDlg::OnButton5() 
{
	// TODO: Add your control notification handler code here
	m_Tree.DeleteAllItems();
	m_hRoot = m_Tree.InsertItem("主机IP",0,0);
	m_progressScan.SetPos(0);
}

//************************************************************
//	函数名:OnSavescan	
//	功能描述:保存当前扫描列表至指定文本文件 
//	参数:无
//	返回:void
//************************************************************
void CJIEMIANDlg::OnSavescan() 
{
	// TODO: Add your control notification handler code here
	CFileDialog Dlg(FALSE,NULL,"ScanResult.txt",OFN_HIDEREADONLY,"文本文件(*.txt)|*.txt||",this);
	Dlg.m_ofn.lpstrTitle = "保存扫描结果";
	if (Dlg.DoModal() == IDOK)
	{
		CString filePath = Dlg.GetPathName();
		//UpdateData(false);
		if (filePath == "")
		{
			AfxMessageBox("请先选择创建位置和文件名!");
			return;
		}
		CStdioFile txtFile;
		if (!txtFile.Open( filePath, CFile::modeCreate | CFile::modeWrite | CFile::typeText ))
		{
			AfxMessageBox("不能创建文件!");
			return;
		}
		if (bIsSYN)
		{
			txtFile.WriteString("SYN扫描");
		}
		else
		{
			txtFile.WriteString("connect扫描");
		}
		txtFile.WriteString("\n\n");
		HTREEITEM tempItem1 = m_Tree.GetNextItem(m_hRoot,TVGN_NEXT);
		HTREEITEM tempItem2;
		while (tempItem1 != NULL)
		{
			int nImage,nSelectedImage;
			m_Tree.GetItemImage(tempItem1,nImage,nSelectedImage);
			CString ItemText = m_Tree.GetItemText(tempItem1);
			CString total = ItemText;
			if (nImage == 2)
			{
				total += ":通\n";
				txtFile.WriteString(total);
			}
			else
			{
				total += ":断\n";
				txtFile.WriteString(total);
			}
			tempItem2 = m_Tree.GetChildItem(tempItem1);
			while (tempItem2 != NULL)
			{
				ItemText = m_Tree.GetItemText(tempItem2);
				total = "开放端口:";
				total += ItemText;
				total += "\n";
				txtFile.WriteString(total);
				tempItem2 = m_Tree.GetNextItem(tempItem2,TVGN_NEXT);
			}
			txtFile.WriteString("\n");
			tempItem1 = m_Tree.GetNextItem(tempItem1,TVGN_NEXT);

		}
		txtFile.Close();
	}
}

void CJIEMIANDlg::OnShowReshost() 
{
	// TODO: Add your control notification handler code here
	bIsShowResHost = !bIsShowResHost;
}

⌨️ 快捷键说明

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