www.pudn.com > SnifferPro.rar > DlgDet.cpp
// DlgDet.cpp : implementation file // #include "stdafx.h" #include "SnifferPro.h" #include "DlgDet.h" #include#include "ARPPacket.h" #include "MainFrm.h" #include #include #include "pcap.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif extern pcap_if_t *alldevs; extern pcap_if_t *dev; extern char errbuf[PCAP_ERRBUF_SIZE]; extern CString a; HWND result_hnd; int num; BYTE n[4],n1[4],n2[4]; bool bexit; CString m_targetip; //CTime from,to; ///////////////////////////////////////////////////////////////////////////// // CDlgDet dialog CDlgDet::CDlgDet(CWnd* pParent /*=NULL*/) : CDialog(CDlgDet::IDD, pParent) { //{{AFX_DATA_INIT(CDlgDet) m_check = FALSE; m_bmac = _T(""); m_message = _T(""); m_sec = 0; m_2 = _T(""); m_3 = _T(""); m_4 = _T(""); m_time = 0; m_1 = _T(""); //}}AFX_DATA_INIT } void CDlgDet::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDlgDet) DDX_Control(pDX, IDC_LIST_RESULT, m_result); DDX_Control(pDX, IDC_IPADDRESS_SRC, m_src); DDX_Control(pDX, IDC_IPADDRESS_DST, m_dst); DDX_Check(pDX, IDC_CHECK1, m_check); DDX_Text(pDX, IDC_EDITMAC, m_bmac); DDX_Text(pDX, IDC_MESSAGE, m_message); DDX_Text(pDX, IDC_EDITSEC, m_sec); DDX_Text(pDX, IDC_EDIT3, m_2); DDX_Text(pDX, IDC_EDIT4, m_3); DDX_Text(pDX, IDC_EDIT5, m_4); DDX_Radio(pDX, IDC_RADIO_NOW, m_time); DDX_Text(pDX, IDC_EDIT2, m_1); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CDlgDet, CDialog) //{{AFX_MSG_MAP(CDlgDet) ON_BN_CLICKED(IDC_CHECK1, OnCheck1) ON_BN_CLICKED(IDC_RADIO_NOW, OnRadioNow) ON_BN_CLICKED(IDC_RADIO_TIME, OnRadioTime) ON_BN_CLICKED(IDC_STARTANTI, OnStartanti) ON_BN_CLICKED(IDC_STOPANTI, OnStopanti) ON_BN_CLICKED(IDC_CLEAR, OnClear) ON_BN_CLICKED(IDC_SEND, OnSend) ON_NOTIFY(NM_CLICK, IDC_LIST_RESULT, OnClickListResult) ON_BN_CLICKED(IDC_BAND, OnBand) ON_BN_CLICKED(IDC_SAVE, OnSave) ON_WM_TIMER() ON_BN_CLICKED(IDC_RADIO4, OnRadioTimer) ON_BN_CLICKED(IDC_RADIO_TIMER, OnRadioTimer) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDlgDet message handlers BOOL CDlgDet::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here DWORD dwStyle=GetWindowLong(m_result.GetSafeHwnd(),GWL_STYLE); dwStyle&=~LVS_TYPEMASK; dwStyle|=LVS_REPORT; SetWindowLong(m_result.GetSafeHwnd(),GWL_STYLE,dwStyle); // ShowWindow(SW_SHOWMAXIMIZED);//窗口最大化 m_result.InsertColumn(0,"IP Address",LVCFMT_LEFT,120); m_result.InsertColumn(1,"Time",LVCFMT_LEFT,200); m_result.InsertColumn(2,"MAC",LVCFMT_LEFT,280); m_result.SetExtendedStyle(LVS_EX_GRIDLINES); ::SendMessage(m_result.m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE, LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT); result_hnd=GetDlgItem(IDC_LIST_RESULT)->m_hWnd; //获得控件的句柄 if(check==false) GetDlgItem(IDC_IPADDRESS_DST)->EnableWindow(false); else { GetDlgItem(IDC_IPADDRESS_DST)->EnableWindow(true); m_dst.SetAddress(m2[0],m2[1],m2[2],m2[3]); } CheckRadioButton(IDC_RADIO_NOW,IDC_RADIO_TIME,IDC_RADIO_TIMER); m_check=check; m_src.SetAddress(m1[0],m1[1],m1[2],m1[3]); m_bmac=bmac; //假MAC地址 frequency=0; m_sec=sec; GetDlgItem(IDC_EDITSEC)->EnableWindow(false); GetDlgItem(IDC_EDIT2)->EnableWindow(false); GetDlgItem(IDC_EDIT3)->EnableWindow(false); GetDlgItem(IDC_EDIT4)->EnableWindow(false); GetDlgItem(IDC_EDIT5)->EnableWindow(false); GetDlgItem(IDC_BAND)->EnableWindow(true); GetDlgItem(IDC_IPADDRESS_SRC)->EnableWindow(true); GetDlgItem(IDC_IPADDRESS_DST)->EnableWindow(false); GetDlgItem(IDC_STARTANTI)->EnableWindow(false); GetDlgItem(IDC_CHECK1)->EnableWindow(true); GetDlgItem(IDC_EDITMAC)->EnableWindow(true); GetDlgItem(IDC_STOPANTI)->EnableWindow(false); UpdateData(false); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CDlgDet::OnCheck1() { // TODO: Add your control notification handler code here CButton *pBtn=(CButton*)GetDlgItem(IDC_CHECK1); if(pBtn->GetCheck()) //选中复选框,设置IP控件中的值 { GetDlgItem(IDC_IPADDRESS_DST)->EnableWindow(true); UpdateData(); m_src.GetAddress(n[0],n[1],n[2],n[3]); m_dst.SetAddress(n[0],n[1],n[2],255); } else GetDlgItem(IDC_IPADDRESS_DST)->EnableWindow(false); } void CDlgDet::OnRadioNow() { // TODO: Add your control not_ification handler code here m_time=0; GetDlgItem(IDC_EDITSEC)->EnableWindow(false); GetDlgItem(IDC_EDIT2)->EnableWindow(false); GetDlgItem(IDC_EDIT3)->EnableWindow(false); GetDlgItem(IDC_EDIT4)->EnableWindow(false); GetDlgItem(IDC_EDIT5)->EnableWindow(false); m_sec=30; UpdateData(false); } void CDlgDet::OnRadioTime() { // TODO: Add your control notification handler code here m_time=1; GetDlgItem(IDC_EDITSEC)->EnableWindow(true); GetDlgItem(IDC_EDIT2)->EnableWindow(false); GetDlgItem(IDC_EDIT3)->EnableWindow(false); GetDlgItem(IDC_EDIT4)->EnableWindow(false); GetDlgItem(IDC_EDIT5)->EnableWindow(false); UpdateData(false); } void CDlgDet::OnRadioTimer() { // TODO: Add your control notification handler code here m_time=2; GetDlgItem(IDC_EDITSEC)->EnableWindow(false); GetDlgItem(IDC_EDIT2)->EnableWindow(true); GetDlgItem(IDC_EDIT3)->EnableWindow(true); GetDlgItem(IDC_EDIT4)->EnableWindow(true); GetDlgItem(IDC_EDIT5)->EnableWindow(true); SYSTEMTIME st = {0}; GetLocalTime(&st);//获得当前本地时间 m_1.Format("%d",st.wHour); m_2.Format("%d",st.wMinute); m_3.Format("%d",st.wHour); m_4.Format("%d",st.wMinute); GetDlgItem(IDC_EDIT2)->SetFocus(); UpdateData(false); // CString aaa=m_1+m_2; } /* ======================================================================================================================= 下面是实现ARP协议分析的函数,函数类型与回调函数相同 ======================================================================================================================= */ //void pcap_handle(u_char *user, const struct pcap_pkthdr *pkt_header, const u_char *pkt_data) void pcap_callback(u_char *user, const struct pcap_pkthdr *pkt_header, const u_char *pkt_data) { struct arp_header *arp_protocol; u_short operation_code; struct in_addr source_ip_address; // struct in_addr source_mac_address; arp_protocol = (struct arp_header*)(pkt_data + 14); operation_code = ntohs(arp_protocol->arp_operation_code); CString filter_ip; filter_ip.Format("%d.%d.%d.%d",m1[0],m1[1],m1[2],1); memcpy((void*) &source_ip_address, (void*) &arp_protocol->arp_source_ip_address, sizeof(struct in_addr)); // memcpy((void*) &source_mac_address, (void*) &arp_protocol->arp_source_ethernet_address, sizeof(struct in_addr)); CString ip,time,host,mac; ip=inet_ntoa(source_ip_address); // const char *mac; // mac = (const char *)(&arp_protocol->arp_source_ethernet_address); mac=(char *)(LPCSTR)(&arp_protocol->arp_source_ethernet_address); if(operation_code == 2&&filter_ip!=ip) { SYSTEMTIME st = {0}; GetLocalTime(&st);//获得当前本地时间 time.Format("%d-%d-%d %2d:%2d:%2d",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond); CDlgDet p; p.m_result.m_hWnd=result_hnd; p.m_result.InsertItem(0,ip,0); p.m_result.SetItemText(0,1,time); p.m_result.SetItemText(0,2,mac); Sleep(500); } } //////////////////////////////////////////// UINT ReceiveARPPacket(LPVOID param) { pcap_t *p; /* Winpcap句柄 */ char errbuf[PCAP_ERRBUF_SIZE]; /* 存储错误信息 */ struct bpf_program bpf_filter; /* BPF过滤规则 */ char *bpf_filter_string = "dst host dev->addresses->addr and arp"; /* 过滤规则字符串 */ // bpf_u_int32 net_mask; /* 掩码 */ bpf_u_int32 net_ip; /* 网路地址 */ if((p=pcap_open_live(dev->name,65536,1,1000,errbuf))==NULL){//若网卡无法绑定 AfxMessageBox("Open the adapter failed!"); return -1; } /* 打开网路接口,设成混杂模式*/ pcap_compile(p, &bpf_filter, bpf_filter_string, 0, net_ip); /* 编译BPF过滤规则 */ pcap_setfilter(p, &bpf_filter); /* 设置过滤规则 */ if (pcap_datalink(p) != DLT_EN10MB) return 0; do{ pcap_loop(p,1, pcap_callback, NULL); }while(!bexit); pcap_close(p); /* 关闭Winpcap操作 */ return 0; } /////////////// UINT SendARPPacket(LPVOID param) { libnet_t *l; libnet_ptag_t protocol_tag; char *device=NULL; char error_information[LIBNET_ERRBUF_SIZE]; char *destination_ip_str; //目的IP地址 char *source_ip_str=(char *)(LPCSTR)a; u_char hardware_source[6]={0x00,0x1E,0x37,0x33,0x15,0x4A}; u_char hardware_destination[6]; u_long destination_ip; u_long source_ip; CString ip_src,ip_dst; ip_src.Format("%d.%d.%d.%d",int(m1[0]),int(m1[1]),int(m1[2]),int(m1[3])); ip_dst.Format("%d.%d.%d.%d",int(m2[0]),int(m2[1]),int(m2[2]),int(m2[3])); for(int j=1;j<=6;j++) //获取MAC地址 { hardware_destination[j-1]=GetMAC(j,bmac); } //判断需要发的包 if(check==0) { destination_ip_str=(char *)(LPCSTR)ip_src; destination_ip=libnet_name2addr4(l,destination_ip_str,LIBNET_RESOLVE); source_ip=libnet_name2addr4(l,source_ip_str,LIBNET_RESOLVE); l=libnet_init( LIBNET_LINK_ADV, device, error_information); protocol_tag=libnet_build_arp( ARPHRD_ETHER, ETHERTYPE_IP, 6, 4, ARPOP_REQUEST, hardware_source, (u_int8_t *)&source_ip, hardware_destination, (u_int8_t *)&destination_ip, NULL, 0, l, 0 ); protocol_tag=libnet_autobuild_ethernet( hardware_destination, ETHERTYPE_ARP, l ); libnet_write(l); libnet_destroy(l); } else { BYTE TEMP1[4],TEMP2[4]; for(int i=0;i<4;i++) { TEMP1[i]=m1[i]; TEMP2[i]=m2[i]; } do { destination_ip_str=(char *)(LPCSTR)ip_src; destination_ip=libnet_name2addr4(l,destination_ip_str,LIBNET_RESOLVE); source_ip=libnet_name2addr4(l,source_ip_str,LIBNET_RESOLVE); l=libnet_init( LIBNET_LINK_ADV, device, error_information); protocol_tag=libnet_build_arp( ARPHRD_ETHER, ETHERTYPE_IP, 6, 4, ARPOP_REQUEST, hardware_source, (u_int8_t *)&source_ip, hardware_destination, (u_int8_t *)&destination_ip, NULL, 0, l, 0 ); protocol_tag=libnet_autobuild_ethernet( hardware_destination, ETHERTYPE_ARP, l ); libnet_write(l); libnet_destroy(l); if(TEMP1[2]<=TEMP2[2]) { if(TEMP1[3] =TEMP2[3]&&TEMP1[2]>=TEMP2[2]) break; }while(TEMP1[2]<=255&&TEMP1[3]<=255); } return 0; } ////////////////////////////////// void CDlgDet::OnStartanti() { // TODO: Add your control notification handler code here bexit=false; UpdateData(false); m_result.DeleteAllItems(); GetDlgItem(IDC_BAND)->EnableWindow(false); GetDlgItem(IDC_IPADDRESS_SRC)->EnableWindow(false); GetDlgItem(IDC_IPADDRESS_DST)->EnableWindow(false); GetDlgItem(IDC_STARTANTI)->EnableWindow(false); GetDlgItem(IDC_CHECK1)->EnableWindow(false); GetDlgItem(IDC_EDITMAC)->EnableWindow(false); GetDlgItem(IDC_STOPANTI)->EnableWindow(true); AfxBeginThread(AFX_THREADPROC(ReceiveARPPacket),(LPVOID)this);//启动收包线程 if(frequency==0) { AfxBeginThread(AFX_THREADPROC(SendARPPacket),(LPVOID)this); }//启动发包线程 else if(frequency==1) { if(!bexit) { AfxBeginThread(AFX_THREADPROC(SendARPPacket),(LPVOID)this); SetTimer(1,m_sec*1000,NULL); } else return; } else { SetTimer(2,1000,NULL); } } void CDlgDet::OnStopanti() { // TODO: Add your control notification handler code here bexit=true; if(frequency==1) KillTimer(1); else if(frequency==2) { KillTimer(1); KillTimer(2); } GetDlgItem(IDC_BAND)->EnableWindow(true); GetDlgItem(IDC_IPADDRESS_SRC)->EnableWindow(true); GetDlgItem(IDC_IPADDRESS_DST)->EnableWindow(false); GetDlgItem(IDC_STARTANTI)->EnableWindow(false); GetDlgItem(IDC_CHECK1)->EnableWindow(true); GetDlgItem(IDC_EDITMAC)->EnableWindow(true); GetDlgItem(IDC_STOPANTI)->EnableWindow(false); } void CDlgDet::OnClear() { // TODO: Add your control notification handler code here m_result.DeleteAllItems(); } void CDlgDet::OnSend() { // TODO: Add your control notification handler code here POSITION pos=m_result.GetFirstSelectedItemPosition(); if(pos==NULL) { AfxMessageBox("Please choose the target computer:"); return; } wchar_t wszbuf[100]; wchar_t wsztarget[20]; m_message="发现你正在进行监听,请立即关闭监听程序!"; int len=MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,m_targetip,-1,NULL,0); MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,m_targetip,-1,wsztarget,len); len=MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,m_message,-1,NULL,0); MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,m_message,-1,wszbuf,len); NetMessageBufferSend(NULL,wsztarget,NULL,(LPBYTE)wszbuf,DWORD(2*m_message.GetLength())); } void CDlgDet::OnClickListResult(NMHDR* pNMHDR, LRESULT* pResult) { // TODO: Add your control notification handler code here POSITION pos=m_result.GetFirstSelectedItemPosition(); int SelIndex = m_result.GetNextSelectedItem(pos); m_targetip=m_result.GetItemText(SelIndex,0); *pResult = 0; } void CDlgDet::OnBand() { // TODO: Add your control notification handler code here UpdateData(true); frequency=m_time; m_src.GetAddress(n1[0],n1[1],n1[2],n1[3]); //获得IP地址 m_src_str.Format("%d.%d.%d.%d",int(n1[0]),int(n1[1]),int(n1[2]),int(n1[3])); //测试IP控件 m_dst.GetAddress(n2[0],n2[1],n2[2],n2[3]); m_dst_str.Format("%d.%d.%d.%d",int(n2[0]),int(n2[1]),int(n2[2]),int(n2[3])); if(m_check==1) //判断IP段的合法性 { if(n2[2] 'F'||p<'0') { MessageBox("MAC地址输入错误,请重新输入!"); return; } } else { if(p!=':') { MessageBox("MAC地址输入错误,请重新输入!"); return; } } } //判断监测周期设置的合法性 if(frequency==1&&m_sec<30) { MessageBox("监测周期至少为30秒!"); return; } if(frequency==2) { CString hnow,mnow; SYSTEMTIME st = {0}; GetLocalTime(&st);//获得当前本地时间 hnow.Format("%d",st.wHour); mnow.Format("%d",st.wMinute); int hournow=atoi(hnow); int minnow=atoi(mnow); int hourfrom=atoi(m_1); int minutefrom=atoi(m_2); int hourto=atoi(m_3); int minuteto=atoi(m_4); if(hournow>hourfrom) { MessageBox("起始时间小于系统当前时间,请重新输入!"); return; } else { if(minnow>minutefrom) { MessageBox("起始时间小于系统当前时间,请重新输入!"); return; } } if(hourfrom>hourto) { MessageBox("起始时间大于终止时间,请重新输入!"); return; } else { if(minutefrom>minuteto) { MessageBox("起始时间大于终止时间,请重新输入!"); return; } /* else { CString from=m_1+":"+m_2+":"+"00"; CString to=m_3+":"+m_4+":"+"00"; COleDateTime tm1; SYSTEMTIME st1; tm1.ParseDateTime(from); tm1.GetAsSystemTime(st1); CTime ctfrom(st1); COleDateTime tm2; SYSTEMTIME st2; tm2.ParseDateTime(to); tm2.GetAsSystemTime(st2); CTime ctto(st2); CTimeSpan t=ctto-ctfrom; LONGLONG longsum=t.GetTotalSeconds(); if(longsum <600) { MessageBox("监测时间段至少为10分钟,请重新输入!"); return; } }*/ } } //记录设置的参数 bmac=m_bmac; check=m_check; // frequency=m_frequency; sec=m_sec; for(i=0;i<4;i++) { m1[i]=n1[i]; m2[i]=n2[i]; } GetDlgItem(IDC_BAND)->EnableWindow(false); GetDlgItem(IDC_IPADDRESS_SRC)->EnableWindow(false); GetDlgItem(IDC_IPADDRESS_DST)->EnableWindow(false); GetDlgItem(IDC_STARTANTI)->EnableWindow(true); GetDlgItem(IDC_CHECK1)->EnableWindow(false); GetDlgItem(IDC_EDITMAC)->EnableWindow(false); GetDlgItem(IDC_STOPANTI)->EnableWindow(false); } void CDlgDet::OnSave() { // TODO: Add your control notification handler code here int Count=m_result.GetItemCount(); CFile f; CFileException e; CString strFileName; CTime t=CTime::GetCurrentTime(); CString strTime = t.Format( "%d-%H-%M-%S" ); strTime="ANTI_LOG-"+strTime; CFileDialog fileDlg(FALSE,"txt",strTime,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"txt",NULL); //TRUE 为打开对话框 if(fileDlg.DoModal()==IDOK) { UpdateData(true); strFileName=fileDlg.GetFileName(); UpdateData(false); if( f.Open(strFileName, CFile::modeCreate | CFile::modeWrite, &e ) ) { CString str; str="IPAddress Time Host MAC\r\n\r\n"; f.Write( str, str.GetLength() ); for(int i=0;i EnableWindow(true); GetDlgItem(IDC_IPADDRESS_SRC)->EnableWindow(true); GetDlgItem(IDC_IPADDRESS_DST)->EnableWindow(false); GetDlgItem(IDC_STARTANTI)->EnableWindow(false); GetDlgItem(IDC_CHECK1)->EnableWindow(true); GetDlgItem(IDC_EDITMAC)->EnableWindow(true); GetDlgItem(IDC_STOPANTI)->EnableWindow(false); } break; } CDialog::OnTimer(nIDEvent); }