多线程使用不同原始socket发送ICMP的问题Word下载.docx
- 文档编号:16217292
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:9
- 大小:16.95KB
多线程使用不同原始socket发送ICMP的问题Word下载.docx
《多线程使用不同原始socket发送ICMP的问题Word下载.docx》由会员分享,可在线阅读,更多相关《多线程使用不同原始socket发送ICMP的问题Word下载.docx(9页珍藏版)》请在冰豆网上搜索。
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(&
amp;
m_Section);
memset(&
m_IPHdr,0,sizeof(IpHeader));
m_IcmpHeader,0,sizeof(IcmpHeader));
m_Dest,0,sizeof(m_Dest));
if(INADDR_NONE==ulDstIP)
{
assert(0);
}
m_Dest.sin_family=AF_INET;
m_Dest.sin_addr.S_un.S_addr=ulDstIP;
m_ulDatasize=ulDataSize;
m_ulDatasize+=sizeof(IcmpHeader);
m_pSndData=(char*)malloc(m_ulDatasize);
if(NULL==m_pSndData)
}m_pRcvData=(char*)malloc(MAX_DATASIZE);
if(NULL==m_pRcvData)
//fill_icmp_data(m_pSndData,m_ulDatasize);
m_bTerminate=false;
}CIcmpSocket:
~CIcmpSocket()
if(m_Socket!
=INVALID_SOCKET)
closesocket(m_Socket);
}Lock();
DWORDulDelayCnt=m_DelayMsArray.GetSize();
DelayMsInfo*pstDelay=NULL;
for(DWORDulLoop=0;
ulLoop&
lt;
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)
m_Socket=WSASocket(AF_INET,SOCK_RAW,IPPROTO_ICMP,NULL,0,
WSA_FLAG_OVERLAPPED);
if(INVALID_SOCKET==m_Socket)
iTimeout=(int)m_ulTimeOut;
if(SOCKET_ERROR==setsockopt(m_Socket,SOL_SOCKET,SO_RCVTIMEO,(char*)&
iTimeout,sizeof(iTimeout)))
iTimeout=1000;
if(SOCKET_ERROR==setsockopt(m_Socket,SOL_SOCKET,SO_SNDTIMEO,(char*)&
while(!
m_bTerminate)
Run();
Sleep(10);
return;
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_ECHO
i_code=0;
i_id=(USHORT)m_ulThreadId;
//识别号为进程号
i_cksum=0;
//校验和初始化
i_seq=0;
//序列号初始化
datapart=icmp_data+sizeof(IcmpHeader);
//数据端的地址为icmp报文地址加上ICMP的首部长度
memset(datapart,'
A'
datasize-sizeof(IcmpHeader));
//这里我填充的数据全部为"
A"
,你可以填充任何代码和数据,实际上木马和控制端之间就是通过数据段传递数据的。
}//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);
Lock(void)
EnterCriticalSection(&
return;
UnLock(void)
LeaveCriticalSection(&
Start()
if(NULL==m_ThreadHandle)
m_ThreadHandle=CreateThread(NULL,1000000,IcmpSocketThreadProc,(LPVOID)this,0,NULL);
}
Stop()
}boolCIcmpSocket:
Run()
time_ttStart=time(NULL);
time_ttNow=tStart;
unsignedshortusSeq=0;
DWORDulByteSndCnt=0;
DWORDulByteRcvCnt=0;
structsockaddrstIPSrc={0};
intlSrcLen=sizeof(stIPSrc);
DWORDulMsStart=0;
DWORDulLastError=0;
while((tNow-tStart)&
=m_tTestTime)
IcmpHeader*pstIcmpHdr=(IcmpHeader*)m_pSndData;
if((GetTickCount()-ulMsStart)&
=2000)
continue;
fill_icmp_data(m_pSndData,m_ulDatasize);
pstIcmpHdr-&
timestamp=GetTickCount();
i_seq=usSeq;
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);
returnfalse;
if(ulByteSndCnt&
m_ulDatasize)
memset((void*)m_pRcvData,0,MAX_DATASIZE);
ulByteRcvCnt=recvfrom(m_Socket,m_pRcvData,MAX_DATASIZE,0,
stIPSrc,&
lSrcLen);
if(SOCKET_ERROR==ulByteRcvCnt)
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;
ulDelay=(GetTickCount()-ulMsStart)+1;
m_DelayMsArray.Add(pDelay);
usSeq++;
tNow=time(NULL);
}returntrue;
GetStatistic(CDWordArray&
TimeOutArray,CPtrArray&
DelayMsArray)
DWORDulDelayCnt=0;
DWORDulTimeOutCnt=0;
ulDelayCnt=m_DelayMsArray.GetSize();
ulTimeOutCnt=m_TimeOutArray.GetSize();
for(ulLoop=0;
DelayMsInfo*pRetDelay=(DelayMsInfo*)malloc(sizeof(DelayMsInfo));
memcpy(pRetDelay,pstDelay,sizeof(DelayMsInfo));
DelayMsArray.Add(pRetDelay);
}for(ulLoop=0;
ulTimeOutCnt;
TimeOutArray.Add(m_TimeOutArray[ulLoop]);
returntrue;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多线程 使用 不同 原始 socket 发送 ICMP 问题