版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
多线程使用不同原始 socket发送ICMP的问题ICMP报文没有端口,在进程中或者多线程中同时新建多个原始套接字,然后发送ICMP包,然后等待返回结果,此时这些原始socket并不能分清哪个ICMP响应包是属于自己的(因为没有端口,到达的socket的目的IP都是一样的)。解决方法可以从ICMP里面的sequencenumber下手,~一个ping和一个pingreply的seqno是一样的,而且唯一下面发出自己的程序,麻烦高手看看,问题如何解决?自己写的CIcmpsocket类简介:1)通过构造函数得到目的 IP,和接收icmp的超时时间,和持续发送的时长;2)通过调用成员函数 start来开始发包 icmp探测的线程,也就是说一个类有自己的一个线程;3)创建3个CIcmpsocket类的对象,赋予不同的目的 IP,然后调用它们的 start函数,使其开始进行各自的 icmp探测;结果出现3个线程互相收到不是自己的 icmp回复报文。麻烦高手解答 ULONGWINAPIIcmpSocketThreadProc(LPVOIDlpParameter){CIcmpSocket*pThread;pThread=(CIcmpSocket*)lpParameter;pThread->Execute();ExitThread(0);return1;}CIcmpSocket::CIcmpSocket(DWORDulDstIP,DWORDulDataSize,DWORDulRcvTimeO,DWORDulTestTime){m_Socket=INVALID_SOCKET;intiTimeout=2000;/*2S 超时*/DWORDulLoop=0;structsockaddrstAddr={0};m_ThreadHandle=NULL;m_tTestTime=ulTestTime;m_ulTimeOut=ulRcvTimeO;m_ulThreadId=0;InitializeCriticalSection(&m_Section);memset(&m_IPHdr,0,sizeof(IpHeader));memset(&m_IcmpHeader,0,sizeof(IcmpHeader));memset(&m_Dest,0,sizeof(m_Dest));if(INADDR_NONE==ulDstIP){assert(0);}m_Dest.sin_family=AF_INET;m_ulDatasize=ulDataSize;m_ulDatasize+=sizeof(IcmpHeader);m_pSndData=(char*)malloc(m_ulDatasize);if(NULL==m_pSndData){assert(0);}m_pRcvData=(char*)malloc(MAX_DATASIZE);if(NULL==m_pRcvData){assert(0);}//fill_icmp_data(m_pSndData,m_ulDatasize);m_bTerminate=false;}CIcmpSocket::~CIcmpSocket(){if(m_Socket!=INVALID_SOCKET){closesocket(m_Socket);m_Socket=INVALID_SOCKET;}Lock();DWORDulDelayCnt=m_DelayMsArray.GetSize();DelayMsInfo*pstDelay=NULL;for(DWORDulLoop=0;ulLoop<ulDelayCnt;ulLoop++){pstDelay=(DelayMsInfo*)m_DelayMsArray[ulLoop];if(NULL!=pstDelay){free((void*)pstDelay);}}m_DelayMsArray.RemoveAll();UnLock(); if(m_pSndData){free(m_pSndData);}if(m_pRcvData){free(m_pRcvData);}}voidCIcmpSocket::Execute(){intiTimeout=0; m_ulThreadId=GetCurrentThreadId();if(WSAStartup(MAKEWORD(2,2),&m_wsaData)!=0){assert(0);}m_Socket=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,WSA_FLAG_OVERLAPPED);if(INVALID_SOCKET==m_Socket){assert(0);}iTimeout=(int)m_ulTimeOut;if(SOCKET_ERROR==setsockopt(m_Socket,SOL_SOCKET,SO_RCVTIMEO,(char*)&iTimeout,sizeof(iTimeout))){assert(0);}iTimeout=1000;if(SOCKET_ERROR==setsockopt(m_Socket,SOL_SOCKET,SO_SNDTIMEO,(char*)&iTimeout,sizeof(iTimeout))){assert(0);}while(!m_bTerminate){Run(); Sleep(10);}ExitThread(0);return;}voidCIcmpSocket::fill_icmp_data(char*icmp_data,intdatasize){IcmpHeader*icmp_hdr=NULL;char*datapart=NULL;icmp_hdr=(IcmpHeader*)icmp_data;icmp_hdr->i_type=ICMP_ECHO;// 类型为ICMP_ECHOicmp_hdr->i_code=0;icmp_hdr->i_id=(USHORT)m_ulThreadId;// 识别号为进程号icmp_hdr->i_cksum=0;// 校验和初始化icmp_hdr->i_seq=0;//序列号初始化datapart=icmp_data+sizeof(IcmpHeader);//数据端的地址为icmp报文地址加上 ICMP的首部长度memset(datapart,'A',datasize-sizeof(IcmpHeader));//这里我填充的数据全部为"A",你可以填充任何代码和数据,实际上木马和控制端之间就是通过数据段传递数据的。return;}//CheckSum函数是标准的校验和函数USHORTCIcmpSocket::CheckSum(USHORT*buffer,intsize){unsignedlongcksum=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);}voidCIcmpSocket::Lock(void){EnterCriticalSection(&m_Section);return;}voidCIcmpSocket::UnLock(void){LeaveCriticalSection(&m_Section);return;}voidCIcmpSocket::Start(){if(NULL==m_ThreadHandle){m_ThreadHandle=CreateThread(NULL,1000000,IcmpSocketThreadProc,(LPVOID)this,0,NULL);}return;}voidCIcmpSocket::Stop(){m_bTerminate=false;}boolCIcmpSocket::Run(){time_ttStart=time(NULL);time_ttNow=tStart;unsignedshortusSeq=0;DWORDulByteSndCnt=0;DWORDulByteRcvCnt=0;structsockaddrstIPSrc={0};intlSrcLen=sizeof(stIPSrc);DWORDulMsStart =0;DWORDulLastError=0;DWORDulLoop=0; while((tNow-tStart)<=m_tTestTime){IcmpHeader*pstIcmpHdr=(IcmpHeader*)m_pSndData;if((GetTickCount()-ulMsStart)<=2000){Sleep(10);continue;}fill_icmp_data(m_pSndData,m_ulDatasize);pstIcmpHdr->i_cksum=0;pstIcmpHdr->timestamp=GetTickCount();pstIcmpHdr->i_seq=usSeq;pstIcmpHdr->i_cksum=CheckSum((unsignedshort*)m_pSndData,m_ulDatasize);ulMsStart=GetTickCount();ulByteSndCnt=sendto(m_Socket,m_pSndData,m_ulDatasize,0,(structsockaddr*)&m_Dest,sizeof(structsockaddr));if(SOCKET_ERROR==ulByteSndCnt){ulLastError=WSAGetLastError();if(WSAETIMEDOUT==ulLastError){Lock();m_TimeOutArray.Add(tNow);UnLock();continue;}returnfalse;}if(ulByteSndCnt<m_ulDatasize){continue;}memset((void*)m_pRcvData,0,MAX_DATASIZE);ulByteRcvCnt=recvfrom(m_Socket,m_pRcvData,MAX_DATASIZE,0,(structsockaddr*)&stIPSrc,&lSrcLen);if(SOCKET_ERROR==ulByteRcvCnt){ulLastError=WSAGetLastError();if(WSAETIMEDOUT==ulLastError){Lock();m_TimeOutArray.Add(tNow);UnLock();}}else{pstIcmpHdr=(structicmp*)(m_pRcvData+sizeof(IpHeader));if((ICMP_ECHOREPLY==pstIcmpHdr->i_code)&&(pstIcmpHdr->i_id==(USHORT)m_ulThreadId)){DelayMsInfo*pDelay=(DelayMsInfo*)malloc(sizeof(DelayMsInfo));pDelay->tTime=tNow;pDelay->ulDelay=(GetTickCount()-ulMsStart)+1;Lock();m_DelayMsArray.Add(pDelay);UnLock();}else{assert(0);}}usSeq++;tNow=time(NULL);Sleep(10);}returntrue;}boolCIcmpSocket::GetStatistic(CDWordArray&
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年工业机器人运维工程师职业发展新机遇
- 护理科研方法教学模板
- 护理礼仪的心理学基础
- 护理院级护理科研方法
- 硝酸铵中和工岗前变革管理考核试卷含答案
- 木焦油工岗前活动策划考核试卷含答案
- 冲压工风险评估能力考核试卷含答案
- 飞机外勤弹射救生工操作管理测试考核试卷含答案
- 工业车辆维修工安全专项模拟考核试卷含答案
- 2026年新科教版高中高二生物下册第三单元免疫调节过程特点卷含答案
- 青田县小溪流域仁宫至巨浦段综合治理工程项目环评报告
- 电力行业智能巡检体系建设实施方案
- 保密管理方案和措施
- 仪表联锁培训课件
- 职工退休及养老待遇证明书(6篇)
- 可再生能源法解读
- 殡仪服务员职业技能竞赛考试题(附答案)
- 车间材料损耗管理制度
- 实验动物咽拭子采集流程规范
- 《神奇的马达加斯加》课件
- 《城市道路人行道设施设置规范》
评论
0/150
提交评论