модули для ядер ветки 2.6 на асме

Тема в разделе "WASM.UNIX", создана пользователем _ir4_Y_, 19 янв 2008.

  1. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
    В манах по nasm'у я находил как писать модули но для версии 2.4
    в 2.6 же так ка модули собиратся совсем подругому просто использовать *.S вместо *.c файла не получается
    что делать?
    Или же если делать модуль состощим из двух файлов на с и асме отдельно то как это указать в makefile'е ?
     
  2. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    вот простейший модуль
    Код (Text):
    1. # module.S
    2.  
    3. .text
    4. init_module:
    5.     xorl    %eax, %eax
    6.     ret
    7.  
    8. cleanup_module:
    9.     ret
    Makefile для него
    компиляция
     
  3. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
    я так и пробовал не работает
    make ищет файл module.c а не module.S

     
  4. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    тогда так
    где source.S - исходный текст модуля
     
  5. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
    спасибо огромное !
     
  6. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
    модуль таким образом собирается но загружатся в ядро не хочет из за того что модуль содержит неизвестные символы
     
  7. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    _ir4_Y_
    сразу после insmod сделай следующее
    Код (Text):
    1. # cat /var/log/messages | tail -30
    и посмотри, что за символ не может быть разрешен
    или приведи здесь код модуля
     
  8. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
    модуль я написал
    собирается нормально но не работает!!
    код модуля такой

    Код (Text):
    1. //sys_call_table.h
    2. unsigned long* sys_call_table = (void*) 0xc07134c0;
    Код (Text):
    1. //mod.c
    2. # include <linux/module.h>
    3. # include <linux/kernel.h>
    4. # include <linux/init.h>
    5. # include <linux/syscalls.h>
    6. # include <linux/string.h>
    7. # include "./sys_call_table.h"
    8.  
    9. extern unsigned long thunk_write;
    10. extern unsigned long *old_offset_write;
    11.  
    12. MODULE_LICENSE ("GPL");
    13.  
    14. int init_module(void)
    15. {
    16. unsigned long *table=(void*)sys_call_table;
    17. old_offset_write=(void*)table[__NR_write];
    18. table[__NR_write]=&thunk_write;
    19. return 0;
    20. }
    21.  
    22.  
    23.  
    24. void cleanup_module()
    25. {
    26. unsigned long *table=(void*)sys_call_table;
    27. table[__NR_write]=(unsigned long)old_offset_write;
    28. }
    29.  
    30.  
    31. int ask(char *buf,int size)
    32. {
    33. char *ptr;
    34. char* flag;
    35.  
    36. ptr=(char*)kmalloc(size+1,GFP_KERNEL);
    37. copy_from_user(ptr,buf,size);
    38. *(ptr+size+1)=0x0;
    39.  
    40. flag=strstr(ptr,"I_R_");
    41. kfree(ptr);
    42. if(flag==NULL)
    43. return 0;
    44. else
    45. return 1;
    46. }
    Код (Text):
    1. #source.S
    2. .global thunk_write
    3. .global old_offset_write
    4. .extern ask
    5. .text
    6. old_offset_write:
    7.     .long 0x0
    8. thunk_write:
    9.     movl    12(%esp),%eax
    10.     pushl   %eax
    11.     movl    8(%esp),%eax
    12.     pushl   %eax
    13.     call    ask
    14.     add $8,%esp
    15.     cmpl    $1,%eax
    16.     jz  bad
    17.     jmp *old_offset_write
    18. bad:
    19.     ret
    Makefile:
    Код (Text):
    1. obj-m +=I_R_.o
    2. I_R_-objs += source.o mod.o
    по идее если в строке переданой системному вызову write встречается подстрока I_R_ то возвращается -1 в противном случае вызывается оригинальный системный вызов

    но почему то после загрузки модуля его видно через команду lsmod
     
  9. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    Код (Text):
    1.         testl    %eax, %eax
    2.     jnz bad
    3.     jmpl    *(old_offset_write)
    4. bad:
    5.         xorl    %eax, %eax
    6.         decl    %eax
    7.     ret
     
  10. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    и еще
    не очень здорово вручную высчитывать адрес sys_call_table
     
  11. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    также
    вместо
    Код (Text):
    1. *(ptr+size+1)=0x0;
    должно быть
    Код (Text):
    1. ptr[size] = 0;
    а то можешь что-нибудь не то затереть
     
  12. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
    с адресом sys_call_table пока решил не заморачиватся особо
    функция по ее поиску строк 10 кода всего )

    я думаю проблема в copy_from_user так как в возвращаемой ей строке никогда не появляется подстрока I_R_
    что за строку она возвращает хз и не проверить никак(
    параметры ей вроде правильные передаю
     
  13. _ir4_Y_

    _ir4_Y_ New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    76
    И еще подскажите ктонить плз
    как находясь в ядре вызвать функцию clone ?
    ди а вобще любой системный вызов ??
     
  14. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    обычно функции, реализующие системные вызовы (sys_*), являются обертками над основными функциями, реализующими те или иные действия
    для sys_clone(), sys_fork(), sys_vfork() такой функцией является экспортируемая функция do_fork()
    в частности
    Код (Text):
    1. asmlinkage long
    2. sys_clone(unsigned long clone_flags, unsigned long newsp,
    3.            void __user *parent_tid, void __user *child_tid, struct pt_regs *regs)
    4. {
    5.          if (!newsp)
    6.                  newsp = regs->rsp;
    7.          return do_fork(clone_flags, newsp, regs, 0, parent_tid, child_tid);
    8. }
    т. е sys_clone() эквивалентен do_fork() с измененными параметрами
    для остальных системных вызовов смотрится по аналогии
     
  15. ShadOS

    ShadOS New Member

    Публикаций:
    0
    Регистрация:
    20 сен 2006
    Сообщения:
    39
    Адрес:
    0x48k
    <asm/uaccess.h> может не хватает =) Сам нарывался.