上一章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截获网络数据包