在C中的无符号字符中搜索关键字

在C中的无符号字符中搜索关键字,c,arrays,pointers,C,Arrays,Pointers,我的主要想法是在有效载荷中搜索特定的单词,不管它是否存在。我写这段代码是为了在无符号字符(foo)中搜索关键字(search\u for\u string) 问题在于foo是指向无符号字符的指针。如何将指针foo的值保存在新字符串变量中,并在strstr中使用它? 对于iptables,我已通过终端设置了此规则: sudo iptables -t filter -I OUTPUT --proto tcp -j NFQUEUE --queue-num 1 这是我运行代码之前的测试nping: s

我的主要想法是在有效载荷中搜索特定的单词,不管它是否存在。我写这段代码是为了在
无符号字符
foo
)中搜索关键字(
search\u for\u string

问题在于
foo
是指向
无符号字符的指针。如何将指针
foo
的值保存在新字符串变量中,并在
strstr
中使用它?

对于iptables,我已通过终端设置了此规则:

sudo iptables -t filter -I OUTPUT --proto tcp -j NFQUEUE --queue-num 1
这是我运行代码之前的测试nping:

sudo nping -c 10 --tcp -p 80,433 --data-string helloWorld 185.60.216.35
要编译我另外使用的文件,请执行以下操作:

gcc -o output input.c -lnetfilter_queue -lnfnetlink
代码文件

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
静态int cb(结构nfq_q_句柄*qh,结构nfgenmsg*nfmsg,
结构nfq_数据*nfa,void*数据){
有效载荷的大小=0;
无符号字符*foo;
payloadLen=nfq\U get\U有效载荷(nfa和foo);
结构iphdr*ip_头;
ip_头=(结构iphdr*)foo;
结构nfqnl_msg_packet_hdr*ph;
ph=nfq\u get\u msg\u packet\u hdr(nfa);
字符搜索搜索字符串[]=“helloWorld”;
if(strstr((char*)foo,搜索字符串)){
printf(“\n有效负载包含关键字。”);
}否则{
printf(“\nPayload不包含关键字。”);
}

foo可能等于NULL,这将在传递到strstrstr时导致SEGFAULT。您应该在调用strstr之前添加NULL检查

nfq_get_payload将在出错时返回-1,因此对于payloadLen,您应该使用有符号类型而不是size_t,并检查这一点

这里有一个潜在的解决方案:

static int cb(struct nfq_q_handle *qh, struct nfgenmsg *nfmsg, struct 
nfq_data *nfa, void *data) {

ssize_t payloadLen;                          //Note: Signed type
unsigned char *foo = NULL;                   //Note: Init with NULL
payloadLen = nfq_get_payload(nfa, &foo);

if(payloadLen < 0){
   //TODO: Do something...
}

struct iphdr *ip_header;
ip_header = (struct iphdr *)foo;

struct nfqnl_msg_packet_hdr *ph;
ph = nfq_get_msg_packet_hdr(nfa);
char search_for_string[] = "helloWorld";

if((foo == NULL) || (payloadLen < 0)){
   //TODO: print something if you want
}
else if (memmem((void*)foo, payloadLen, search_for_string, strlen(search_for_string))) 
   {
       printf("\nThe Payload contains the keyword.");
   } 
else 
   {
       printf("\nPayload does not contain the keyword.");
   }
static int cb(struct nfq_q_handle*qh,struct nfgenmsg*nfmsg,struct
nfq_数据*nfa,无效*数据){
ssize\u t payloadLen;//注意:签名类型
unsigned char*foo=NULL;//注意:Init带有NULL
payloadLen=nfq\U get\U有效载荷(nfa和foo);
如果(有效载荷小于0){
//托多:做点什么。。。
}
结构iphdr*ip_头;
ip_头=(结构iphdr*)foo;
结构nfqnl_msg_packet_hdr*ph;
ph=nfq\u get\u msg\u packet\u hdr(nfa);
字符搜索搜索字符串[]=“helloWorld”;
if((foo==NULL)| |(payloadLen<0)){
//TODO:如果需要,可以打印一些内容
}
else if(memmemmem((void*)foo,payloadLen,搜索字符串,strlen(搜索字符串)))
{
printf(“\n有效负载包含关键字。”);
} 
其他的
{
printf(“\nPayload不包含关键字。”);
}

显示
foo
的定义。什么意思,foo是
char**
?在这种情况下,只需执行
if(strstrstr(*foo,
char*str=*foo;if(strstrstr,
)就可以了。请注意,字符串中的
foo是指向数组的指针
在执行
if(strstrstr,
时是不兼容的(*foo,…
我得到了错误消息:传递'strstrstr'的参数1会从整数生成指针,而不使用强制转换[-Wint conversion]if(strstrstr(*foo,search_for_string)){@Codestructor:那么它可能指向不正确的地方。你应该提供一个@Codestructor:来添加这些细节。正如你所注意到的,注释中的代码很难阅读。谢谢大家!现在它工作得很好!只需注意:我必须在文件的顶部,在所有标题之前包含“#define _GNU_SOURCE”。
static int cb(struct nfq_q_handle *qh, struct nfgenmsg *nfmsg, struct 
nfq_data *nfa, void *data) {

ssize_t payloadLen;                          //Note: Signed type
unsigned char *foo = NULL;                   //Note: Init with NULL
payloadLen = nfq_get_payload(nfa, &foo);

if(payloadLen < 0){
   //TODO: Do something...
}

struct iphdr *ip_header;
ip_header = (struct iphdr *)foo;

struct nfqnl_msg_packet_hdr *ph;
ph = nfq_get_msg_packet_hdr(nfa);
char search_for_string[] = "helloWorld";

if((foo == NULL) || (payloadLen < 0)){
   //TODO: print something if you want
}
else if (memmem((void*)foo, payloadLen, search_for_string, strlen(search_for_string))) 
   {
       printf("\nThe Payload contains the keyword.");
   } 
else 
   {
       printf("\nPayload does not contain the keyword.");
   }