【问题标题】:Creating an effective packet sniffer in .NET在 .NET 中创建有效的数据包嗅探器
【发布时间】:2014-01-13 02:58:27
【问题描述】:

我正在寻找创建我称之为代理的东西,尽管这个定义可能有些不准确。

通常情况下,你有这样的东西:

Client --------- Server

我想做的是引入一个代理,没有新层,像这样:

Client ----+---- Server
           |
         Proxy

我不想要这个:

Client---Proxy---Server

我知道 WinPCap 做了类似的事情,但据我所知,这是一个记录不足的主题。

到目前为止,我已经尝试了一些事情,最值得注意的是在与客户端相同的端口上侦听消息。这仅导致从随机应用程序接收大量垃圾数据包(尽管在特定端口上侦听)。我找不到很多可以表明我正在阅读正确数据的信息,尽管我相信我现在已经发现了这一点,在进行了一些小的修改之后。

有人知道反对使用这种方法的任何理由吗?或者有什么更可持续的方式吗?

【问题讨论】:

  • 你想对截获的消息做什么?如果只是用于诊断,请尝试 .NET Tracing。
  • @CodeCaster - 我打算将它们用作最终用户应用程序的一部分,以收集有关游戏服务器上正在发生的事情的数据。
  • 在这种情况下,我想知道游戏服务器是否有一个 API 或一些插件系统可以让你收集你想要的数据,因为游戏网络流量很可能是加密、混淆或其他相对难以处理的.我了解您无法更改服务器或客户端,因此如果不与服务器直接通信,您将必须诉诸于收听和了解网络流量。您可以使用 WinPCap,但除了可能难以读取数据外,其格式可能会在服务器版本之间发生变化,需要您更改程序。
  • @CodeCaster 数据经过 XTEA 加密,我完全知道如何使用存储在游戏客户端内存中的密钥对其进行解密。我可能会更改客户端以通过我的应用程序重定向所有数据,但如果可能的话,避免重新路由会更好。
  • @XtrmJosh 你熟悉 Wireshark 吗?当我遇到类似的问题时,我使用 Wireshark 来获取实际捕获,然后在 .NET 中对其进行分析(tshark/tcpdump 在这里也可能适用)。或者,Wireshark 具有非常好的数据包过滤器可扩展性支持,因此您可以编写代码(但不是 .NET)而无需太多麻烦来拆分数据包。我知道这不符合您的要求,但希望对您有所帮助。

标签: c# .net proxy packet


【解决方案1】:

您需要所谓的原始套接字访问(并使用可以将所有数据包发送到网络适配器的集线器或交换机)。您还希望您的网卡处于所谓的“混杂模式”,它接收所有数据包而不过滤 MAC 地址。

当您在网络上获取流量并且您的网络适配器将它们未经过滤地接收时,您的程序将完全按照它们在网络上发送的方式获取所有数据包(尽管您必须确保操作系统的 TCP-UDP/IP堆栈不会偷偷接收您想要收听的 TCP 数据包,但如果您针对其他两台计算机进行配置,则不会有问题。

我不确定 Windows 在这方面做得如何,但无论如何。

当你得到数据包时,你必须读取以太网报头(你可以根据目标 MAC 地址进行过滤),然后你必须挑选出 IP 数据包,以及 TCP/UDP 数据包并放置它们以便从流量中获得合理的东西。不是超级简单,但也绝非不可能。

【讨论】:

    【解决方案2】:

    如果您寻找数据包嗅探器而不是代理,它将为您提供更多相关链接:

    [编辑-要检查的其他内容是是否在网卡上启用了混杂模式。这告诉网卡将所有数据包向上传递到堆栈,而不管内容如何。没有这个,您可能无法获得您期望的所有数据包。更多关于这个on Wikipediahow to enable promiscuous mode on Windows 7+]

    【讨论】:

    • 您发布的第一个链接几乎就是我想要的,但为了使用它,我需要花很长时间分析提供的代码。我可能有点乐观,希望有人自己知道答案,并能够提供答案……不确定。
    猜你喜欢
    • 2020-12-12
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多