LINUX.ORG.RU

компиляция модуля ядра

 , ,


1

2

Всем привет кто знает как скомпилировать данный модуль ядра в МСВС5

#include <linux/module.h>
#include <linux/kernel.h>
#include <sys/syscall.h>
#include <linux/types.h>
#include <linux/slab.h>
#include <linux/string.h>
#include <asm/uaccess.h>

extern void *sys_call_table[];

int (*orig_open)(const char *pathname, int flag, int mode);

int own_open(const char *pathname, int flag, int mode)
{
    char *kernel_path;
    char hide[]="test.txt";
    kernel_path=(char *)kmalloc(255,GFP_KERNEL);

    copy_from_user(kernel_path, pathname, 255);
    if(strstr(kernel_path,(char *)&hide) != NULL)
    {
	kfree(kernel_path);
	return -ENOENT;

    }
    else
    {
	kfree(kernel_path);
	return orig_open(pathname, flag, mode);

    }

}
int init_module()
{
    orig_open=sys_call_table[SYS_open];
    sys_call_table[SYS_open]=own_open;
    return 0;

}

void cleanup_module()

{
    sys_call_table[SYS_open]=orig_open;
}

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


скиньте ваш мейк файл



ты ж щас опять пробелов и «кавычек» понатыкаешь

KERNELDIR := /lib/modules/`uname -r`/build
obj-m := interupt.o
all:
    $(MAKE) -C $(KERNELDIR) M=`pwd` modules
clean:
    $(MAKE) -C $(KERNELDIR) M=`pwd` clean

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

ну как я скопировал в винде этот текст в txt файл потом через флешку перенес его в мсвс 1)перешел в папку modl 2) там создал файл modl.base64 3) в него скопирвоал текст из txt файла потом сохранил его(modl.base64) 4) выполнил base64 -d < modl.base64 > modl.rar пишет invalid input

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


что в makefaile не должно быть пробелов вообще?


только те, которые одинарные посреди строк

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

ну так он начинает компилировать начинает и ошибки в interupt.c

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

в каком редакторе...

KERNELDIR(здесь пробел):=(здесь пробел)/lib/modules/`uname -r`/build
obj-m(здесь пробел):= interupt.o
all:
(здесь табуляция)$(MAKE)(здесь пробел)-C(здесь пробел)$(KERNELDIR) M=`pwd`(здесь пробел)modules
clean:
(здесь табуляция)$(MAKE)(здесь пробел)-C(здесь пробел)$(KERNELDIR) M=`pwd`(здесь пробел)clean

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


ну как я скопировал в винде этот текст в txt файл потом через флешку перенес его в мсвс 1)перешел в папку modl 2) там создал файл modl.base64 3) в него скопирвоал текст из txt файла потом сохранил его(modl.base64) 4) выполнил base64 -d < modl.base64 > modl.rar пишет invalid input


а, стой, ты ж из винды копировал
значит в линуксе тому файлу, который ты принес с винды нужно (после шана 3) сделать

dos2unix modl.base64

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


include/linux/moduleparam.h:4:18: error: init.h: Нет такого файла или каталога
include/linux/moduleparam.h:5:23: error: stringify.h: Нет такого файла или каталога
/modl/interupt.c:4:25: error: sys/syscall.h: Нет такого файла или каталога


да какая-то фигня тут творится
sys/syscall.h - это вообще убрать нужно

и покажи 4-ю строчку include/linux/moduleparam.h

у менгя такое подозрение, что ты его успел подредактировать %)

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

теперь такие ошибки [root@maks modl]# make make -C /lib/modules/`uname -r`/build M=`pwd` modules make[1]: Entering directory `/usr/src/kernels/2.6.32-358.14.1.el6.x86_64' CC [M] /modl/interupt.o /modl/interupt.c: In function 'own_open': /modl/interupt.c:20: предупреждение: результат 'copy_from_user', декларированной с атрибутом warn_unused_result, игнорируется /modl/interupt.c: In function 'init_module': /modl/interupt.c:37: ошибка: 'SYS_open' undeclared (first use in this function) /modl/interupt.c:37: ошибка: (Each undeclared identifier is reported only once /modl/interupt.c:37: ошибка: for each function it appears in.) /modl/interupt.c: In function 'cleanup_module': /modl/interupt.c:46: ошибка: 'SYS_open' undeclared (first use in this function) make[2]: *** [/modl/interupt.o] Ошибка 1 make[1]: *** [_module_/modl] Ошибка 2 make[1]: Leaving directory `/usr/src/kernels/2.6.32-358.14.1.el6.x86_64' make: *** [all] Ошибка 2 [root@maks modl]#

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

теперь такие ошибки

[root@maks modl]# make
make -C /lib/modules/`uname -r`/build M=`pwd` modules
make[1]: Entering directory `/usr/src/kernels/2.6.32-358.14.1.el6.x86_64'
  CC [M]  /modl/interupt.o
  /modl/interupt.c: In function 'own_open':
  /modl/interupt.c:20: предупреждение: результат 'copy_from_user', декларированной с атрибутом warn_unused_result, игнорируется
  /modl/interupt.c: In function 'init_module':
  /modl/interupt.c:37: ошибка: 'SYS_open' undeclared (first use in this function)
  /modl/interupt.c:37: ошибка: (Each undeclared identifier is reported only once
  /modl/interupt.c:37: ошибка: for each function it appears in.)
  /modl/interupt.c: In function 'cleanup_module':
  /modl/interupt.c:46: ошибка: 'SYS_open' undeclared (first use in this function)
  make[2]: *** [/modl/interupt.o] Ошибка 1
  make[1]: *** [_module_/modl] Ошибка 2
  make[1]: Leaving directory `/usr/src/kernels/2.6.32-358.14.1.el6.x86_64'
  make: *** [all] Ошибка 2
  [root@maks modl]#  

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

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

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

да мне, на самом деле, надо сейчас чем-то заняться - я ночь не спал, а устройство (по работе) занято циклом тестов... вот, чтоб не уснуть сейчас пытаюсь себя чем-нить занять %)

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

при том, что после того, как ты прочитаешь LDD, он магическим образом начнёт находить хэдеры. такая вот уличная магия.

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

хидеры он уже все находит, вопрос остался, правда, нафига было менять moduleparam.h...

по теме - сдается мне, нужно не SYS_open, а sys_open...

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

я подключил #include <linux/syscalls.h> он его нашел но почему то он ругается на 37 строку на SYS_open

kold2015
() автор топика

Hardcore kernel development ITT

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

ну че, молодец, теперь ты можешь начать пробовать изучать предмет

- сначала предлагаю погуглить про азы bash'а и make'а
- потом можно найти книжку Кернигана и Ричи про язык C
- а уж после этого взять ту, что рекомендовала тебе Iron_Bug + найди Роберта Лава Linux Kernel Development, и для полного щастя Understanding Linux Kernel

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

хм... хорошая книжка, все довольно доступно изложено, жаль, что раньше не попадалась - у меня сейчас как раз проблемка с pthread_cond_var и ftd2xx, но это уже оффтопик

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

появились вопросы... код модуля

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/slab.h>
#include <linux/string.h>
#include <linux/unistd.h>
#include <asm/uaccess.h>


extern void *sys_call_table[];


int (*orig_open)(const char *pathname,int flag,int mode);
int (*orig_write)(int,const void *buf,size_t count);
int (*orig_close)(int);


int myopen(const char *pathname,int flag,int mode)
{
    if (pathname!="/openlog")
    {
        char buf[]="ÆÁÊÌ ÐÒÏÞÉÔÁÎ";
        int opis=orig_open("/openlog",flag,mode);
        orig_write(opis,buf,sizeof(buf));
        orig_close(opis);
    }
    else
    {
        return orig_open(pathname,flag,mode);
    }
}

static int __init start(void)
{
    orig_open=sys_call_table[__NR_open];
    sys_call_table[__NR_open]=myopen;
    return 0;
}


static void __exit  stop(void)
{
    sys_call_table[__NR_open]=orig_open;
}

module_init(start);
module_exit(stop);
начинаю собирать makeом
[root@maks modl]# make
make -C /lib/modules/`uname -r`/build M=`pwd` modules
make[1]: Entering directory `/usr/src/kernels/2.6.32-358.14.1.el6.x86_64'
  Building modules, stage 2.
  MODPOST 1 modules
WARNING: "sys_call_table" [/modl/interupt.ko] undefined!
make[1]: Leaving directory `/usr/src/kernels/2.6.32-358.14.1.el6.x86_64'

Запускается с ошибкой....

[root@maks modl]# insmod interupt.ko
insmod: error inserting 'interupt.ko': -1 Unknown symbol in module
[root@maks modl]#

в чем может быть проблема.. ps ldd читал

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

уже писали что sys_call_table не экспортируется

необучаемые

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

так было же уже: компиляция модуля ядра (комментарий)
и предыущий оратор подтвердил.

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

P.S. _одной_ книжки мало. тебе сперва нужно дорасти до чтетия исходников ядра, а потом уже пытаться что-то похакать

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

язык с я знаю я пишу gui приложения на qt... просто я ни разу не спускался на уровень ядра...

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

а какой же подход использовать если sys_call_table не экспортируется и LSM не для того а как же тогда быть...?

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

апаю тему у меня появился вопрос у api ядра есть функция http://www.cs.bham.ac.uk/~exr/lectures/opsys/14_15/docs/kernelAPI/r9900.html call_usermodehelper

я так понял что можно запустить пользовательскую программу из пространства ядра.... те грубо говоря можно ли сделать так что я отлавливаю системный вызов open потом из него уже запускаю свою программу (передаю в нее полный путь файла или папки и приложение которое вызвало данный вызов ) и уже в этой программе анализирую поступивший объект(файл или папку) потом если данный объект на контроле я уже пишу в лог сообщение типа: «файл test был запущен(открыт) программой mc в 20:00» я так понял что получить имя программы открывшей(вызвавшей) системный вызов open можно с помощью указателя current->comm

kold2015
() автор топика
    }
    else
    {

здохни

anonymous
()
17 апреля 2017 г.
Ответ на: комментарий от metawishmaster

хидеры он уже все находит,

для чайника - прочел до этого места но ни чего не понял хоть в бубен бей

#include <linux/kernel.h> - нет такого файла и католога читаю Linux Device Driver 2-nd edition. помогите !!!!!!!!!!!!

jaber-ru
()
Ответ на: хидеры он уже все находит, от jaber-ru

ниче не понятно, но если файл с кодом называется module.c, нужны еще два файла для сборки:
Kbuild, например

obj-m = module.o

и Makefile
KERNELDIR := /lib/modules/`uname -r`/build
all:
    $(MAKE) -C $(KERNELDIR) M=`pwd` modules

clean:
    $(MAKE) -C $(KERNELDIR) M=`pwd` clean


ну и в файле module.c
#include <linux/kernel.h>


p.s. да, а версия ядра-то какая?

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

ну не знаю что и делать уже

Сходи в наряд.

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

хотяб что выводит

vasiliy@vasiliy-desktop:~$ obj-m = word.o

bash: obj-m: команда не найдена vasiliy@vasiliy-desktop:~$

jaber-ru
()
Ответ на: комментарий от metawishmaster

ну так и что не получается?

есть в bash только objcopy .. может поставить сборку Ubuntu

как у всех будут команды??? а уж потом эксперименты на другом дистрибутиве. или что лучше посоветуете??

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