Как извлечь функции из ядра Linux?

Я работаю над проектом, который обнаруживает вредоносное ПО на основе методов машинного обучения. Моими основными целями являются Linux-устройства. Мой первый вопрос;

  1. Как я могу извлечь данные о процессах из ядра Linux с помощью драйвера ядра? Я хотел бы впервые извлечь данные о запущенных процессах только для проверки концепции. Позже я хотел бы написать драйвер ядра, чтобы делать это автоматически и в реальном времени.
  2. Существуют ли другие способы извлечения данных для запущенных процессов, таких как ProcessName, PID, UID, IS_ROOT и т. д.?

person mburakergenc    schedule 13.11.2016    source источник
comment
Ваш вопрос слишком широк и неясен. извлечь данные? Какие данные? Извлечение кем (человеком, программой C, веб-страницей...)? Что касается второго пункта, вы можете получить много этой информации даже на уровне пользователя через /proc файловая система   -  person kaylum    schedule 14.11.2016
comment
Спасибо за исправление. Я отредактировал сообщение. Для файловой системы proc можно ли экспортировать результаты в csv или файл любого типа. Я думаю, что могу написать для этого скрипт на Python, но мне интересно, есть ли для этого ярлык в bash. @кайлум   -  person mburakergenc    schedule 14.11.2016
comment
Извините, но stackOverflow предназначен для помощи людям в исправлении существующего кода, а не для исследования, спецификации, разработки и тестирования. Учитывая ваши вопросы, вам нужно потратить больше времени на определение конечной цели и написание кода, который пытается ее достичь. Если вы застряли после этого, опубликуйте Q, следуя рекомендациям для MCVE. Удачи.   -  person shellter    schedule 14.11.2016


Ответы (1)


Чтобы сделать это из пользовательского пространства:

ps -U <username/UID> | tr -s ' '| tr ' ' ','| cut -d ',' -f2,5 > out.csv

Из пространства ядра, как модуль:

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/sched.h>

static int uid=0;

static int procx_init(void){
    struct task_struct *task;
    for_each_process(task)
            printk ("uid=%d, pid=%d, command=%s\n", task->cred->uid, task->pid, task->comm);
    return 0;
}
static void procx_exit(void)
{
    printk("procx destructor\n");
}
module_init(procx_init);
module_exit(procx_exit);
module_param(uid, int, 0);

MODULE_AUTHOR ("[email protected]");
MODULE_DESCRIPTION ("Print process Info");
MODULE_LICENSE("GPL");

Я не проверял UID, но вы можете передать его как параметр модуля или средство передачи во время выполнения, чтобы вызвать kthread.

person Sundeep471    schedule 14.11.2016
comment
Я думаю, что это ответ, который я ищу. Я пытаюсь получить lstart,cmd,pid,ppid,uid,pgrp,pcpu,%mem,vsize,share,cmin_flt,time,size,ruser из пользовательского пространства. Однако, поскольку я новичок в этом, не могли бы вы объяснить первый способ, который вы упомянули. Например, как вы печатаете PID и cmd? это -s и -d? - person mburakergenc; 14.11.2016
comment
Думаю, я сделал это. Вот как :) ps -eo cmd,pid,ppid,uid,pgrp,pcpu,%mem,vsize,share,cmin_flt,size,ruser | тр -с ''| tr ' ' ',' › cleandata.csv - person mburakergenc; 14.11.2016