2014-08-30 2 views
4

Я пишу модуль ядра, чтобы получить список pids с полным именем процесса. proc_pid_cmdline() дает полное имя процесса, с использованием той же функции /proc/*/cmdline получает полное имя процесса. (struct task_struct) -> comm дает намек на то, какой процесс он есть, но не полный путь.Как использовать proc_pid_cmdline в модуле ядра

Я включил имя функции, но оно дает ошибку, потому что не знает, где найти функцию.

Как использовать proc_pid_cmdline() в модуле?

+0

Вам нужно будет определить, что такое имя процесса, поскольку Linux (и Unix) вообще не использует имена процессов. – wallyk

ответ

2

Вы не должны называть proc_pid_cmdline().

Это non-public function в 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() таким образом, который скрывает исходную командную строку и все виды других недугов.

Сканирование моей системы Fedora 20/Proc/*/CmdLine превращает все виды менее, чем полезны результаты:

-F 
BUG: 
WARNING: at 
WARNING: CPU: 
INFO: possible recursive locking detecte 
ernel BUG at 
list_del corruption 
list_add corruption 
do_IRQ: stack overflow: 
ear stack overflow (cur: 
eneral protection fault 
nable to handle kernel 
ouble fault: 
RTNL: assertion failed 
eek! page_mapcount(page) went negative! 
adness at 
NETDEV WATCHDOG 
ysctl table check failed 
: nobody cared 
IRQ handler type mismatch 
Machine Check Exception: 
Machine check events logged 
divide error: 
bounds: 
coprocessor segment overrun: 
invalid TSS: 
segment not present: 
invalid opcode: 
alignment check: 
stack segment: 
fpu exception: 
simd exception: 
iret exception: 
/var/log/messages 
-- 
/usr/bin/abrt-dump-oops 
-xtD 
+0

Работает для меня в openSUSE 13.2: 'for I in/proc/*/cmdline; do echo $ I; cat $ I | tr '\ 000' ''; эхо; done' – myaut

+0

В настоящее время я смотрю исходный код в proc_exe_link, который возвращает файловую структуру исполняемого файла процесса. Я согласен, что вышеупомянутый cmd можно подделать. Насколько легко было бы подделать mm-> exe_file, так как он выглядит как карта памяти исходного бинарного происхождения? –

1

мне удалось решить версию этой проблемы. Я хотел получить доступ к cmdline для всех PID, но в самом ядре (в отличие от ядра ядра , как утверждается в вопросе), но, возможно, эти принципы могут применяться и к модулю ядра?

То, что я был, я добавил следующую функцию fs/proc/base.c

int proc_get_cmdline(struct task_struct *task, char * buffer) { 
    int i; 
    int ret = proc_pid_cmdline(task, buffer); 

    for(i = 0; i < ret - 1; i++) { 
      if(buffer[i] == '\0') 
        buffer[i] = ' '; 
    } 
    return 0; 
} 

Затем я добавил заявление в include/linux/proc_fs.h
int proc_get_cmdline(struct task_struct *, char *);

На данный момент, я мог бы получить доступ к cmdline всех процессов в ядро. Чтобы получить доступ к task_struct, возможно, вы можете обратиться к kernel: efficient way to find task_struct by pid?.

После того как вы task_struct, вы должны быть в состоянии сделать что-то вроде:

char cmdline[256];  
proc_get_cmdline(task, cmdline); 
if(strlen(cmdline) > 0) 
    printk(" cmdline :%s\n", cmdline); 
else 
    printk(" cmdline :%s\n", task->comm); 

я смог получить командную строку всех процессов таким образом.

0

Чтобы получить полный путь к двоичной системе процесса.

char * exepathp; 

struct file * exe_file; 
struct mm_struct *mm; 
char exe_path [1000]; 

//straight up stolen from get_mm_exe_file 
mm = get_task_mm(current); 
down_read(&mm->mmap_sem); //lock read 
exe_file = mm->exe_file; 
if (exe_file) get_file(exe_file); 
up_read(&mm->mmap_sem); //unlock read 

//reduce exe path to a string 
exepathp = d_path(&(exe_file->f_path), exe_path, 1000*sizeof(char)); 

Где ток задача структура процесса вы заинтересованы. Переменная exepathp получает строку полного пути. Это немного отличается от процесса cmd, это путь двоичного файла, который был загружен для запуска процесса. Объединение этого пути с процессом cmd должно дать вам полный путь.

Смежные вопросы