让我们假设所有网络流量都通过在 Android 设备上运行的本地代理重定向。
在代理中,是否可以查看哪个应用程序(根据包名称、应用程序名称等)发起了该特定网络调用?
编辑:抱歉,我在这里缺少细节。我指的是 HTTP 协议,因此网络调用只是对某个 URL 的 HTTP 请求(GET 或 POST)。
让我们假设所有网络流量都通过在 Android 设备上运行的本地代理重定向。
在代理中,是否可以查看哪个应用程序(根据包名称、应用程序名称等)发起了该特定网络调用?
编辑:抱歉,我在这里缺少细节。我指的是 HTTP 协议,因此网络调用只是对某个 URL 的 HTTP 请求(GET 或 POST)。
取决于应用程序在数据包上发送的信息。如果您询问网络数据包(顺便说一句,您没有指定您所指的协议)是否默认包含有关发送它的应用程序的信息,那么答案是否定的。
但是您可以研究一组给定应用程序的数据包,将此信息存储在代理中,然后您可以在给定足够数据包的情况下检测源应用程序。当然,这不会产生有关您不知道的应用程序的信息。
编辑:如果它是一个 HTTP 请求,那么通常 HTTP 标头包含有关发起此请求的应用程序的信息(例如浏览器版本)。
我找到了一种方法。实际上,有点解决方法,但似乎完美无缺。
我为此编写了一个简单的 Android 库,如果有人想查看的话。它基于这样一个事实,即每个套接字都映射为文件上的一个条目,称为/proc/net/tcp(或/proc/net/tcp6用于基于 IPv6 的连接)。
这意味着,对于每个条目,我们可以读取其端口及其关联的 PID。
基本上,该库的主要方法执行以下步骤:
Socket
对象或相关端口 ( Socket.getPort()
)PackageManager.getPackagesFromPid()
方法,我们可以获得源应用程序的唯一信息,例如包名和应用程序版本性能相当不错,因为/tcp*文件通常不超过 50 个条目。