我试图搜索一些HTTP标头,并且正在查找包含" bbc.co.uk"的数据包。
据我所知,我正确使用这些方法,但我必须忽略一些显而易见的事情,因为找不到匹配的东西,尽管我打印出的数据包内容已经存在,匹配。
任何人都可以看到错误吗?
void parseHTTP(const unsigned char *packet, int length)
{
int i;
const char *blacklisted = "www.bbc.co.uk/news";
const char *payload[length+1];
for(i = 0; i < length; i++)
{
char byte = packet[i];
if (byte > 31 && byte < 127)
{
printf("%c", byte);
payload[i] = byte;
}
}
//char *result;
//result = strstr(payload, blacklisted);
//printf("%s", result);
if(strstr(payload, blacklisted) != NULL)
{
printf("Found match \n");
blacklistedCount ++;
}
}
答案 0 :(得分:1)
您能否提供一些更具体的细节。
payload[i] = byte;// payload is array of char pointer, what's the need of storing single character into array of pointer, take payload as a single pointer
strstr(payload, blacklisted)
strstr()第一个参数是 char * ,但你采用 char指针数组。
修改您的代码如下:
void parseHTTP(const unsigned char *packet, int length)
{
int i,j=0,blacklistedCount=0;
const char *blacklisted = "www.bbc.co.uk/news";
char *payload=malloc(length);
for(i = 0; i < length; i++)
{
char byte = packet[i];
if (byte > 31 && byte < 127)
{
printf("%c", byte);
payload[j++] = byte;
continue;// add this
}
else
{
payload[j]='\0';
if(strstr(payload, blacklisted) != NULL)
{
printf("Found match : %d \n",blacklistedCount ++);
}
j=0;//again make it 0
}
}
}
根据您的要求进行修改。
答案 1 :(得分:0)
在一般的HTTP流量中,主机名和路径通常是分开的,如下所示进行拆分:
GET /news HTTP/1.1
Host: www.bbc.co.uk
(加上更多请求标头)。因此,包含HTTP流量的TCP段永远不会包含字符串www.bbc.co.uk/news
逐字。
答案 2 :(得分:0)
payload
的类型是一个char
指针数组,它是一个4/8(平台相关)字节类型。
这意味着数组中每4个字节中有3个是0
,在大多数平台上都是'\0'
,因此strstr
函数运行0-1次迭代,具体取决于系统的Endianity。
您正在寻找的定义可能是char payload[length+1];
在此期间 - 也没有理由认为packet
是unsigned
。
另外:
for(i = 0; i < length; i++)
{
char byte = packet[i];
if (byte > 31 && byte < 127)
{
printf("%c", byte);
payload[i] = byte;
}
}
请注意,您在i
和payload
上使用packet
- 同时跳过可能包含在packet
和payload
中的不可打印字符(或相应的行下划线字符) {1}}。
当您跳过这种方式时,您会在您跳过的索引中保留\0
的未初始化数据,这可能很容易strstr
终止字符串并停止\0
。
出于这个原因,您还应该在payload
数组中添加一个尾随i
。
要解决此问题,请保留2个索引,j
和j
- 并且仅在if payload[j++] = byte;