在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.");
}