在内核中寻找内核符号表

来源:互联网 发布:js中style.position 编辑:程序博客网 时间:2024/06/05 19:31

from:http://hi.baidu.com/wzt85/blog/item/eb8546f2a64e7616b17ec548.html

 

在用户空间中可以用如下方法得到:

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;
}

原创粉丝点击