0

让我们假设所有网络流量都通过在 Android 设备上运行的本地代理重定向。

在代理中,是否可以查看哪个应用程序(根据包名称、应用程序名称等)发起了该特定网络调用?

编辑:抱歉,我在这里缺少细节。我指的是 HTTP 协议,因此网络调用只是对某个 URL 的 HTTP 请求(GET 或 POST)。

4

2 回答 2

1

取决于应用程序在数据包上发送的信息。如果您询问网络数据包(顺便说一句,您没有指定您所指的协议)是否默认包含有关发送它的应用程序的信息,那么答案是否定的。

但是您可以研究一组给定应用程序的数据包,将此信息存储在代理中,然后您可以在给定足够数据包的情况下检测源应用程序。当然,这不会产生有关您不知道的应用程序的信息。

编辑:如果它是一个 HTTP 请求,那么通常 HTTP 标头包含有关发起此请求的应用程序的信息(例如浏览器版本)。

于 2013-02-13T09:44:37.617 回答
1

我找到了一种方法。实际上,有点解决方法,但似乎完美无缺。

我为此编写了一个简单的 Android 库,如果有人想查看的话。它基于这样一个事实,即每个套接字都映射为文件上的一个条目,称为/proc/net/tcp(或/proc/net/tcp6用于基于 IPv6 的连接)。

这意味着,对于每个条目,我们可以读取其端口及其关联的 PID。

基本上,该库的主要方法执行以下步骤:

  1. 接收Socket对象或相关端口 ( Socket.getPort())
  2. 解析/proc/net/tcp(或/proc/net/tcp6)文件,它查找具有给定端口的条目
  3. 如果找到条目,则该方法从中提取 PID
  4. 通过使用新找到的PID调用AndroidPackageManager.getPackagesFromPid()方法,我们可以获得源应用程序的唯一信息,例如包名和应用程序版本

性能相当不错,因为/tcp*文件通常不超过 50 个条目。

于 2013-04-05T11:08:44.960 回答