Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 8 мая!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Программисты долго мучаются с кодом прогаммы, изучают С++, WinAPI функции, MSDN. Потом пишут банальную систему защиты или навешивают банальный протектор, а крэкеры и реверсеры справляются с такой защитой за 5 минут. В итоге, продажи программы почти нулевые. Чтобы такого не допустить, тут самому надо немного поднабрать опыта отладки, реверсинга, тот же отладчик Ollydbg изучить или дизассемблер IDA Pro. Но где искать по крохам эти знания? Нет, конечно можно годами "методом тыка" разбираться, но куда быстрее видеокурс специальный посмотреть. Вот тут он есть: ссылка. Автор курса с большим опытом и объясняет понятно, я из этого курса много узнал про то как работает компьютер, процессор, про инструменты специальные и как с ними работать. Мои коллеги программисты на работе ничего такого и не знают, теперь я им нос утру.
.. Linux Kernel Modules  //dev0id

Для начала хочу сразу объяснить, что ядро-программа, написанная производителями операционной системы и являющаяся, так сказать, ее основой. Вообще, главный принцип почти всех операционных систем - возложение на ядро базовых операций по вводу/выводу и коммутаций между модулями ядра. Модуль ядра - своеобразная часть ядра, так же являющаяся программой, но написанная (не обязательно) создателем ядра. Программы данного типа призваны расширять возможности базовой конфигурации операционной системы, точнее базовой конфигурации ядра (очень напоминает работу утилит, но на более низком уровне). Вообще, программирование на уровне ядра - тема достаточно обширная, и обсудить все тонкости в одной статье не представляется возможным, так что я начну с самого простого.
Итак, из чего состоит модуль? Как уже говорилось, модуль - такая же программа как и обычные, с одной лишь разницей - она добавляет/изменяет некоторый код ядра. Из чего следует, что тело программы-модуля должно состоять по крайней мере из двух функций: одна для добавления/изменения функции (кода), вторая для отката (возврата) к состоянию до изменений в ядре. Если в обычной программе на С/С++ точкой входа в программу служит функция main, то для модуля это именно эти две функции. Названий этих функций соответствующие: int init_module() и void cleanup_module(). Возвращаемые значения у этих функций играют не последнюю роль: если в первой функции возвращаемое значение не 0, то модуль попросту не устанавливается; что же касается второй функции, то тип возвращаемого значения не определен, что говорит о том, что проверить на существование ошибок не представляется доступным. По этой причине следует делать массу проверок, так как может сложится ситуация в которой, к примеру, будет происходить обращение к устройству (файлу), драйвер которого в виде модуля будет удален из ядра. В этом случае управление может получить другая функция другого модуля установленного на место старого, что неизбежно приведет к ошибочному выполнению произвольного кода.Во избежание таких случаев существеут множество макросов и счетчиков, которыми следует пользоваться.
Пожалуй следует перейти от слов к делу. Для начала напишем самую популярную и многоплатформенную программу (господи, на что она только ни портировалась и на каких языках ее ни писали) - Hello world. Программа будет выполненна в виде модуля, главной целью которого будет вывод строки "Hello World" на экран при установке и "finished" при удалении его из ядра.

 --------------------------------------------------CODE_START-----------------------------
 #first.c
 /*
 Здесь идет подключение необходимых ХЭДов
 */
 #include <linux/kernel.h>
 #include <linux/module.h>
 
 #if CONFIG_MODVERSIONS==1
 #define MODVERSIONS
 #include <linux/modversions.h>
 #endif
 
 /*
 Здесь происходит инициализация модуля
 */
 int
 init_module()
 {
 	printk("Hello world!\n");
 	return 0; //помните, это обязательно!
 }
 
 /*
 А вот здесь должно происходить обратное действие установке
 */
 void
 cleanup_module()
 {
 	printk("finished\n");
 }
 
 --------------------------------------------------CODE_ENDS------------------------------
В данном модуле используется функция printk(), она позволит нам говорить от имени ядра (kernel). Так как это "не обычная программа", компилируется она так же не совсем обычно. Компилировать нужно с флагом -с. Но помимо этого используются еще некоторые ключи. Вот некоторые из них:

__KERNEL__ - говорит о том, что данная программа будет работать как ядро, а не обычный процесс.
MODULE - соответствующие определения для модуля ядра.
LINUX - не совсем понятно, но скорее всего для компиляции "зависимых от ОС" частей программы.

В компиляции вам может пригодиться утилита make. Вот исходный текст Makefile'а

 --------------------------------------------------CODE_START-----------------------------
 CC=gcc
 FLAGS:= -Wall -DMODULE -D_KERNEL__ -DLINUX
 first.o:	first.c /usr/include/linux/version.h
 	$(CC) $(FLAGS) -c first.c
 
 --------------------------------------------------CODE_ENDS------------------------------
 
Для загрузки/выгрузки модуля в код ядра используйте команду insmod/rmmod first.o

Следует оговорить некоторые особенности:

1) компиляция происходит не из-под рута.
2) загрузка и выгрузка происходит не из-под Х.

Согласен, что в данной статье было изложенно мало полезного для опытного хакера, но для человека, которого данная тема только начала интересовать, статья может показаться полезной... обещаю продолжить цикл посвященный данной теме, а пока приведу несколько ссылок: lbyte.void.ru, www.void.ru, www.nerf.ru - здесь вы найдете достаточное количество информации на русском, а пока все....

<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS