首页
社区
课程
招聘
[原创]TaintDroid中通过PID获取应用包名的思考
2013-8-12 21:19 8389

[原创]TaintDroid中通过PID获取应用包名的思考

2013-8-12 21:19
8389
标 题: 【原创】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直播授课

收藏
点赞3
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回