Доброго дня суток. Пишу программу под nix, обычный руткит, перехватывающий системный вызов. Встал вопрос о том, каким образом найти адрес функции kmalloc(), чтобы потом записать свою функцию вызова этого адреса. Используется следующая функция, но почему то она находит адреса только после 0xc1######, хотя как мне кажется все системные функции должны находится в интервале от нижней границы 0xc0000000 до 0xc1000000. Код (Text): 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()?
А чему у тебя равен page_offset и сколько адресов у тебя твоя функция находит? Ты уверен, что у тебя опкоды верные? А ты в пользовательском режиме или в режиме ядра находишься? )
page_offset равен 0xc0000000, смысл функции в том что она ищет среди системных функций (а именно они находятся начиная с 0xc0000000 заканчивая 0xc1000000) опкод операции push 1f0, что соответствует параметру флага GFP_KERNEL, затем ищет опкод call (\xe8), затем уже находит нужный адрес. появился другой вопрос: если найден адрес функции kmalloc() (я его нашел с помощью модулей, банально printk(KERN_INFO "kmalloc address %x",kmalloc), причем там адрес вида 0xF9......), выделяется участок памяти, все вроде хорошо. при подмене системного вызова, я должен буду передать управление на свой измененный системный вызов, его писать как обычный код или как код для работы в режиме ядра?
спасибо, но даже если я напишу обычный printk - компилятор будет страшно ругаться на меня) может быть надо компилировать надо с особенными параметрами?
я конечно не специалист, но, на сколько я знаю подмена системного вызова осуществляется подменой адреса sys_call_table. что я недопонимаю?
ну она в связке с kfree - управляет фрагментами реальной, физической памяти, чьи фактические адреса известны.