查看文章 |
在内核中寻找内核符号表
2008-07-05 20:42
在用户空间中可以用如下方法得到: 1. 从 System.map 文件直接得到地址。 例如,要得到 do_fork 的地址,可以在命令行执行 $grep do_fork /usr/src/linux/System.map 。 2. 使用 nm 命令。 $nm vmlinuz |grep do_fork 3. 从 /proc/kallsyms 文件获得地址。 $cat /proc/kallsyms |grep do_fork 在2.6较早的版本中可以用kallsyms_lookup_name()来查找, 但是在我得2.6.18中好像没有导出。 贴一下wnps0.26中使用的方法, 前几天看了下《LKM Rootkits on Linux x86 v2.6》的中文版,里面有段寻找内核符号的代码, 怎么看都眼熟, 在仔细看原来是偶wnps的代码^_^ /** * read_kallsyms - find sysenter address in /proc/kallsyms. * * success return the sysenter address,failed return 0. */ #define SYSENTER_ENTRY "sysenter_entry" int read_kallsyms(void) { mm_segment_t old_fs; ssize_t bytes; struct file *file = NULL; char *p,temp[20]; int i = 0; file = filp_open(PROC_HOME,O_RDONLY,0); if (!file) return -1; if (!file->f_op->read) return -1; old_fs = get_fs(); set_fs(get_ds()); while ((bytes = file->f_op->read(file,read_buf,BUFF,&file->f_pos))) { if (( p = strstr(read_buf,SYSENTER_ENTRY)) != NULL) { while (*p--) if (*p == '\n') break; while (*p++ != ' ') { temp[i++] = *p; } temp[--i] = '\0'; sysenter = simple_strtoul(temp,NULL,16); #if DEBUG == 1 printk("sysenter: 0x%8x\n",sysenter); #endif break; } } filp_close(file,NULL); return 0; } |
最近读者: