В манах по nasm'у я находил как писать модули но для версии 2.4 в 2.6 же так ка модули собиратся совсем подругому просто использовать *.S вместо *.c файла не получается что делать? Или же если делать модуль состощим из двух файлов на с и асме отдельно то как это указать в makefile'е ?
вот простейший модуль Код (Text): # module.S .text init_module: xorl %eax, %eax ret cleanup_module: ret Makefile для него компиляция
модуль таким образом собирается но загружатся в ядро не хочет из за того что модуль содержит неизвестные символы
_ir4_Y_ сразу после insmod сделай следующее Код (Text): # cat /var/log/messages | tail -30 и посмотри, что за символ не может быть разрешен или приведи здесь код модуля
модуль я написал собирается нормально но не работает!! код модуля такой Код (Text): //sys_call_table.h unsigned long* sys_call_table = (void*) 0xc07134c0; Код (Text): //mod.c # include <linux/module.h> # include <linux/kernel.h> # include <linux/init.h> # include <linux/syscalls.h> # include <linux/string.h> # include "./sys_call_table.h" extern unsigned long thunk_write; extern unsigned long *old_offset_write; MODULE_LICENSE ("GPL"); int init_module(void) { unsigned long *table=(void*)sys_call_table; old_offset_write=(void*)table[__NR_write]; table[__NR_write]=&thunk_write; return 0; } void cleanup_module() { unsigned long *table=(void*)sys_call_table; table[__NR_write]=(unsigned long)old_offset_write; } int ask(char *buf,int size) { char *ptr; char* flag; ptr=(char*)kmalloc(size+1,GFP_KERNEL); copy_from_user(ptr,buf,size); *(ptr+size+1)=0x0; flag=strstr(ptr,"I_R_"); kfree(ptr); if(flag==NULL) return 0; else return 1; } Код (Text): #source.S .global thunk_write .global old_offset_write .extern ask .text old_offset_write: .long 0x0 thunk_write: movl 12(%esp),%eax pushl %eax movl 8(%esp),%eax pushl %eax call ask add $8,%esp cmpl $1,%eax jz bad jmp *old_offset_write bad: ret Makefile: Код (Text): obj-m +=I_R_.o I_R_-objs += source.o mod.o по идее если в строке переданой системному вызову write встречается подстрока I_R_ то возвращается -1 в противном случае вызывается оригинальный системный вызов но почему то после загрузки модуля его видно через команду lsmod
также вместо Код (Text): *(ptr+size+1)=0x0; должно быть Код (Text): ptr[size] = 0; а то можешь что-нибудь не то затереть
с адресом sys_call_table пока решил не заморачиватся особо функция по ее поиску строк 10 кода всего ) я думаю проблема в copy_from_user так как в возвращаемой ей строке никогда не появляется подстрока I_R_ что за строку она возвращает хз и не проверить никак( параметры ей вроде правильные передаю
И еще подскажите ктонить плз как находясь в ядре вызвать функцию clone ? ди а вобще любой системный вызов ??
обычно функции, реализующие системные вызовы (sys_*), являются обертками над основными функциями, реализующими те или иные действия для sys_clone(), sys_fork(), sys_vfork() такой функцией является экспортируемая функция do_fork() в частности Код (Text): asmlinkage long sys_clone(unsigned long clone_flags, unsigned long newsp, void __user *parent_tid, void __user *child_tid, struct pt_regs *regs) { if (!newsp) newsp = regs->rsp; return do_fork(clone_flags, newsp, regs, 0, parent_tid, child_tid); } т. е sys_clone() эквивалентен do_fork() с измененными параметрами для остальных системных вызовов смотрится по аналогии