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