2016-12-05 2 views
0

Ich arbeite an einem Projekt benötigt den vollständigen App-Paketnamen im Kernel-Modus erhalten. Ich erkannte, dass der Paketname auch der Prozessname im Kernel ist. Der task_struct-> comm (Prozessname) kann mir jedoch nur 15 Zeichen geben.Kompletten Paketnamen im Android Kernel-Modus erhalten

Auch fs/proc/base.c proc_get_cmdline() kann den vollständigen Prozessnamen zurückgeben, aber es ist private Funktion. Ich versuche, proc_get_cmdline() zu public zu exportieren und von meinem ladbaren Kernel-Modul aufzurufen, aber es stürzt immer ab, wenn ich die öffentliche proc_get_cmdline() aufruft.

Gibt es eine Möglichkeit, wie ich den vollständigen Paketnamen im Kernel bekommen kann? Wie von proc/pid/cmdline lesen, lesen Sie von mm_struct, usw. Schätzen Sie jedes Codebeispiel.

+0

kann Ich weiß, was ist der Zweck dieses Projekts? und was wirst du damit erreichen? –

+0

Wir bekommen nur die Kontrolle über Android-Framework und Kern. Wir möchten den Paketnamen an den Server senden, ohne die App und den Server zu ändern. – user2491515

Antwort

0

Sie sollten nicht proc_pid_cmdline() aufrufen.

Es ist eine nicht-öffentliche Funktion in fs/proc/base.c:

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

Doch was sie tut, ist einfach:

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

Es ist nicht wahrscheinlich, dass der vollständige Pfad zurückgegeben wird, und es ist nicht möglich, den vollständigen Pfad in jedem Fall zu ermitteln. Der arg [0] -Wert kann überschrieben werden, die Datei könnte gelöscht oder verschoben werden usw. Ein Prozess kann exec() auf eine Weise ausführen, die die ursprüngliche Befehlszeile und alle möglichen anderen Krankheiten verschleiert.

Ein Scan von meinem opensuse 12.3 System/proc/*/cmdline dreht sich alle Arten von weniger als nützlichen Ergebnissen auf:

/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 

Werke für mich in openSUSE 12.3:

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

Android/proc/*/cmdline gibt Ihnen den vollständigen Paketnamen für den laufenden App-Prozess. Ich denke, die Kernel-Version, die ich 3.4 habe, entfernen bereits den Befehl get_cmdline. – user2491515

Verwandte Themen