Поиск по ключевому слову без знака в C - PullRequest
0 голосов
/ 10 марта 2019

Моя основная идея - искать в полезной нагрузке определенное слово, там или нет.Я написал этот код для поиска ключевого слова (search_for_string) в unsigned char (foo).

Проблема в том, что foo является указателем на unsigned char.Как сохранить значение указателя 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

Файл кода

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <string.h>

#include <libnetfilter_queue/libnetfilter_queue.h>
#include <linux/netfilter.h>
#include <sys/stat.h>
#include <sys/types.h>

static int cb(struct nfq_q_handle *qh, struct nfgenmsg *nfmsg,
              struct nfq_data *nfa, void *data) {
    size_t payloadLen = 0;
    unsigned char *foo;
    payloadLen = nfq_get_payload(nfa, &foo);

    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 (strstr((char *)foo, search_for_string)) {
       printf("\nThe Payload contains the keyword.");
   } else {
       printf("\nPayload does not contain the keyword.");
   }

1 Ответ

0 голосов
/ 11 марта 2019

foo, вероятно, равно NULL, что приведет к SEGFAULT при передаче в strstr. Вы должны добавить NULL-проверку перед вызовом strstr.

nfq_get_payload вернет -1 в случае ошибки, поэтому вы должны использовать подписанный тип вместо size_t для payloadLen и проверить это также.

Вот потенциальное решение:

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.");
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...