📄 jiemiandlg.cpp
字号:
// 返回: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 + -