-
-
[原创]TaintDroid中通过PID获取应用包名的思考
-
发表于: 2013-8-12 21:19 8767
-
标 题: 【原创】TaintDroid中通过PID获取应用包名的思考
作 者: 蟑螂一号
时 间: 2013-08-12,21:44:41
最近看了一下TaintDroid中的apk应用TaintDroidNotification源码。该源码中有五个java类,分别是:LogEntry.java、LogcatDevice.java、TaintDroidNotifyController.java、TaintDroidNotifyDetail.java、TaintDroidNotifyService.java。该APK应用主要是通过执行命令logcat -v time *:S TaintLog:*读取TAG为TaintLog的日志信息,然后进行解析,获取各个字段的信息。
TaintDroid中获取应用名是通过pid来获取的,关键函数如下:
private String get_processname(int pid) {
ActivityManager mgr = (ActivityManager) getApplicationContext().getSystemService(
Context.ACTIVITY_SERVICE);
String pname = "";
List<RunningAppProcessInfo> apps = mgr.getRunningAppProcesses();
for(RunningAppProcessInfo pinfo : apps) {
if(pinfo.pid == pid) {
pname = pinfo.processName;
break;
}
}
return pname;
}
经过分析,我认为通过uid来获取应用包名比通过pid获取应用包名的方式好。通过pid获取包名的缺陷:
1.如果应用运行过程中,意外停止。通过pid无法找到对应的应用名。
2.如果在源码中api处增加log的地方是进程间通信中的服务端,那样通过pid获取到的应用名并不是真实的应用名。例如:如果在PackageManagerService中的checkUidPermission中增加TaintLog为tag的日志信息,那么通过日志pid解析出的应用名是system_server。
3.一个apk运行过程中,可以创建一个独立的进程处理其他业务。只需在apk中的AndroidManifest.xml中需要独立运行的组件属性中增加android:process=xxxxx属性。当apk被运行之后,可以通过adb shell ps看到apk运行除了自身的进程外,还有一个进程为xxxxx的进程。比如像lbe应用运行,会有com.lbe.security和com.lbe.security两个进程。有你短信运行也是如此情况。因此,如果一个apk会独立出一个进程处理业务时候,根据pid获取的行为信息难以区分是信息是属于哪个apk应用的。
然而通过uid获取应用名可以很好的解决以上的不足。比如一个apk应用运行时还独立分离一个进程,该进程的uid和apkuid是一样的。在android系统中可以通过查看/data/system/packages.list文件查看系统安装的apk应用的uid。通过读取该文件,可以解析出对应的apk包名信息。
android系统默认条件下/data/system/packages.list文件普通用户没有读写权限,因此必须在framework/base/service/java/src/com/android/server/pm/Settings.java中修改/data/system/packages.list文件的创建权限,使其他用户可读。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课