给定HTTP请求,是否可以查看哪个应用程序发起了它?

时间:2013-02-13 09:40:17

标签: android networking

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

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

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

2 个答案:

答案 0 :(得分:1)

取决于应用程序在数据包上发送的信息。如果你问网络数据包(你没有指明你所指的是哪个协议)默认情况下有关于发送它的应用程序的信息,那么答案是否定的。

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

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

答案 1 :(得分:1)

我找到了办法。实际上,有点变通方法,但似乎正在运作完美无缺。

我写了simple Android library这样做,如果有人想检查出来的话。它基于以下事实:每个套接字都被映射为文件中的条目,称为 / proc / net / tcp (或 / proc / net / tcp6 ,用于IPv6-基础连接)。

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

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

  1. 接收Socket个对象或关联的端口(Socket.getPort()
  2. 解析 / proc / net / tcp (或 / proc / net / tcp6 )文件,它会查找具有给定端口的条目
  3. 如果找到条目,则该方法从中提取PID
  4. 通过使用新找到的PID调用Android PackageManager.getPackagesFromPid()方法,我们可以获取有关源应用程序的唯一信息,例如包名称和应用程序版本
  5. 表现非常好,因为 / tcp * 文件通常不超过50个条目。