我正在尝试删除包含字符串的网络数据包:即,如果网页上显示“免费下载”,我需要我的内核模块删除包含该字符串的数据包。我正在尝试通过netfilter钩子中的sk_buff进行扫描,但不确定是否是查找字符串的正确位置。这是代码:
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;
}
答案 0 :(得分:2)
这听起来并不容易。
我还不太了解编写用于网络过滤的内核模块,因此我无法对您的代码发表评论。但是我认为这里的主要问题是您只能访问“原始”数据包。 当今的Internet大多使用TLS(https)加密,因此您无法在该级别上读取传输的内容(很好)。这意味着您的模块只能在未加密的HTTP连接上工作。另一个问题可能是像GZIP这样的HTTP压缩,它也可能会扰乱您的数据。