android - 从linux内核中的netfilter NF_INET_PRE_ROUTING钩子(Hook)函数接收socket信息

标签 android linux kernel hook netfilter

我为 linux 内核中的传入数据包编写了一个 netfilter Hook 函数。有没有办法从钩子(Hook)函数中获取接收套接字信息。代码是

register() {
        hk.hook = hookfunction;
        hk.hooknum = NF_INET_PRE_ROUTING;
        hk.pf = PF_INET;
        hk.priority = NF_IP_PRI_LAST;
}

static unsigned int hookfunction (void *priv,struct sk_buff,const struct nf_hook_state *state) {
        if (skb->sk) {
                printk("%d", skb->sk->sk_mark);
        }
}

假设我在端口 15000 打开了一个 udp 套接字,一个 udp 数据包到达端口 15000。在上面编写的钩子(Hook)函数中,我如何访问在端口 15000 打开的 udp 套接字的 struct sock。使用上面的代码,控件不会通过 if(skb->sk) 条件,就好像 skb->sk 为空一样。你能给我建议一种方法来获取套接字的结构 socks ,还是我应该把钩子(Hook)放在其他位置,比如 NF_INET_LOCAL_IN,我也对 NF_INET_XX_XX 和 NF_IP_XX_XX 之间的区别感到困惑。

最佳答案

内核在内部使用__inet_lookup_skb()从skb获取sk,skb首先调用skb_steal_sock()检查skb->skNULL,如果是这种情况,它会调用__inet_lookup() 来查找sk。

但是您可能需要稍微调整一下内核,因为 __inet_lookup_skb 符号未导出且无法直接调用。

内核源代码的一些引用资料: 1 2 3

关于 NF_INET_XX 如果你在谈论 NF_IP_PRE_ROUTINGNF_INET_PRE_ROUTING 我相信 NF_IP_PRE_ROUTING 在最近的内核中已经过时了,据我所知,4.4 已将其替换为 NF_INET_PRE_ROUTING

希望对您有所帮助。

关于android - 从linux内核中的netfilter NF_INET_PRE_ROUTING钩子(Hook)函数接收socket信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44146312/

相关文章:

android - 用于启动应用程序的 Activity 不存在!确保它存在

python - 用python调用多个过程

c - Linux内核中的udp_deliver api在哪里?

linux - 我们如何在 Linux 内核的第 2 层(使用 MAC 地址)发送/接收帧

android - 在 Android 上使用 RNCryptor

安卓矢量兼容性

Android:具有枚举比较的数据绑定(bind)表达式

linux - Bash 未终止的字符串/语法错误

linux - 使用 sed 脚本每隔一行将当前行的一部分与下一行的一部分组合起来

c - 在对卸载的文件执行 mmap() 后避免崩溃