2016-12-05 78 views
0

我正在開發一個項目,需要在內核模式下獲取完整的應用軟件包名稱。我意識到包名稱也是內核中的進程名稱。但是,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

回答

0

你不應該調用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

相關問題