📄 ~pp_http_flow.~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 + -