- 论坛徽章:
- 2
|
本帖最后由 HazeC 于 2017-03-24 12:29 编辑
回复 26# Godbach
1、导出函数的内核模块(A.ko)- int export_hello_kernel(void){
- int i = 0;
- printk("%s-%pS\n" ,__FUNCTION__ ,(void *)export_hello_kernel);
- }
- EXPORT_SYMBOL(export_hello_kernel);
复制代码 2、引用函数的内核模块(B.ko)
首先是读取 /proc/kallsyms,找到export_hello_kernel的函数地址。
代码来自4.4.1版本内核文件"kernel/livepatch/core.c"- struct klp_verify_args args = {
- .name = name,
- .addr = addr,
- };
复制代码- static int klp_verify_callback(void *data, const char *name,
- struct module *mod, unsigned long addr)
- {
- struct klp_verify_args *args = data;
- if (!mod &&
- !strcmp(args->name, name) &&
- args->addr == addr)
- return 1;
- return 0;
- }
复制代码- static int klp_verify_vmlinux_symbol(const char *name, unsigned long addr)
- {
- int ret;
- mutex_lock(&module_mutex);
- ret = kallsyms_on_each_symbol(klp_verify_callback, &args);
- mutex_unlock(&module_mutex);
- if (!ret) {
- pr_err("symbol '%s' not found at specified address 0x%016lx, kernel mismatch?\n",
- name, addr);
- return -EINVAL;
- }
- return 0;
- }
复制代码
调用klp_verify_vmlinux_symbol,name为"export_hello_kernel" ,addr是输出变量,保存的就是导出函数的地址。
找到函数地址之后
run即为export_hello_kernel的指针了,可以直接调用了。
这样内核模块的开发就可以把核心的功能放在一个模块,其他功能可以以插件的形式挂载了。
啊哈。。直接拿来内核的代码,献丑了。CU排版真心不好用啊。
|
评分
-
查看全部评分
|