如何在 debian 64 位上从 tcphdr (sk_buff) 结构访问数据/有效负载?

2024-02-26

我正在开发一个小型防火墙,我必须从端口 80 (http) 检索每个 tcp 数据包的数据以进行解析。这段代码在 debian 32 位虚拟机上运行良好,我能够打印每个网页的标题,但是当我尝试加载内核模块并通过 http 端口传输一些数据时,它不打印任何数据。

当我编译时,它仅在我的 64 位计算机上显示这些警告:

/home/dev3/C/FIREWALL/firewall.c: In function ‘hook_func’:
/home/dev3/C/FIREWALL/firewall.c:179: warning: cast from pointer to integer of different size
/home/dev3/C/FIREWALL/firewall.c:179: warning: cast to pointer from integer of different size

请问有人有什么想法吗?

Thanks.

Code :

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/netfilter.h>

#undef __KERNEL__
#include <linux/netfilter_ipv4.h>
#define __KERNEL__

#include <linux/ip.h>
#include <linux/tcp.h>

static struct nf_hook_ops nfho;

unsigned int hook_func( unsigned int hooknum,
                    struct sk_buff * skb,
                    const struct net_device * in,
                    const struct net_device * out,
                    int (*okfn)(struct sk_buff *))
{
    struct iphdr    * iph;
    struct tcphdr   * tcph;
    unsigned char   * http_port = "\x00\x50";
    char            * data;

    if (skb)
    {
        iph = ip_hdr(skb);

        if (iph && iph->protocol && (iph->protocol == IPPROTO_TCP))
        {
            tcph = (struct tcphdr *)((__u32 *)iph + iph->ihl);

            if ((tcph->source) == *(unsigned short *)http_port)
            {
                data    = (char *)((int)tcph + (int)(tcph->doff * 4));

                printk(KERN_DEBUG "TCP source : %hu, TCP  dest : %hu\n", ntohs(tcph->source), ntohs(tcph->dest));
                printk(KERN_DEBUG "TCP seq : %u, TCP ack_seq : %u\n", ntohl(tcph->seq), ntohl(tcph->ack_seq));
                printk(KERN_DEBUG "TCP doff : %hu, TCP window : %hu\n", ntohs(tcph->doff), ntohs(tcph->window));
                printk(KERN_DEBUG "TCP check : 0x%hx, TCP urg_ptr : %hu\n", ntohs(tcph->check), ntohs(tcph->urg_ptr));
                printk(KERN_DEBUG "FLAGS=%c%c%c%c%c%c\n\n",
                        tcph->urg ? 'U' : '-',
                        tcph->ack ? 'A' : '-',
                        tcph->psh ? 'P' : '-',
                        tcph->rst ? 'R' : '-',
                        tcph->syn ? 'S' : '-',
                        tcph->fin ? 'F' : '-');
                //printk(KERN_DEBUG "sending packet to : %pI4\n", &iph->daddr);
                printk(KERN_DEBUG "data len : %d\ndata : \n", (int) strlen(data));
                printk(KERN_DEBUG "%s\n", data);
            }
        }
    }

    return NF_ACCEPT;
}

int init_module()
{
    int result;

    nfho.hook   = (nf_hookfn *) hook_func;
    nfho.hooknum    = NF_IP_POST_ROUTING;
    nfho.pf     = PF_INET;
    nfho.priority   = NF_IP_PRI_FIRST;

    result = nf_register_hook(&nfho);

    if(result)
    {
        printk(KERN_DEBUG "firewall : erreur nf_register_hook !\n");
        return 1;
    }

    printk(KERN_DEBUG "firewall : module charge.\n");

    return 0;
}

void cleanup_module()
{
    nf_unregister_hook(&nfho);
    printk(KERN_DEBUG "firewall : module decharge.\n");
}

(char *)((int)tcph + (int)(tcph->doff * 4));是错误的,应该是

(char *)((unsigned char *)tcph + (tcph->doff * 4));

注意printk(KERN_DEBUG "data len : %d\ndata : \n", (int) strlen(data));这根本不是一件安全的事情。您不知道数据是否包含文本,如果包含,它可能不包含以 0 结尾的字符串,而 strlen(data) 需要按您的预期工作。

在比较端口和可能的其他字段时,您可能还需要关心字节顺序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 debian 64 位上从 tcphdr (sk_buff) 结构访问数据/有效负载? 的相关文章

  • 使用 CLion 进行 OpenCV Windows 设置

    我想在 Windows 上为 CLion IDE 设置 OpenCV 我尝试使用 OpenCV 3 1 和 2 4 得到相同的结果 我有 Windows 10 64 位 CLion 使用 cygwin 环境 到目前为止我做了什么 1 从Op
  • json.net自定义jobject反序列化

    我正在尝试使用 JsonConvert DeserializeObject string 将字符串反序列化为可与动态一起使用的 jobject 来动态访问 json 文档 但是我想避免知道文档的大小写 以便我可以输入 dynamic doc
  • 为什么 F# 的默认集合是排序的,而 C# 的不是?

    当从 C 世界迁移到 F 最惯用的可能 思维方式时 我发现了这个有趣的差异 在 C 的 OOP mutable 世界中 默认的集合集合似乎是HashSet https learn microsoft com en us dotnet api
  • 在 Java 中创建 T 的新实例

    在C 中 我们可以定义一个泛型class A
  • C++ 长 switch 语句还是用地图查找?

    在我的 C 应用程序中 我有一些值充当代表其他值的代码 为了翻译代码 我一直在争论使用 switch 语句还是 stl 映射 开关看起来像这样 int code int value switch code case 1 value 10 b
  • 删除是如何工作的? [复制]

    这个问题在这里已经有答案了 可能的重复 C 编程 free 如何知道要释放多少 https stackoverflow com questions 1518711 c programming how does free know how m
  • 有没有办法在 xcode 上使用 c++0x ?我想使用 gcc 4.4 或更高版本

    我想使用 gcc 4 4 或更高版本进行 iphone 开发 有人知道怎么做吗 不 你不知道 相信我 你不会 Apple 仍保留 gcc 4 2 1 因为 4 2 2 及更高版本使用 GPLv3 这意味着他们必须放弃对其平台的控制 对于 i
  • 将完整模板参数值映射到原始类型

    我想将数字映射到类型 在这个例子中 我将创建一个函数 将 sizeof 结果映射到有符号的原始类型 我想知道是否有更好的方法来完成我在现代 C 中所做的事情 即采用模板化值并将其转换为类型 现在 这可以将大小转换为已知类型 但我似乎无法在标
  • Android volley使用RequestFuture.get()时出现超时异常

    在我的片段中 我尝试使用 TMDB 的开放电影数据库来获取有关 正在播放 电影的详细信息 如果我使用 RequestFuture get time TimeUnit 方法来执行此齐射请求 我总是会收到超时错误 如果我在 Safari 中手动
  • 为什么'enable_if'不能用于禁用这里声明

    include
  • 获取 boost Spirit 语法中的当前行

    我正在尝试使用 boostspirit 获取正在解析的文件的当前行 我创建了一个语法类和结构来解析我的命令 我还想跟踪在哪一行找到命令并将其解析到我的结构中 我将 istream 文件迭代器包装在 multi pass 迭代器中 然后将其包
  • 使用查询表达式对 List 进行排序

    我在使用 Linq 订购这样的结构时遇到问题 public class Person public int ID get set public List
  • 增强精神、递归和堆栈溢出

    为什么下面的代码在运行时崩溃 它会给出堆栈溢出错误 include
  • MFC:如何设置CEdit框的焦点?

    我正在开发我的第一个简单的 MFC 项目 但我正在努力解决一个问题 想要设置所有的焦点CEdit其中一个对话框中的框 我的想法是 当打开对话框时 焦点位于第一个编辑框上 然后使用 选项卡 在它们之间交换 我看到了方法SetFocus 但我无
  • C#6 中的长字符串插值行

    我发现 虽然字符串插值在应用于现有代码库的字符串 Format 调用时非常好 但考虑到通常首选的列限制 字符串对于单行来说很快就会变得太长 特别是当被插值的表达式很复杂时 使用格式字符串 您将获得一个可以拆分为多行的变量列表 var str
  • 使用具有抗锯齿功能的 C# 更改抗锯齿图像的背景颜色

    我有一个图像需要更改背景颜色 例如 将下面示例图像的背景更改为蓝色 然而 图像是抗锯齿的 所以我不能简单地用不同的颜色替换背景颜色 我尝试过的一种方法是创建第二个图像 仅作为背景 并更改其颜色并将两个图像合并为一个图像 但是这不起作用 因为
  • 使用 GCC 生成可读的程序集?

    我想知道如何使用GCC http en wikipedia org wiki GNU Compiler Collection在我的 C 源文件中转储机器代码的助记符版本 这样我就可以看到我的代码被编译成什么 你可以使用 Java 来做到这一
  • Linux mremap 不释放旧映射?

    我需要一种方法将页面从一个虚拟地址范围复制到另一个虚拟地址范围 而无需实际复制数据 范围很大 延迟很重要 mremap 可以做到这一点 但问题是它也会删除旧的映射 由于我需要在多线程环境中执行此操作 因此我需要旧映射能够同时使用 因此稍后当
  • ASP.NET MVC 路由:如何从 URL 中省略“索引”

    我有一个名为 StuffController 的控制器 具有无参数索引操作 我希望从表单中的 URL 调用此操作mysite com stuff 我的控制器定义为 public class StuffController BaseContr
  • C++ 中 void(*)() 和 void(&)() 之间的区别[重复]

    这个问题在这里已经有答案了 在此示例代码中 func1是类型void int double and funky是类型void int double include

随机推荐

  • 下拉框显示的高度[重复]

    这个问题在这里已经有答案了 可能的重复 调整下拉框中列表的高度 https stackoverflow com questions 5600646 adjust the height of the list in dropdown box
  • std::set 2D 点的自定义比较器

    我需要一个非重复的 2D 点列表 所以我使用std set具有自定义比较功能 我使用的函数在插入点后出现问题 因为有时std find找不到已经插入的点 const double tolerance 0 1 struct MyPoint2D
  • 从Optional<>转换为ArrayList<>

    我有以下情况 public ArrayList a getMethods return b c test 所以 我的问题是b c test 返回一个值Optional a 作为返回类型 但我需要返回一个ArrayList a 所以 我尝试将
  • 完整原型太大而无法保存,已清除变量

    我在渲染谷歌应用程序引擎代码时遇到此错误 有人知道这个错误吗 你在使用appstats吗 当 appstats 记录有关应用程序的状态时 尤其是在堆栈上存储大量数据时 可能会发生这种情况 它没有害处 但在 appstats 中检查调用时您将
  • 如果焦点是 edittext,则禁止滚动 recyclerview

    我有一个带有水平滚动的回收器视图 recyclerview 中的每个项目都有编辑文本 当我单击 edittext 时 recyclerview 滚动到末尾 我怎样才能禁止滚动 谢谢 您可以在 EditText 上设置焦点事件侦听器以禁用焦点
  • 黑莓 - 应用程序已在商店上架;我可以更改代码签名密钥吗

    不久前 我们为客户构建了一个应用程序 使用我们公司的密钥对其进行签名 并将其放在 BlackBerry App World 商店中 此后我们终止了与客户的合同 他们现在已经对该应用程序进行了进一步的 内部 开发 并要求我们提供签名密钥 以便
  • 如何从 Azure AD 获取用户列表?

    我正在使用 asp net core MVC 我想从 Azure AD 读取用户 我读了很多微软文档 我知道我必须使用 GraphAPI 来做到这一点 但我不知道如何做 现在一切都让我感到困惑 我不知道在哪里放置代码 我不知道在哪里获取 G
  • create-react-app eintegrity 错误窗口

    当我开始在 Windows 10 电脑中创建 React 应用程序时 出现了这些错误 请帮我解决这个问题 PS F gt npm install g create react app C Users Harshit Singh AppDat
  • R:调整圈图中的标签

    我有下面的代码 我试图使用令人惊叹的包 circlize 制作一个圆形图 我读过这个小插图并承认其中一些内容有点超出了我的理解范围 我想知道是否有一种快速方法可以删除图表上的所有标签 包括刻度线 然后按照与扇区相同的角度以浅灰色重新添加奥迪
  • 是否可以在 GDB 中命名断点?

    有没有办法在 GDB 中标记 命名断点 以便更容易地识别它们 例如 info b 如果是这样 怎么办 不 没有办法做到这一点 http users ece utexas edu adnan gdb refcard pdf http user
  • 删除 Spark 中不遵循架构的行

    目前 我的表的架构是 root product id integer nullable true product name string nullable true aisle id string nullable true departm
  • 如何创建和使用非常大的调色板纹理以在 opengl 中使用?

    详细信息 我有一个带有统一纹理的 glsl 片段着色器 u MapTexture 上面有几千种颜色 最多大约 10k 15k 唯一的 rgb 值 我还有一个统一的调色板纹理 u paletteTexture 大小为 16384 1 我想用它
  • Android 在片段中使用自定义视图改变方向时的奇怪行为

    我有一个FragmentActivity其中显示了一个Fragment默认情况下 该片段由一个EditText a TextView和一个自定义下拉菜单 通过扩展AutoCompleteTextView 如果我的习惯AutoComplete
  • Swift / Instagram API - 如何使用 Instagram 应用程序进行身份验证

    我需要一个AccessToken让用户在我的应用程序中授予访问他自己的 Instagram 帐户的权限 我已经在 Instagram 开发中心注册了所有内容 目前我正在使用简单认证 https github com calebd Simpl
  • Linux 上的 Python 模块 win32com

    我正在编写一些在多个平台下运行的 Python 代码 不幸的是在Win32下 我必须支持一些COM功能 然而 这些行在 Linux 环境下会失败 from pythoncom import PumpWaitingMessages from
  • 更改 Nimbus LaF 处理 JTree 节点突出显示的方式

    我一直致力于将 Java 应用程序从 WindowsLookAndFeel 转换到 Nimbus 尽管 Nimbus 存在缺陷 但基本上还是成功的 我的用户总体上喜欢 Nimbus LaF 但不喜欢一些细节 其中一些细节我通过查阅本网站上以
  • 如何在限制列表中输入或包含附加参数?

    我在下面的 my q list 中有一个 quosures 列表 library rlang suppressPackageStartupMessages library dplyr q list lt function enquos my
  • Web 服务和 API:“先有鸡还是先有蛋”

    我们即将开发一个网络服务 它将具有一些 社交 功能 我们需要创建一个 响应式 网站和移动应用程序 至少 iOS Android 我已经开发了具有 API 的 Web 服务 用于应用程序访问 通常不公开 然而 这次我正在考虑采用一种不同的 回
  • Html Agility Pack - 从 html 文档获取 html 片段

    使用 html 敏捷包 我如何从完整的 html 文档中提取 html 片段 就我的目的而言 html 片段 被定义为 html 片段 内的所有内容 tags 例如 输入示例 p My content p 期望的输出 p My conten
  • 如何在 debian 64 位上从 tcphdr (sk_buff) 结构访问数据/有效负载?

    我正在开发一个小型防火墙 我必须从端口 80 http 检索每个 tcp 数据包的数据以进行解析 这段代码在 debian 32 位虚拟机上运行良好 我能够打印每个网页的标题 但是当我尝试加载内核模块并通过 http 端口传输一些数据时 它