android如何通过代码来获取每个应用访问过的ip和端口

时间:2021-08-26 18:13:29

android如何通过代码来获取每个应用访问过的ip和端口

    上一章https://blog.csdn.net/zhao007z5/article/details/79976835,通过源码分析,知道了应用访问过的Ip地址和端口都被保存到了文件中,那么只需要不断的监视文件,我们即可获得ip,port,uid。

    由于读取的文件是系统文件,不能使用普通读取文件方式。这里需要使用到命令cat,来读取数据。

  String[] ARGS ={ "cat", "/proc/net/tcp" };
  execute(ARGS, "/",TYPE_TCP);
 
public void execute(String[] cmmand, String directory, int type) throws IOException
{
   NetInfo netInfo = null;
   String sTmp = null;

   ProcessBuilder builder = new ProcessBuilder(cmmand);

   if (directory != null) {
      builder.directory(new File(directory));
   }
   builder.redirectErrorStream(true);
   Process process = builder.start();
   InputStream is = process.getInputStream();

   Scanner s = new Scanner(is);
   s.useDelimiter("\n");
   while(s.hasNextLine()){
      sTmp = s.nextLine();
      netInfo = parseData(sTmp);
      if(netInfo!=null) {
         netInfo.setType(type);
         saveToList(netInfo);
      }
   }
}

    "\n":用于分隔数据,通过Scanner可以轻松的读取流中的每条数据。然后通过分析数据后,每条数据中的类型又是通过“ ”来区分的。源码中也明确了这样一点

int nitems = sscanf(toybuf, " %d: %x:%x %x:%x %x %x:%x %*X:%*X %*X %d %*d %ld", 
&num, &laddr.u, &lport, &raddr.u, &rport, &state, &txq, &rxq, &uid, &inode);

        然后我们在通过字符串split函数,分隔出每个字段。但是当你打印出来的时候,你会发现其中多了不少空子串。这是因为有些项不只有一个空格,我们不能只是简单的用“ ”去区分。这里我们使用正则表达式:\s+分隔。可以分隔多个或一个空格。其中第三项既是远程Ip地址和端口项,第八项为UID

  private final static int DATA_REMOTE = 3;
  private final static int DATA_UID = 8;
 
private NetInfo parseDataNew(String sData)
{
   String sSplitItem[] = sData.split("\\s+");
   String sTmp = null;
   if(sSplitItem.length<9)
   {
      return null;
   }

   NetInfo netInfo = new NetInfo();

   sTmp = sSplitItem[DATA_REMOTE];
   String sDesItem[] = sTmp.split(":");
   if(sDesItem.length<2)
   {
      return null;
   }
   netInfo.setPort(strToInt(sDesItem[1], 16, 0));

   sTmp = sDesItem[0];
   int len = sTmp.length();
   if(len<8)
   {
      return null;
   }

   sTmp = sTmp.substring(len-8);
   netInfo.setIp(strToLong(sTmp, 16, 0));

   sbBuilder.setLength(0);
   sbBuilder.append(strToInt(sTmp.substring(6, 8), 16, 0))
         .append(".")
         .append(strToInt(sTmp.substring(4, 6), 16, 0))
         .append(".")
         .append(strToInt(sTmp.substring(2, 4), 16, 0))
         .append(".")
         .append(strToInt(sTmp.substring(0, 2), 16, 0));

   sTmp = sbBuilder.toString();
   netInfo.setAddress(sTmp);

   if(sTmp.equals("0.0.0.0")) {
      return null;
   }

   sTmp =sSplitItem[DATA_UID];
   netInfo.setUid(strToInt(sTmp, 10, 0));

   return netInfo;
}

    通过这章基本了解了读取和解析。如果需要获取那个应用使用了哪些IP和端口,还需要读取应用信息,然后将数据合并在一起。如果需要这部分的可以参考GIT:https://github.com/zhao007z4/IP-Monitor


上一篇:android从源码中看netstat命令

下一篇:VpnService截获网络数据包