【问题标题】:Is TCP packet filtering possible on mobile platforms?移动平台上是否可以进行 TCP 数据包过滤?
【发布时间】:2015-01-22 07:18:07
【问题描述】:

我有兴趣让我的移动应用在后台运行并过滤 TCP 数据包。

我知道由于沙盒、每个操作系统权限级别以及 iOS 如何处理后台任务,我将面临限制,因此我想确认是否可以在 iOS 和 Android 上执行此操作。

Android 和 iOS 是否允许您分析和修改通过 TCP 端口的数据包?如果可能怎么办?我可以在我的应用保持在后台时执行此操作吗?

【问题讨论】:

    标签: android ios networking tcp port


    【解决方案1】:

    iOS

    我认为这在 iOS 上是不可能的。

    我没有找到用于网络监控/数据包过滤的公共 API。有可能存在这样的 API,但它被隐藏了。但在那种情况下,Apple App Store review guidelines 声明:

    2.5 使用非公开 API 的应用将被拒绝

    如果您需要一个特定的报价来表明这是不可能的,您可以使用:

    iOS 不直接支持数据包跟踪。但是,如果您通过 USB 将 iOS 设备连接到 Mac...

    来自official Apple Technical Q&A QA1176

    替代品

    下一个最好的方法是在“设置”中手动配置代理服务器,然后在服务器端过滤流量。由于 iOS 后台任务的limitations,在设备上本地运行代理不是一个选项:

    2.16 多任务应用程序只能将后台服务用于其预期目的:VoIP、音频播放、位置、任务完成、本地通知等。

    另外,this 帖子建议可以在 iOS 8 上以编程方式设置 VPN 连接。它还需要发送设备的流量,我不确定这种方法是否符合指南.

    非替代品

    某些应用提供测量网络流量的功能。但他们使用专用 API 进行网络统计:iPhone Data Usage Tracking/Monitoring

    还有一些方法可以通过here 描述的 USB 电缆在 iOS 上进行数据包跟踪。

    安卓

    在 Android 上,您可以将设备配置为将您的应用用作 VPN service。但是:

    • 它要求您显示一个对话框,描述授予作为 VPN 的权限的后果。
    • 您必须在 VPN 处于活动状态时显示持续通知。 tPacketCapture 是一个应用示例。

    要请求用户许可,请致电VpnService.prepare

    public void onClick(View v) {
         Intent intent = VpnService.prepare(getApplicationContext());
         if (intent != null) {
              startActivityForResult(intent, 0);
         } else {
              onActivityResult(0, RESULT_OK, null);
         }
    }
    

    并处理结果,启动您的 VpnService。

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            Intent intent = new Intent(this, MyVpnService.class);
            startService(intent);
        }
    }
    

    您的VpnService 必须实现public int onStartCommand()。该服务被视为前台服务,不应被操作系统杀死。

    这个问题:Android VpnService to capture packets won't capture packets 它的 cmets 揭示了数据包处理本身。

    【讨论】:

    • 我同意,这在 iOS 上是不可能的。
    • 有什么方法可以确认在iOS上是不可能的,也许是官方文档或应用商店规则?这与客户的要求有关,所以我希望能够向他展示一些可能来自官方来源的东西。
    • 我用我设法找到的关于该主题的任何内容更新了答案。祝你好运:)
    • 嗨@atok 我一直在调查在Android 上使用VpnService。然而,据我了解,虽然可以通过这种方式读取数据包,但在基本上不必重新实现 TCP 协议的情况下,无法修改它们并以透明的方式重新发送它们。你知道这是不是真的?一些这样做的应用程序是“Mobilwol:无根防火墙”和 GreyShirts 的“NoRoot 防火墙”。
    • 我的疑问基本上是我是否可以使用 VpnService 修改数据包并转发它们,以便它们保持正常路由
    【解决方案2】:

    在 iOS 上,我会说这取决于您是否允许将设备越狱作为可接受的前提条件。对于 iOS,有一些对 PFnetwork sniffer 的引用(我认为它必须以类似的方式工作)。

    PF 是 open source,但不幸的是内置在 C 中。

    【讨论】:

    • 所以不越狱手机是不可能的吗?有什么方法可以确认这一点,也许是官方文档或应用商店规则?
    • 是的,没错。就像@atok 所说,一个不错的选择可能是设置一个外部代理或 VPN 来过滤流量。
    【解决方案3】:

    此答案仅适用于 Android

    一般可以有可能!
    不过也有一些问题。

    这里列出了哪些可行以及您会遇到哪些问题。

    通过 VPN 服务过滤

    • 对电池的影响非常大
    • 代理支持不起作用
    • 允许修改流量

    通过 libpcap 过滤

    • 需要根
    • 不允许修改流量

    使用 IPTables/PFTables/libnetfilter 过滤

    • 需要根
    • 需要内核模块
    • 无法在您没有内核源代码或未集成内核源代码的任何设备上运行

    使用 Xposed 框架进行过滤

    • 需要根
    • 仅适用于 Dalvik 系统
    • 不适用于使用 NDK 构建的应用程序

    使用 Cydia 基板过滤

    • 需要根
    • 仅适用于 Dalvik 系统
    • 目前处于测试状态

    所以是的,这是可能的,但代价是什么?
    如果您只是自己需要它,您最好使用Cydia Substrate,因为它支持 100% 的应用程序,但它需要一个 dalvik 系统。

    如果您想将其发布到应用商店,您应该使用 VPN 服务。或许可以使用 NDK 创建服务,那么您可能已经降低了电池问题。

    希望我对你有所帮助。

    【讨论】:

    • 嗨@Eun 我一直在调查使用VpnService 在Android 上实现它。我现在知道无需 root 是可能的,因为 GreyShirts 的“Mobilwol:无 root 防火墙”和“NoRoot 防火墙”等应用程序正在这样做。然而,有人告诉我,虽然可以通过这种方式读取数据包,但无法修改它们并以透明的方式重新发送它们,而无需重新实现 TCP 协议。你知道这是不是真的吗?
    【解决方案4】:

    您可以使用 Android VPN 服务构建应用,这些应用可以做一些有趣的事情,比如过滤数据包等等。您可以在“Android Samples for SDK”中找到 VPN 示例,该示例可在 Google Source Code 中找到。

    克里夫·罗宾逊
    社区经理
    BackBox

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 2022-01-14
      相关资源
      最近更新 更多