Проблема с kmalloc()

Тема в разделе "WASM.UNIX", создана пользователем 4ekin, 3 апр 2009.

  1. 4ekin

    4ekin New Member

    Публикаций:
    0
    Регистрация:
    3 апр 2009
    Сообщения:
    3
    Доброго дня суток.
    Пишу программу под nix, обычный руткит, перехватывающий системный вызов.
    Встал вопрос о том, каким образом найти адрес функции kmalloc(), чтобы потом записать свою функцию вызова этого адреса.
    Используется следующая функция, но почему то она находит адреса только после 0xc1######, хотя как мне кажется все системные функции должны находится в интервале от нижней границы 0xc0000000 до 0xc1000000.
    Код (Text):
    1. unsigned long get_kma()
    2. {
    3.     unsigned int i;
    4.     unsigned char buf[0x10000], *p, *p1;
    5.     unsigned long ret;
    6.     char c;
    7.    
    8.     kmem = open("/dev/kmem", O_RDONLY);
    9.         if (kmem<0) return 1;
    10.        
    11.         for (i = page_offset+0x100000; i<(page_offset+0x10000000); i+=0x10000)
    12.         {
    13.             readkmem (buf,i,sizeof(buf));
    14.             //printf("%s\n",buf);
    15.             //c = getc(stdin);
    16.             p1 = (char*)memmem (buf, sizeof(buf), "\x68\xf0\x01\x00",4);
    17.             if (p1)
    18.             {
    19.                 printf("kmalloc() is found!!!\n");
    20.                 p = (char*)memmem(p1+4, sizeof(buf), "\xe8",1)+1;
    21.                 if (p)
    22.                 {
    23.                     //close (kmem);
    24.                     //return *(unsigned long *)p+i+(p-buf)+4;
    25.                     printf("----0x%x\n", *(unsigned long *)p+i+(p-buf)+4);
    26.                     c=getc(stdin);
    27.                 }
    28.             }
    29.         }
    30.    
    31.     close(kmem);
    32.     return 0;
    33.  
    34. }
    Пытался собственно вызвать один из полученных адресов - ядро улетает, приходится перезагружаться. В чем может быть проблема, почему не находит адрес kmalloc()?
     
  2. bendme

    bendme New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    179
    А чему у тебя равен page_offset и сколько адресов у тебя твоя функция находит? Ты уверен, что у тебя опкоды верные? А ты в пользовательском режиме или в режиме ядра находишься? )
     
  3. 4ekin

    4ekin New Member

    Публикаций:
    0
    Регистрация:
    3 апр 2009
    Сообщения:
    3
    page_offset равен 0xc0000000, смысл функции в том что она ищет среди системных функций (а именно они находятся начиная с 0xc0000000 заканчивая 0xc1000000) опкод операции push 1f0, что соответствует параметру флага GFP_KERNEL, затем ищет опкод call (\xe8), затем уже находит нужный адрес.

    появился другой вопрос: если найден адрес функции kmalloc() (я его нашел с помощью модулей, банально printk(KERN_INFO "kmalloc address %x",kmalloc), причем там адрес вида 0xF9......), выделяется участок памяти, все вроде хорошо.

    при подмене системного вызова, я должен буду передать управление на свой измененный системный вызов, его писать как обычный код или как код для работы в режиме ядра?
     
  4. bendme

    bendme New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    179
    Как код для работы в режиме ядра писать надо, то есть не используя libc итд.
     
  5. 4ekin

    4ekin New Member

    Публикаций:
    0
    Регистрация:
    3 апр 2009
    Сообщения:
    3
    спасибо, но даже если я напишу обычный printk - компилятор будет страшно ругаться на меня)
    может быть надо компилировать надо с особенными параметрами?
     
  6. bendme

    bendme New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    179
    А на что компилятор ругается?
     
  7. milo

    milo New Member

    Публикаций:
    0
    Регистрация:
    22 мар 2009
    Сообщения:
    43
    я конечно не специалист, но, на сколько я знаю подмена системного вызова осуществляется подменой адреса sys_call_table. что я недопонимаю?
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    milo
    Я тоже не специалист в линуксе, но, по-моему, kmalloc не системный вызов.
     
  9. milo

    milo New Member

    Публикаций:
    0
    Регистрация:
    22 мар 2009
    Сообщения:
    43
    тоже верно:) kmalloc работает в пространстве ядра. более-менее проясняется.
     
  10. mowgli

    mowgli New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    15
    ну она в связке с kfree - управляет фрагментами реальной, физической памяти, чьи фактические адреса известны.