当前位置:首页 > Windows程序 > 正文

WinPcap网络抓包分析程序

2021-03-29 Windows程序

bool CProcessDlg::GetAllProcessesInfo() { /*得到所有进程的快照*/ HANDLE hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); if(INVALID_HANDLE_VALUE==hProcessSnap) return false; /*保存进程信息的结构体*/ PROCESSENTRY32 ProEntry32; memset(&ProEntry32,0,sizeof(ProEntry32)); ProEntry32.dwSize=sizeof(ProEntry32); /*得到第一个进程的信息*/ if(!Process32First(hProcessSnap,&ProEntry32)) { CloseHandle(hProcessSnap); return false; } /*显示所有的进程的相关信息*/ do { /*显示进程名称*/ if (ProEntry32.th32ProcessID!=0) //不包括系统进程 { CString name=CString(ProEntry32.szExeFile); int index; if (isContainString(name,index)) m_allProcesses[index]._processPID.push_back(ProEntry32.th32ProcessID); else { ProcessInfo tpInfo; tpInfo._processName=name; tpInfo._processPID.push_back(ProEntry32.th32ProcessID); m_allProcesses.push_back(tpInfo); } } } while(Process32Next(hProcessSnap,&ProEntry32)); CloseHandle(hProcessSnap); return true; } void CProcessDlg::GetAllPortByProcessId(DWORD dwProcessId,std::vector<int>& port) { HMODULE hModule=LoadLibraryW(L"iphlpapi.dll"); if (hModule==NULL) return; //加载失败 //Win7 Vista系统下使用 //tcp 部分 PMIB_TCPEXTABLE_VISTA pTcpExTable = NULL; PFNInternalGetTcpTable2 pInternalGetTcpTable2 = (PFNInternalGetTcpTable2)GetProcAddress(hModule, "InternalGetTcpTable2"); if (pInternalGetTcpTable2!=NULL) { if (pInternalGetTcpTable2(&pTcpExTable, GetProcessHeap(), 1)) { if (pTcpExTable) HeapFree(GetProcessHeap(), 0, pTcpExTable); FreeLibrary(hModule); hModule = NULL; return; } for (UINT i=0;i<pTcpExTable->dwNumEntries;i++) { // 过滤掉数据,,只获取我们要查询的进程的 TCP Port 信息 if(dwProcessId==pTcpExTable->table[i].dwProcessId) port.push_back(ntohs(0x0000FFFF & pTcpExTable->table[i].dwLocalPort)); } if (pTcpExTable) HeapFree(GetProcessHeap(), 0, pTcpExTable); } //udp 部分 PMIB_UDPEXTABLE pUdpExTable=NULL; PFNInternalGetUdpTableWithOwnerPid pInternalGetUdpTableWithOwnerPid; pInternalGetUdpTableWithOwnerPid=(PFNInternalGetUdpTableWithOwnerPid)GetProcAddress(hModule, "InternalGetUdpTableWithOwnerPid"); if (pInternalGetUdpTableWithOwnerPid != NULL) { if (pInternalGetUdpTableWithOwnerPid(&pUdpExTable, GetProcessHeap(), 1)) { if (pUdpExTable) HeapFree(GetProcessHeap(), 0, pUdpExTable); FreeLibrary(hModule); hModule = NULL; return; } for (UINT i=0;i<pUdpExTable->dwNumEntries;i++) { if(dwProcessId == pUdpExTable->table[i].dwProcessId) port.push_back(ntohs(0x0000FFFF & pUdpExTable->table[i].dwLocalPort)); } if (pUdpExTable) HeapFree(GetProcessHeap(), 0, pUdpExTable); } FreeLibrary(hModule); hModule = NULL; } void CProcessDlg::OnTimer(UINT_PTR nIDEvent) { clearAllSpeed(); int maxSize=PData->getPackerResSize(); for(int i=m_currSize;i<maxSize;i++) { int sPort,dPort; PacketAnalysis* res=PData->getPacketResAtIndex(i); if (res->getPort(sPort,dPort)) //获取到端口 { for(int i=0;i<m_allProcesses.size();i++) { for(int j=0;j<m_allProcesses[i]._processPort.size();j++) { if (m_allProcesses[i]._processPort[j]==sPort) { m_allProcesses[i]._upSpeed+=res->getLength(); m_allProcesses[i]._upTotal+=res->getLength(); break; } if (m_allProcesses[i]._processPort[j]==dPort) { m_allProcesses[i]._downSpeed+=res->getLength(); m_allProcesses[i]._downTotal+=res->getLength(); break; } } } } } m_currSize=maxSize; //设置文本 CString strItem; for(int i=0;i<m_allProcesses.size();i++) { strItem.Format("%.2lf",m_allProcesses[i]._upSpeed/1024); m_process.SetItemText(i,2,strItem); strItem.Format("%.2lf",m_allProcesses[i]._downSpeed/1024); m_process.SetItemText(i,3,strItem); strItem.Format("%.2lf",m_allProcesses[i]._upTotal/1024); m_process.SetItemText(i,4,strItem); strItem.Format("%.2lf",m_allProcesses[i]._downTotal/1024); m_process.SetItemText(i,5,strItem); } CDialogEx::OnTimer(nIDEvent); }

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/69954.html