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

📄 ~pp_http_flow.~cpp

📁 一个基于智能的检测工具
💻 ~CPP
字号:
// PP_Http_Flow.cpp: implementation of the CPP_Http_Flow class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "..\IIDS.h"
#include "PP_Http_Flow.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//汪兴东增加代码如下:
#include "..\Add_Func_To_Preproc_List.h"
#include "..\global.h"
#include <Printout.h>
#include <MString.h>
#include <Http_Spec.h>
//汪兴东增加代码如上

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

//##ModelId=407BA7B101DD
CPP_Http_Flow::CPP_Http_Flow()
{

}

//##ModelId=407BA7B101E7
CPP_Http_Flow::~CPP_Http_Flow()
{

}
/*****************************************
作者:汪兴东    最后修改时间2004.04.12
*******************************************
CPP_Http_Flow::Init_Http_Flow函数完成解析规则文件中对应的参数,
并将处理函数添加到预处理函数链表
****************************************
参数:
args: 被解析的参数
******************************************
返回值:
void
*******************************************/
//##ModelId=407BA7B101CB
void CPP_Http_Flow::Init_Http_Flow(u_char *args)
{
   if(Parse_Http_Flow_Args(args)==0)
	//解析规则文件的参数,并为规则链表的动态结构赋值
   {
	    CAdd_Func_To_Preproc_List(Http_Flow);
		//将函数添加到预处理器函数链表
   }

}
/*****************************************
作者:汪兴东    最后修改时间2004.04.12
*******************************************
CPP_Http_Flow::Parse_Http_Flow_Argsw函数完成解析规则文件中对应的参数
****************************************
参数:
args: 被解析的参数
******************************************
返回值:
0: 正常
1: 被解析的参数为空
2: 预处理器深度参数错
3: 预处理器反应字节值错误
4: 参数错误
*******************************************/
//##ModelId=407BA7B101C1
int CPP_Http_Flow::Parse_Http_Flow_Args(u_char  *args)
{
    SHTTP_FLOW hfInfo;
	//http的数据结构
    char **Toks;
    int int_tok_num;
    int int_ctr;
    int int_ports_set = 0;
    int int_port;

    memset(&hfInfo, 0x00, sizeof(hfInfo));
	//hfINfo清零
    
    if(args == NULL)
    {
		CPrintout::Printout_Wrong_Message("错误!预处理参数为空!");        
		return(1);
    }

	Toks = CMString::mSplit((char *)args, " \t", HTTPFLOW_MAX_TOKENS, &int_tok_num, '\\');
	//将参数分割成有意义的字符串

    hfInfo.int_type = HTTPFLOW_QUICK;
	//有两种互斥的分析方式: HTTPFLOW_FULL 和HTTPFLOW_QUICK 
	//这里默认为QUICK分析方式

	global_int_Http_Flow_Byte_Count=HTTPFLOW_SS_BYTE_CNT;	
    hfInfo.int_depth = HTTPFLOW_SS_BYTE_CNT;
	//默认计数    
	memset(&global_ai_Http_Flow_Ports, 0x00, sizeof(global_ai_Http_Flow_Ports));
	//端口数组清零

    for(int_ctr =0; int_ctr < int_tok_num; int_ctr++)
    {
        if(!strcmp(HTTPFLOW_SS_BYTE_CNT_TOKEN, Toks[int_ctr]))
        {
            int_ctr++;
            if(int_ctr >= int_tok_num)
            {
				CPrintout::Printout_Wrong_Message("预处理器深度值错误,必须为0或正数!");
				//缺少代码:以后加上表示当前文件名和行数的代码
				return(2);
            }

            if(Verify_Response_Bytes(Toks[int_ctr]))
            {
				CPrintout::Printout_Wrong_Message("预处理器反应字节值错误,必须为0或正数!");
				//缺少代码:以后加上表示当前文件名和行数的代码
				return(3);  
            }
                
            hfInfo.int_depth = atoi(Toks[int_ctr]);            
			global_int_Http_Flow_Byte_Count=hfInfo.int_depth;
        }
        else if(!strcmp(HTTPFLOW_PORTS_TOKEN, Toks[int_ctr]))
        {
            for(int_ctr++; int_ctr < int_tok_num; int_ctr++)
            {
                if(Verify_Http_Flow_Port(Toks[int_ctr]))
                {                    
                    int_ctr--;
					//回朔
                    break;
                }

                int_port = atoi(Toks[int_ctr]);

                hfInfo.ai_ports[int_port] = 1;
                Add_Http_Flow_Port(int_port);

                if(!int_ports_set)
                {
                    int_ports_set = 1;
                }
            }
        }
	    
        else
        {
			CPrintout::Printout_Wrong_Message("预处理器参数错误,必须为0或正数!");
			//缺少代码:以后加上表示当前文件名和行数的代码
			return(4);  
            
        }
    }
     
    if(!int_ports_set)
    {
        hfInfo.ai_ports[80] = 1;
        Add_Http_Flow_Port(80);
    }
	//如果没有设置端口,设为80断口

	return(0);
}
/*****************************************
作者:汪兴东    最后修改时间2004.04.12
*******************************************
CPP_Http_Flow::Http_Flow判断数据包,若是服务器端数据,则不作处理
****************************************
参数:
p: 被判断的数据包
******************************************
返回值:
void
*******************************************/

//##ModelId=407BA7B101B6
void CPP_Http_Flow::Http_Flow(SPacket *p)
{

    if(CHttp_Spec::Is_Http_Server_Data(p))
		//如果是服务器端数据则不处理
    {
         global_int_do_detect = 0;
		 //不作检测
        p->int_preprocessors = 0;
		//不做预处理
        p->int_preprocessors |= PP_PORTSCAN;
        p->int_preprocessors |= PP_STREAM4;
		//改变标志已作其他处理
    }

}
/*****************************************
作者:汪兴东    最后修改时间2004.04.12
*******************************************
CPP_Http_Flow::Verify_Response_Bytes函数判断字符串是否为数字
****************************************
参数:
pcBytes: 被判断的字符串
******************************************
返回值:
0: 正确
1: 错误
*******************************************/
//##ModelId=407BA7B101AC
int CPP_Http_Flow::Verify_Response_Bytes(char *pcBytes)
{
	unsigned  int int_ctr;
    for(int_ctr = 0; int_ctr < strlen(pcBytes); int_ctr++)
    {
        if(!isdigit(pcBytes[int_ctr]))
        {
            return 1;
        }
    }

    return 0;
}
/*****************************************
作者:汪兴东    最后修改时间2004.04.12
*******************************************
CPP_Http_Flow::Add_Http_Flow_Port函数对端口号进行有效性检验,并添加端口号
****************************************
参数:
int_port: 被添加的端口号
******************************************
返回值:
0: 正确
1: 错误
*******************************************/
//##ModelId=407BA7B101A2
int CPP_Http_Flow::Add_Http_Flow_Port(int int_port)
{
    if(int_port < 1 || int_port > 65535)
    {
        return 1;
    }

    global_ai_Http_Flow_Ports[int_port] = 1;

    return 0;
}
/*****************************************
作者:汪兴东    最后修改时间2004.04.12
*******************************************
CPP_Http_Flow::Verify_Http_Flow_Port函数判断端口号有效性
****************************************
参数:
pcBytes: 被判断的端口号
******************************************
返回值:
0: 正确
1: 错误
*******************************************/
//##ModelId=407BA7B10197
int CPP_Http_Flow::Verify_Http_Flow_Port(char *pcPort)
{
	unsigned int int_ctr;
    int int_port;

    for(int_ctr = 0; int_ctr < strlen(pcPort); int_ctr++)
    {
        if(!isdigit(pcPort[int_ctr]))
        {
            return 1;
        }
    }

    int_port = atoi(pcPort);

    if(int_port < 1 || int_port > 65535)
    {
        return 1;
    }

    return 0;

}

⌨️ 快捷键说明

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