可以使用 ***Service 实现来捕获和发送数据包吗?

Posted

技术标签:

【中文标题】可以使用 ***Service 实现来捕获和发送数据包吗?【英文标题】:Possible to use ***Service implementation to capture and send packets? 【发布时间】:2012-02-08 18:49:05 【问题描述】:

我正在考虑使用新的android (4.0) ***Service 接口来实现简单的数据包捕获和分析的可能性。有谁知道是否可以获取您在 ***Service 实现中收到的数据包并将它们简单地写入活动/默认网络设备?当然,要接收数据,我还必须能够从网络设备中读取数据。如果可能,哪些 API 可用于写入网络设备?

【问题讨论】:

你有什么运气吗? @brianestey - 我自己无法使用 ***Service 实现此功能,但有一个 application in the google market 似乎正在使用此技术。一旦您将数据包困在您的 ***Service 实现中,我仍然不知道如何将数据包写入网络,但也许这个应用程序的作者已经想通了。 是的,我看到了那个应用程序,想知道他们是怎么做到的。您是否查看过 API 示例中 Google 提供的 Toy***Service 示例?他们为 ***Server 以及 Android ***Service 应用程序提供代码。我目前正在尝试确定是否可以在设备本身上使用该代码来转发数据包(即,Android 应用程序连接到本地运行的 *** 服务器,该服务器只是来回代理数据包) 此应用程序执行此操作:play.google.com/store/apps/… 看这个例子thegeekstuff.com/2014/06/android-***-service 【参考方案1】:

tPacketCapture 为远程机器创建第二个套接字以转发数据包。我使用adb shell netstat 看过tPacketCapture

Proto Recv-Q Send-Q Local Address              Foreign Address            State 
tcp        0      0 192.168.1.126:49828        97.74.42.79:80             ESTABLISHED
tcp6       0      0 ::ffff:127.0.0.1:5000      :::*                       LISTEN
tcp6       0    522 ::ffff:10.8.0.1:50294      ::ffff:97.74.42.79:80      ESTABLISHED
tcp6       0      0 ::ffff:192.168.1.126:34210 ::ffff:74.125.141.188:5228 ESTABLISHED
tcp6       0      1 ::ffff:192.168.1.126:43379 ::ffff:74.125.224.174:80   CLOSE_WAIT
tcp6       0      1 ::ffff:192.168.1.126:60217 ::ffff:74.125.239.14:443   CLOSE_WAIT

注 97.74.42.79:80 两次。

我想我也必须这样做,除非有人有更好的主意。

【讨论】:

我目前正在努力让它发挥作用。仔细观察,创建隧道的是 ***Service,而不是编写 tPacketCapture 的人。【参考方案2】:

我使用过 *** API。您有一个 tun 设备,您可以在其中指定路由。但是在阅读之后,您需要自己处理数据包。通常这意味着将它们交给 *** 服务器。 Android SDK 提供了一个简单的 Toy***Server 示例。

但是如果不实现 ***,一个简单的类似 pcap 的接口很难(如果可能的话)实现。

可以解析 TCP/UDP 标头创建一个具有相同 src/dest 端口/ip 的自己的套接字,在此套接字上使用protect(),这样它就不会通过 tun0 路由。由于tPacketCapture 只支持 udp/tcp 而不是 icmp 他们可能会使用这种方法。

【讨论】:

确实,tPacketCapture 使用 ***Service 工作。出于好奇,我试图重新创建它的功能,但我被困在如何处理生成的文件描述符上。我从***Service.Builder.establish() 获得ParcelFileDescriptor 并将其包装在FileInputStream 中。读取流只是不断产生字节 69,'E'。我试图弄清楚如何正确地与文件描述符交互,但到目前为止还没有运气。 我不完全确定 java 做了什么。但在 C 世界中,您只需执行一次 read()/write() 调用并每次获取/写入一个数据包。 我用 C 写了一些代码,但它也只是给了我 char 'E'。我将 *** 接口的 getFD() 提供给 JNI 函数。简而言之,C 代码的作用是:char buf[1024]; while (long n = read(fd, buf, 1024)) LOGV("readFd: %s", buf); ; LOGV 将在第一个零字节处停止。对于 IPv4,如果 TOS 为 0(很可能),您将在那里有一个 0x0 字节。 我知道这是一个旧答案,但对于遇到标题解析问题的任何新人,您可以在此处查看我的解决方案 - ***.com/a/51876540/984830

以上是关于可以使用 ***Service 实现来捕获和发送数据包吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Amazon Simple Notification Service (SNS) 批量发送数百万个推送通知

使用 PHP 从动态输入字段中捕获数组值并通过电子邮件发送它们

在 docker 容器中捕获信号

如何从后台service传递数据到前台正在运行的activity

使用 mock service worker 测试 React App 时如何记录请求数?

在 docker 容器中捕获信号