LINUX.ORG.RU

Всё ли нормально в символьном устройстве?

 , ,


2

5

Вот код. При открытии устройства драйвер получает список процессов. При чтении с устройства в пользовательский буфер копируется часть данных, но я ещё не уверен, использовал *pos для указания откуда начать копировать данные, если их будет очень много, но наверное можно было бы и обойтись и без них.

#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <linux/slab.h>
#include <linux/uaccess.h>
#include <linux/sched.h>
#include <linux/string.h>
MODULE_LICENSE("Dual BSD/GPL");

dev_t dev;
int lock;
unsigned baseminor = 0;
unsigned count = 1;
unsigned scull_major = 0;
char *name = "scull";
struct scull_dev {
	int quantum;
	int qset;
	unsigned long size;
	unsigned int access_key;
	struct semaphore sem;
struct cdev cdev;
};
struct scull_dev *sdev;
char *data;

loff_t scull_llseek ( struct file *file, loff_t pos, int n )
{
}
ssize_t scull_read ( struct file *file, char __user *buf, size_t count, loff_t *pos)
{
	char *p;
	p = data;
	p += *pos;

	int len = strlen ( p );

	len = len > 4096 ? count : len;

	memset ( buf, 0, sizeof buf );
	
	copy_to_user ( buf, p, len ); 

	*pos += len;

	return len;
}
ssize_t scull_write ( struct file *file, const char __user *buf, size_t n, loff_t *lt )
{

}
int scull_open ( struct inode *inode, struct file *filp )
{
	if ( lock ) while ( lock ){};
	lock = 1;
	struct scull_dev *scdev;
	struct task_struct *task;

	scdev = container_of ( inode->i_cdev, struct scull_dev, cdev );
	filp->private_data = scdev;

	data = kmalloc ( 16386, GFP_USER );
	char *p, *h;
	p = data;
	int len = 0;

	for_each_process(task) 
	{
		h = &task->comm[0];
		for ( ; *h != 0 && len < 16384; p++, h++, len++ ) *p = *h;
		*p = 32;
		p++;
		len++;
		if ( len > 16384 ) break;
		printk ( "%s\n", task->comm );
	}
	*p = 0;

	return 0;
}
int scull_release ( struct inode *inode, struct file *file )
{
	kfree ( data );
	lock = 0;
	return 0;
}

struct file_operations scull = {
	.owner = THIS_MODULE,
	.llseek = scull_llseek,
	.read = scull_read,
	.write = scull_write,
	.open = scull_open,
	.release = scull_release
};

static int hello_init ( void )
{
	sdev = kmalloc ( sizeof ( struct scull_dev ), GFP_KERNEL );
	int err;
	int result = alloc_chrdev_region ( &dev, baseminor, count, name );
	scull_major = MAJOR(dev);
	cdev_init ( &sdev->cdev, &scull );
	sdev->cdev.owner = THIS_MODULE;
	sdev->cdev.ops = &scull;
	err = cdev_add ( &sdev->cdev, dev, 1 );
	if ( err )
		printk (KERN_NOTICE "Error %d adding scull%d", err, 0 );
	
}

static void hello_exit ( void )
{
	cdev_del ( &sdev->cdev );
	kfree ( sdev );
	unregister_chrdev_region ( dev, count );
}

module_init ( hello_init );
module_exit ( hello_exit );

Ответ на: комментарий от XMs

WannaCry, совсем недавно же, буквально на днях. Заражал, эксплуатируя уязвимость в samba, которая в виндах наружу по дефолту.

mersinvald ★★★★★
()
Ответ на: комментарий от mersinvald

Шифровальщик, не вирус. Для ясности: под вирусами я подразумеваю класс зловредов, характерных заражением уже существующих файлов вместо создания новых, ставший бичом доса и линейки win95/98/ME

XMs ★★★★★
()
Ответ на: комментарий от XMs

Ты знаешь что такое защита и нападение. Как атака помогает развиваться в защите, некой прогресс такой. Так вот, человек ищет уязвимость в программной обеспечении, находит и обьявляет об этом. Разработчик закрывает уязвимость тем самым развиваясь.
В твоём случае, в направлении создании вредоносов и защиты от них, ты остановился в развитии аж со школьных лет. Это находится в самом левом узле красно-чёрного дерева в твоём планировании.

Ещё такой момент: ты ждёшь, что тебе укажут на ошибки, ты их исправишь и от этого твой уровень мастерства повысится. Даже если так будет, в чём я довольно сильно сомневаюсь, это гораздо медленнее, чем последовать советам из этого и предыдущих тредов. От того, что, допустим, я укажу тебе, что функция hello_init() должна возвращать int, а на деле не возвращает ничего, твой менталитет не поменяется. А должен.

В любом случае, информация, которую можно получить быстро, тоже бывает полезна.
Что скажешь насчёт кода. Что такое likely и unlikely, и где об этом можно почитать, а то тут человек не захотел подробно писать об этом, вот сам знает, а рассказать об этом не хочет. В каких случаях применять, пишет что мне не нужно это использовать, а сам использует.
Раз уж ты хочешь помочь, со своей вступительной речью решил на тему зайти, то скажи, как можно было бы улучшить символьное устройство, хотелось бы на код посмотреть. Ну если не сложно.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от XMs

Я очень надеюсь, что ты это так пошутил. Упоминать в одной строчке «профессионал», «создание вирусов» и «xor» — это даже не моветон.

Ты незнаешь форензику.

u0atgKIRznY5
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Что такое likely и unlikely

likely нужно использовать в антивирусах, чтобы они лучше вирусы ловили. А unlikely — в операционных системах, чтобы они меньше ломались.

i-rinat ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

Я не верю, что это не троллинг. Не верю.

anonymous
()
Ответ на: комментарий от i-rinat

Дополню ответ, чтобы было яснее:
likely — переводится как вероятно, что значит «вероятно этот код стоит проверить». Антивирусы работают с ОС и по этим директивам проверяют код и данные, чтобы вредоносы там не смогли ничего сделать. Это, так сказать, защищенный код.
unlikely — значит что скорее всего код и так безопасен, не стоит тратить время на его проверку.

В линуксе в роли антимируса выступают SELinux и SystemD, первый применяет политики безопасности к блокам, комеченным как likely во время работы системы, а SystemD на этапе загрузки. Плюс SystemD в том что он интегрирован с pulseaudio и gnome-shell, что гарантирует безопасность воспроизведения аудио и аутентификации в гноме, в отличии от простых скриптовых систем инициализации.

mersinvald ★★★★★
()
Последнее исправление: mersinvald (всего исправлений: 1)
Ответ на: комментарий от u0atgKIRznY5

Роберт Лав. Разработка ядра Linux. Несколько устарела, но всё ещё годная.

Dark_SavanT ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.