【问题标题】:Obtain complete package name in android kernel mode在android内核模式下获取完整的包名
【发布时间】:2016-12-05 05:41:36
【问题描述】:

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

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

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

【问题讨论】:

  • 我可以知道这个项目的目的是什么吗?你会从中获得什么?
  • 我们只获得了android framework和kerne的控制权。我们希望在不更改应用程序和服务器的情况下将包名称发送到服务器。

标签: android c linux-kernel


【解决方案1】:

您不应该调用 proc_pid_cmdline()。

它是 fs/proc/base.c 中的非公共函数:

static int proc_pid_cmdline(struct seq_file *m, struct pid_namespace *ns, struct pid *pid, struct task_struct *task)

不过,它的作用很简单:

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

【讨论】:

  • Android /proc/*/cmdline 确实为您提供了应用程序运行过程的完整包名称。我认为我的内核版本 3.4 已经删除了 get_cmdline 命令。
猜你喜欢
  • 2012-07-27
  • 2017-11-24
  • 2013-06-17
  • 1970-01-01
  • 2016-10-29
  • 2020-06-06
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多