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

📄 httpparser.c

📁 Linux下面截获以态网数据包!是在内核态下面运行的驱动程序
💻 C
📖 第 1 页 / 共 5 页
字号:
		}
		
		
		if( ntohl( pTCPHeader->seq )< pHttpHashHead->nextSSeqNumber )
			return false;
			
		if( pHttpHashHead->pSTail == NULL )
		{
			//the first node
			pHttpHashHead->pSTail = pHttpHashHead->pSHead = &pItem->doubleListItem;
			if( ntohl( pTCPHeader->seq )== pHttpHashHead->nextSSeqNumber )
				pHttpHashHead->pSSeq = pHttpHashHead->pSTail;
		}
		else
		{
			pPrePacket = &(((PDOUBLE_LIST_PACKET)(pHttpHashHead->pSTail))->packet);
			if( ntohl( pTCPHeader->seq ) >= pPrePacket->nextSeqNumber )
			{
				//add tail
				pItem->doubleListItem.pPre = pHttpHashHead->pSTail;
				pHttpHashHead->pSTail->pNext = &pItem->doubleListItem;
				pHttpHashHead->pSTail = &pItem->doubleListItem;
							
			}
			else
			{
				pListPacket = (PDOUBLE_LIST_PACKET)(pHttpHashHead->pSTail)->pPre;
		
				while( pListPacket )
				{
					if( ntohl(pTCPHeader->seq) >= pListPacket->packet.nextSeqNumber )
					{
						break;
					}
					pListPacket = (PDOUBLE_LIST_PACKET)pListPacket->doubleListItem.pPre;
					
				}
				if( pListPacket )
				{
					
					//Handle the same packet
					if( pListPacket->doubleListItem.pNext == NULL )
					{
						printk("pListPacket->doubleListItem.pNext\r\n");
					}
					pIPHeader2 = (struct iphdr*)((UCHAR *)(((PDOUBLE_LIST_PACKET)pListPacket->doubleListItem.pNext)->packet.buf) + ETHER_HDR_LEN );
					pTCPHeader2 = (struct tcphdr *)( (UCHAR *)pIPHeader2 + (pIPHeader2->ihl)*4 );
					if( pTCPHeader->seq == pTCPHeader2->seq )
					{
						//same packet, 
						//reclaim the packet to the pLeisurePool
		//				printk("same packet\r\n");;
						return false;
					}
					//add middle
					//printk("Add Middle\r\n");
					pItem->doubleListItem.pNext = pListPacket->doubleListItem.pNext;
					pItem->doubleListItem.pPre = &pListPacket->doubleListItem;
					
					pListPacket->doubleListItem.pNext->pPre = &(pItem->doubleListItem);
					pListPacket->doubleListItem.pNext = &(pItem->doubleListItem);
				}
				else
				{
					//add head
					//printk("Add Head\r\n");
					pIPHeader2 = (struct iphdr*)((UCHAR *)((PDOUBLE_LIST_PACKET)pHttpHashHead->pSHead)->packet.buf + ETHER_HDR_LEN );
					pTCPHeader2 = (struct tcphdr *)( (UCHAR *)pIPHeader2 + (pIPHeader2->ihl)*4 );
					if( pTCPHeader->seq == pTCPHeader2->seq )
					{
						//same packet, 
						//reclaim the packet to the pLeisurePool
		//				printk("Add Head same packet\r\n");
						return false;
					}
					pItem->doubleListItem.pNext = pHttpHashHead->pSHead;
					pItem->doubleListItem.pPre = NULL;
					pHttpHashHead->pSHead->pPre = &(pItem->doubleListItem);
					pHttpHashHead->pSHead = &(pItem->doubleListItem);
					if( ntohl( pTCPHeader->seq )== pHttpHashHead->nextSSeqNumber )
						pHttpHashHead->pSSeq = pHttpHashHead->pSHead;
					else
						pHttpHashHead->pSSeq = NULL;
				}
										
			}
		}		
	}
		
			
	return true;
}

USHORT HandleMail(PSMTP_HASH_HEAD pHttpHashHead , PDOUBLE_LIST_HEAD pOutPut,
	PDOUBLE_LIST_HEAD pFree)
{
	struct iphdr    *pIPHeader;    // See ip.h
	struct tcphdr	*pTCPHeader;   // See tcp.h
	PSMTP_HASH_HEAD pSmtpHashHead;
	PSMTP_HASH_HEAD pOKHashHead = NULL;
	UINT	  		zero;
	char 			*pHttp = NULL;
	UCHAR			uChar;
	USHORT			webMailType = 0;
	PDOUBLE_LIST_PACKET 	pItem = NULL;
	USHORT			handleType = 0;

	zero = 0;
	if( IsCSortPacket(pHttpHashHead) )
	{
		pIPHeader = (struct iphdr*)(((PDOUBLE_LIST_PACKET)pHttpHashHead->pHead)->packet.buf + ETHER_HDR_LEN );
		pTCPHeader = (struct tcphdr *)( (UCHAR *)pIPHeader + (pIPHeader->ihl)*4 );	
		pItem = (PDOUBLE_LIST_PACKET)pHttpHashHead->pHead;
		if( ntohl( pTCPHeader->ack_seq ) <= pHttpHashHead->nextSSeqNumber || pHttpHashHead->nextSSeqNumber == 0 )
		{
			if( pItem->packet.dataLen > 0 )
			{
				if( pItem->packet.dataLen > 20 )
				{	
					pHttp = ((PDOUBLE_LIST_PACKET)pHttpHashHead->pHead)->packet.buf + ((PDOUBLE_LIST_PACKET)pHttpHashHead->pHead)->packet.dataOffset;
					uChar = *(pHttp+((PDOUBLE_LIST_PACKET)pHttpHashHead->pHead)->packet.dataLen);
					*(pHttp+((PDOUBLE_LIST_PACKET)pHttpHashHead->pHead)->packet.dataLen) = '\0';	
					if( ntohl( pTCPHeader->ack_seq ) <= pHttpHashHead->nextSSeqNumber || pHttpHashHead->nextSSeqNumber == 0 )
					{
						if(kstristr( pHttp, pHttpHashHead->pConfig->rcflag, 100 ))
						{
							pItem->packet.type = WEB_MAIL_BEGIN_PACKET;
							pHttpHashHead->webMailType = (WEBMAIL_RECEIVE|WEBMAIL_CON);
							//输出
							handleType = HANDLE_TYPE_OUTPUT;
							//printk("%s\r\n", pHttp);
						}
						else if(kstristr( pHttp, pHttpHashHead->pConfig->raflag, 2 ))
						{
							pItem->packet.type = WEB_MAIL_BEGIN_PACKET;
							pHttpHashHead->webMailType = (WEBMAIL_RECEIVE|WEBMAIL_ATTACH);
							//输出
							handleType = HANDLE_TYPE_OUTPUT;
							//printk("%s\r\n", pHttp);
						}
						else if(kstristr( pHttp, pHttpHashHead->pConfig->scflag, 100 ))
						{
							pItem->packet.type = WEB_MAIL_BEGIN_PACKET;
							pHttpHashHead->webMailType = (WEBMAIL_SEND|WEBMAIL_CON);
							//输出
							handleType = HANDLE_TYPE_OUTPUT;
							//printk("%s\r\n", pHttp);
						}
						else if(kstristr( pHttp, pHttpHashHead->pConfig->saflag, 2 ))
						{
							pItem->packet.type = WEB_MAIL_BEGIN_PACKET;
							pHttpHashHead->webMailType = (WEBMAIL_SEND|WEBMAIL_ATTACH);
							//输出
							handleType = HANDLE_TYPE_OUTPUT;
							//printk("%s\r\n", pHttp);
						}	
						else
						{
							if( pHttpHashHead->webMailType & WEBMAIL_SEND )
							{
								//输出
								handleType = HANDLE_TYPE_OUTPUT;
								
							}
							else
							{
								pHttpHashHead->webMailType = WEBMAIL_INIT;
								//丢弃
								handleType = HANDLE_TYPE_FREE;
								//_InsertTailListNonLock( pFree, &(pItem->doubleListItem) );
							}
							
						}
					}
					else
					{
						//等待
						handleType = HANDLE_TYPE_WAITE;
					}
					*(pHttp+((PDOUBLE_LIST_PACKET)pHttpHashHead->pHead)->packet.dataLen) = uChar;
				}
				else
				{
					if( pHttpHashHead->webMailType & WEBMAIL_SEND )
					{
						//输出
						handleType = HANDLE_TYPE_OUTPUT;
						
					}
					else
					{
						pHttpHashHead->webMailType = WEBMAIL_INIT;
						//丢弃
						handleType = HANDLE_TYPE_FREE;
						//_InsertTailListNonLock( pFree, &(pItem->doubleListItem) );
					}
				}
			}
			else
			{
				//Ack,Fin
				
				if( pTCPHeader->fin )
				{
					handleType = HANDLE_TYPE_CONNECTION_CLOSE;
					pItem->packet.type = WEB_MAIL_END_PACKET;
				}
				else
					handleType = HANDLE_TYPE_FREE;
				
			}
		}
		else
		{
			handleType = HANDLE_TYPE_WAITE;
		}
		switch( handleType )
		{
			case HANDLE_TYPE_OUTPUT:
			case HANDLE_TYPE_FREE:	
			case HANDLE_TYPE_CONNECTION_CLOSE:
				pHttpHashHead->nextSeqNumber = ((PDOUBLE_LIST_PACKET)pHttpHashHead->pHead)->packet.nextSeqNumber;
				pHttpHashHead->pHead = pHttpHashHead->pHead->pNext;
				if( pHttpHashHead->pHead == NULL )
				{
					pHttpHashHead->pTail = pHttpHashHead->pSeq = NULL;
				}
				else
				{	
					pHttpHashHead->pHead->pPre = NULL;
					pIPHeader = (struct iphdr*)(((PDOUBLE_LIST_PACKET)pHttpHashHead->pHead)->packet.buf + ETHER_HDR_LEN );
					pTCPHeader = (struct tcphdr *)( (UCHAR *)pIPHeader + (pIPHeader->ihl)*4 );				
					if( ntohl( pTCPHeader->seq )== pHttpHashHead->nextSeqNumber )
						pHttpHashHead->pSeq = pHttpHashHead->pHead;	
					else
						pHttpHashHead->pSeq = NULL;			
				}
				InitializeDoubleListItem( &pItem->doubleListItem );
				if( handleType == HANDLE_TYPE_OUTPUT || handleType == HANDLE_TYPE_CONNECTION_CLOSE)
					_InsertTailListNonLock( pOutPut, &(pItem->doubleListItem) );
				else
					_InsertTailListNonLock( pFree, &(pItem->doubleListItem) );
				break;
			case HANDLE_TYPE_WAITE:
				break;
			default:
				break;
		}	
	}
	if( IsSSortPacket(pHttpHashHead) )
	{
		pIPHeader = (struct iphdr*)(((PDOUBLE_LIST_PACKET)pHttpHashHead->pSHead)->packet.buf + ETHER_HDR_LEN );
		pTCPHeader = (struct tcphdr *)( (UCHAR *)pIPHeader + (pIPHeader->ihl)*4 );	
		pItem = (PDOUBLE_LIST_PACKET)pHttpHashHead->pSHead;
		if( ntohl( pTCPHeader->ack_seq ) <= pHttpHashHead->nextSeqNumber )
		{
			if( pItem->packet.dataLen > 0 )
			{
				if( pItem->packet.dataLen > 10 )
				{
					pHttp = ((PDOUBLE_LIST_PACKET)pHttpHashHead->pSHead)->packet.buf + ((PDOUBLE_LIST_PACKET)pHttpHashHead->pSHead)->packet.dataOffset;
					uChar = *(pHttp+((PDOUBLE_LIST_PACKET)pHttpHashHead->pSHead)->packet.dataLen);
					*(pHttp+((PDOUBLE_LIST_PACKET)pHttpHashHead->pSHead)->packet.dataLen) = '\0';	
					if( ntohl( pTCPHeader->ack_seq ) <= pHttpHashHead->nextSeqNumber )
					{
						if(kstristr( pHttp, "HTTP", 2 ))
						{
							//输出
							handleType = HANDLE_TYPE_OUTPUT;
							//printk("%s\r\n", pHttp);
						}	
						else
						{
							if( pHttpHashHead->webMailType & WEBMAIL_RECEIVE )
							{
								//输出
								handleType = HANDLE_TYPE_OUTPUT;
								
							}
							else
							{
								//丢弃
								handleType = HANDLE_TYPE_FREE;
							}
							
						}
					}
					else
					{
						//等待
						handleType = HANDLE_TYPE_WAITE;
					}
					*(pHttp+((PDOUBLE_LIST_PACKET)pHttpHashHead->pSHead)->packet.dataLen) = uChar;
				}
				else
				{
					if( pHttpHashHead->webMailType & WEBMAIL_RECEIVE )
					{
						//输出
						handleType = HANDLE_TYPE_OUTPUT;
						
					}
					else
					{
						//丢弃
						handleType = HANDLE_TYPE_FREE;
					}
				}
			}
			else
			{
				//Ack,Fin
				
				if( pTCPHeader->fin )
				{
					handleType = HANDLE_TYPE_CONNECTION_CLOSE;
					pItem->packet.type = WEB_MAIL_END_PACKET;
				}
				else
					handleType = HANDLE_TYPE_FREE;
				
			}
		}
		else
			handleType = HANDLE_TYPE_WAITE;
			
			
		switch( handleType )
		{
		case HANDLE_TYPE_OUTPUT:
		case HANDLE_TYPE_FREE:	
		case HANDLE_TYPE_CONNECTION_CLOSE:
			pHttpHashHead->nextSSeqNumber = ((PDOUBLE_LIST_PACKET)pHttpHashHead->pSHead)->packet.nextSeqNumber;
			pHttpHashHead->pSHead = pHttpHashHead->pSHead->pNext;
			
			if( pHttpHashHead->pSHead == NULL )
			{
				pHttpHashHead->pSTail = pHttpHashHead->pSSeq = NULL;
			}
			else
			{
				pHttpHashHead->pSHead->pPre = NULL;
				pIPHeader = (struct iphdr*)(((PDOUBLE_LIST_PACKET)pHttpHashHead->pSHead)->packet.buf + ETHER_HDR_LEN );
				pTCPHeader = (struct tcphdr *)( (UCHAR *)pIPHeader + (pIPHeader->ihl)*4 );	
				
				if( ntohl( pTCPHeader->seq )== pHttpHashHead->nextSSeqNumber )
					pHttpHashHead->pSSeq = pHttpHashHead->pSHead;	
				else
					pHttpHashHead->pSSeq = NULL;			
			}
			InitializeDoubleListItem( &pItem->doubleListItem );
			if( handleType == HANDLE_TYPE_OUTPUT 
				|| handleType == HANDLE_TYPE_CONNECTION_CLOSE)
			{
				_InsertTailListNonLock( pOutPut, &(pItem->doubleListItem) );
			}
			else
			{
				_InsertTailListNonLock( pFree, &(pItem->doubleListItem) );
			}
			
			break;
		case HANDLE_TYPE_WAITE:
			break;
		default:
			break;
		}			
		
	}


	return handleType;
}

char SortPacketEx(PSMTP_HASH_HEAD pHttpHashHead ,PDOUBLE_LIST_PACKET pItem, 
		PDOUBLE_LIST_HEAD pFree)
{
	struct iphdr           		*pIPHeader;    // See ip.h
	struct tcphdr	     		*pTCPHeader;   // See tcp.h
	struct iphdr           		*pIPHeader2;    // See ip.h
	struct tcphdr	     		*pTCPHeader2;   // See tcp.h
	PSMTP_HASH_HEAD     		pOKHashHead = NULL;
	struct timeval  				zero;
	char 						*pHttp = NULL;
	UCHAR						uChar;
	USHORT						webMailType = 0;
	char						bReturn = false;
	PPACKET_DATA 				pPrePacket;
	PDOUBLE_LIST_PACKET 		pListPacket;
	PDOUBLE_LIST_PACKET 		pOldPacket;
	
	

	pIPHeader = (struct iphdr*)(pItem->packet.buf + ETHER_HDR_LEN );
	pTCPHeader = (struct tcphdr *)( (UCHAR *)pIPHeader + (pIPHeader->ihl)*4 );
	
	InitializeDoubleListItem( &pItem->doubleListItem );
		
	if( IS_FROM_CLIENT( pItem->packet.type ) )
	{
		//client the first node
		if( pHttpHashHead->nextSeqNumber == 0 )
		{
			pHttpHashHead->cAck = pHttpHashHead->nextSeqNumber = pItem->packet.nextSeqNumber;
			pHttpHashHead->pHead = pHttpHashHead->pTail = &pItem->doubleListItem;
			pHttpHashHead->iNumber++;
			return true;
		}
		
		if( ntohl( pTCPHeader->seq ) < pHttpHashHead->nextSeqNumber )
			return false;
			
		if( pHttpHashHead->pTail == NULL )
		{
			//the first node
			pHttpHashHead->pTail = pHttpHashHead->pHead = &pItem->doubleListItem;

⌨️ 快捷键说明

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