我正在为包含网络服务器的闭源嵌入式设备开发一个模拟器。我正在使用 Python 在嵌入式 angstrom linux 2.6.34 中构建模拟器,到目前为止,我已经在功能上实现了网络服务器,以至于它在视觉上与浏览器中的原始设备相同。现在,我试图让它看起来与 Nmap 操作系统和服务扫描相同,但事实证明这要困难得多。
Nmap 扫描最初被证明非常不同(源设备没有完全匹配,我的模拟器死机为 Linux 2.6.32 - 2.6.39)。在关闭模拟器上的服务和关闭端口等明显的事情之后,我开始比较来自源设备的wireshark数据包,包括IP和TCP标头,以及嵌入式设备,以确定我需要进行哪些协议级别的更改。使用 Linux 中的 sysctl.config 文件,TCP 窗口缩放等一些参数很容易,但其他一些参数则更难。例如,当数据包在源设备上被分段时,PSH 标志设置在 TCP 标头中,而不是在我的设备上,这对于“最随意的观察者”来说也是一个明显的区别。这里的目标不是简单地混淆我的设备,
在我的探索中,我遇到了几个看起来很有希望的解决方案,但是当我知道那里有更简单的解决方案时 ,我害怕在应该可行的解决方案上浪费更多时间。
这是我尝试过的事情的列表,以及是什么促使我研究另一种方法。他们中的大多数人的问题是缺乏文档。如果有人知道一种特定的方法应该可以工作,并且可以向我指出体面的文档来帮助我进行配置,我将不胜感激。作为一个懒惰的工程师,我正在寻找最简单的解决方案。我不怕 C,但如果有程序或模块,我可以通过 python 启动或接口,我更喜欢那样。
IP 个性:仅适用于 2.4 内核,而且我的模拟器(作为嵌入式 ARM 架构)没有可用的移植内核,可以追溯到那么远。
Ethercap 过滤器:让这些在我的模拟器上工作(安装在模拟器上,而不是 mitm)用于传出数据包,但不适用于 TCP 和 IP 标头,据我所知,您只能更改数据包中的数据字段,这是不够的. 手册页给人的印象是它可以工作,但没有发现有人使用它来更改标题,这让我认为它无法完成。
Divert Sockets:尽管显然是为 2.6 内核设计的补丁,但仍无法使其正常工作。这与 IPtables 一起创建过滤器,您可以在其中修改传出数据包(标头和所有),然后再通过防火墙。我找不到足够的文档来整理这些部分。
TAP/TUN:根据我目前所了解到的,这个基于软件的网络接口应该可以工作,但我不相信这是最简单的方法。我看到的示例是针对 <2.6.36 内核的,因为“后来的内核行为不同”,其中包括我的模拟器版本。
libpcap:我相信 lippacp 只给你原始数据包,你不能修改数据包。我相信我可以复制数据包,杀死它们,修改副本,然后将它们发送回去,但同样,我认为还有一种更简单的方法。
使用用户态 TCP/IP 堆栈:找不到很好的文档或示例来说明如何使用,例如 Linux 2.4.34 中的 lwIP 堆栈,并禁用本机内核堆栈。
打开内核并使用本机 TCP/IP 堆栈进行处理:我知道这会起作用,但我担心更改-编译-测试的开发周期会花费时间,更不用说在 .c 文件中解析指针混乱了. 我从来没有这样做过,我不知道在哪里编译整个内核或特定模块,或者如何使用 openembedded 为我的 ARM 设备编译。我知道还有其他方法可以做到这一点,所以当我还有很多工作要做时,我很担心花时间学习如何打开内核。
在所有这些中,我已经用尽了 ettercap 并将插座转移到最远的地方,因为我认为它们会是最简单的。有任何这些(或其他)任意调整标题的例子吗?谢谢您的帮助!