在android内核模式下获取完整的软件包名称

问题描述:

我正在开发一个项目,需要在内核模式下获取完整的应用软件包名称。我意识到包名称也是内核中的进程名称。但是,task_struct-> comm(进程名称)只能给我15个字符长。在android内核模式下获取完整的软件包名称

此外,fs/proc/base.c proc_get_cmdline()可以返回完整的进程名称,但它是私有函数。我尝试将proc_get_cmdline()导出到public并从我的可加载内核模块调用,但是当我调用public proc_get_cmdline()时它总是崩溃。

有没有什么办法可以在内核中获取完整的软件包名称?像从proc/pid/cmdline读取,从mm_struct等读取。欣赏任何代码示例。

+0

可能我知道这个项目的目的是什么?你会从中获得什么? –

+0

我们只获得了android框架和kerne的控件。我们希望将包名称发送到服务器,而无需更改应用程序和服务器。 – user2491515

你不应该调用proc_pid_cmdline()。

它是在FS/PROC/base.c非公共功能:

静态INT proc_pid_cmdline(结构seq_file *米,结构pid_namespace * NS, 结构PID * PID,结构的task_struct *任务)

但是,它所做的很简单:

get_cmdline(task,m-> buf,PAGE_SIZE);

虽然不可能返回完整路径,但无法确定每种情况下的完整路径。 arg [0]值可能会被覆盖,文件可能被删除或移动等。一个进程可能会以一种模糊原始命令行的方式执行exec()以及所有其他弊端。

我的openSUSE 12.3系统的扫描的/ proc/*/CMDLINE变成了各种低于有用的结果:

/proc/1/cmdline 
/sbin/init showopts 
/proc/10/cmdline 

/proc/11/cmdline 

/proc/1163/cmdline 
/sbin/dhclient6 -6 -cf /var/lib/dhcp6/dhclient6.eth0.conf -lf /var/lib/dhcp6/dhclient6.eth0.lease -pf /var/run/dhclient6.eth0.pid -q eth0 
/proc/12/cmdline 

/proc/13/cmdline 

/proc/14/cmdline 

/proc/15/cmdline 

/proc/16/cmdline 

/proc/17/cmdline 

/proc/1710/cmdline 
/sbin/dhcpcd --netconfig -L -E -HHH -c /etc/sysconfig/network/scripts/dhcpcd-hook -t 0 -h del1-dhp-32429 eth0 
/proc/172/cmdline 

/proc/185/cmdline 

/proc/186/cmdline 

/proc/187/cmdline 

/proc/19/cmdline 

/proc/2/cmdline 

/proc/20/cmdline 

/proc/21/cmdline 

/proc/22/cmdline 

/proc/23/cmdline 

/proc/25/cmdline 

/proc/254/cmdline 

/proc/255/cmdline 

/proc/26/cmdline 

/proc/2671/cmdline 
/usr/lib/upower/upowerd 
/proc/2674/cmdline 
/usr/lib/polkit-1/polkitd --no-debug 
/proc/27/cmdline 

/proc/2727/cmdline 
/usr/lib/udisks2/udisksd --no-debug 
/proc/28/cmdline 

/proc/285/cmdline 
/usr/lib/systemd/systemd-journald 
/proc/286/cmdline 

/proc/288/cmdline 

/proc/29/cmdline 

/proc/2913/cmdline 
/usr/sbin/cron -n 
/proc/2924/cmdline 
/usr/sbin/sshd -D 
/proc/3/cmdline 

/proc/3023/cmdline 
/usr/lib/postfix/master 
/proc/3090/cmdline 
pickup -l -t fifo -u 
/proc/3091/cmdline 
qmgr -l -t fifo -u 
/proc/31/cmdline 

/proc/311/cmdline 
/usr/lib/systemd/systemd-udevd 
/proc/3132/cmdline 
/usr/lib/vmware/bin/vmware-vmblock-fuse -o subtype=vmware-vmblock,default_permissions,allow_other /var/run/vmblock-fuse 
/proc/3168/cmdline 
/usr/sbin/vmware-authdlauncher 
/proc/32/cmdline 

对我的作品中的openSUSE 12.3:

for I in /proc/*/cmdline; do echo $I; cat $I | tr '\000' ' '; echo; done 
+0

Android/proc/*/cmdline会为您提供应用程序运行过程的完整软件包名称。我认为3.4版本的内核版本已经删除了get_cmdline命令。 – user2491515