Linux中应用程序和网络之间的通信劫持

3
我有一个嵌入式系统,可以作为访问点。该系统运行一个程序并与连接到该访问点的设备进行一些网络通信。它发送包含某些诊断信息(数据结构)的UDP数据包,并接收命令。问题是有时该数据结构的某些字段未填充数据(例如,存在零或一些垃圾值)。我需要这些字段每次都被正确填充,并且我知道应该放置哪些值。
我需要完成的另一个任务是过滤传递给该程序的传入数据包(我知道它监听的端口)- 通常我只需将它们传递,但偶尔(例如当我从传感器获取一些信息时)必须完全用我生成的新数据包替换它们。
我有几个想法,从智能使用iptables和pcap到编写自己的内核模块。我没有该嵌入式应用程序的源代码,因此无法在其代码中嵌入此功能。性能在这里至关重要,我想听听您的建议:我应该选择什么?编写自己的内核模块似乎是最好的解决方案,但我没有网络黑客经验,因此可能还有其他更适合这个问题的方法。任何意见都将不胜感激!

1
请使用段落,那一大块的文本很难阅读。 - Mat
你现在感觉好些了吗? :) - k_wisniewski
1
应用程序是动态链接还是静态链接?你可以使用“LD_PRELOAD”库混淆它的套接字访问。 - Hasturkun
嗯,这似乎是一个有趣的解决方案 - 你能在这个话题上写更多的东西吗? - k_wisniewski
1
我的旧回答,https://dev59.com/k1rUa4cB1Zd3GeqPjFsM#7094336/ 以及 https://dev59.com/QXRC5IYBdhLWcg3wD8tV/ 通常情况下,您需要创建一个共享库来实现例如read()write()等功能,以处理这些功能或将其传递给默认实现。使用这种方法可能会更容易地使您的应用程序支持socks代理,将处理工作放在代理上。 - Hasturkun
2个回答

2

一种标准的方法是使用libnetfilter_queue直接拦截和修改数据包。在尝试编写自己的内核模块之前,您至少应该尝试这种方法。


好的,我选择使用libnetfilter来实现它 - 这似乎是在核心黑客和代理的简单使用之间取得了很好的平衡。我接受这个解决方案,虽然这个问题有一点像脑力风暴,所以我感谢每个提出建议的人。 - k_wisniewski

1

你可以在用户空间中完成它。只需编写一个服务器,接收数据包并更改它们,然后再次发送出去。您必须配置应用程序仅使用本地主机作为目标IP(或配置系统具有目标地址)。这是典型的“中间人”设置。


好的,但我需要知道出站数据包的IP地址。而且我不能对运行在该接入点上的应用程序进行任何更改(包括配置),因此无法仅更改目标IP。我仍然需要使用iptables将数据包重定向回本地主机,但是据我所知,这样做会丢失目标IP,因此我不知道应该再次发送它的位置。如果我错了,请纠正我。另一个问题是性能-我不确定使用iptables和代理服务器是否比一些智能内核模块更快,后者可以在飞行中修改数据包。 - k_wisniewski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接