Я пытаюсь отбросить сетевые пакеты, содержащие строку: т.е. если на веб-странице написано «бесплатная загрузка», мне нужно, чтобы мой модуль ядра отбрасывал пакеты, содержащие эту строку. Я пытаюсь просканировать sk_buff в ловушке netfilter, но не уверен, что это подходящее место для поиска строки. вот код:
unsigned int hook_func_outgoing(void *priv,
struct sk_buff *skb,
const struct nf_hook_state *state) {
int pos;
struct ts_config *conf;
struct ts_state statetext;
const char *pattern = "free download";
conf = textsearch_prepare("kmp", pattern, strlen(pattern),
GFP_KERNEL, TS_AUTOLOAD);
pos = textsearch_find_continuous(conf, &statetext, skb->data, skb->len);
printk(KERN_INFO "pos: %d", pos);
printk(KERN_INFO "data: %s ", skb->data);
if (pos != UINT_MAX){
return NF_DROP;
printk(KERN_INFO "found spam\n");
}
textsearch_destroy(conf);
return NF_ACCEPT;
}





Это не так просто, как кажется.
Я не совсем осведомлен о написании модулей ядра для сетевой фильтрации, поэтому не могу комментировать ваш код. Но я думаю, что главная проблема здесь в том, что у вас есть доступ только к «сырым» пакетам. Интернет в настоящее время в основном зашифрован с использованием TLS (https), и поэтому вы не можете прочитать содержимое передачи на этом уровне (что хорошо). Это означает, что ваш модуль может работать только с незашифрованными HTTP-соединениями. Другой проблемой может быть сжатие HTTP, такое как GZIP, которое тоже может шифровать ваши данные.