如何访问内核模块中的任何内核符号?

我想在我的内核模块中使用函数getname.它不会导出.由于我现在遇到这个问题,我想知道如何访问和使用任何未导出的内核符号.我认为使用一个步骤所需的步骤将根据符号的不同而有所不同,所以我想看看如何对类型(例如,结构),变量,指针表(如系统)进行操作调用表)和一个函数.如何在以下任何一种情况下完成:

>当我知道System.map或/ proc / kallsyms中符号的地址时.
>当我知道符号的名称并想要在检索它时使用kallsyms_lookup_name.

我目前知道如何劫持系统调用,这需要声明类似的东西

asmlinkage <return_type> (*<name_for_system_call>)(<the types of the its arguments separated by commas>);

是否会使用这样的东西?在https://stackoverflow.com/a/32968387/1953537回答另一个问题,海报提供的例子是

#include <linux/kallsyms.h>

static void (*machine_power_off_p)(void);
machine_power_off = (void*) kallsyms_lookup_name("machine_power_off");

但是如果符号返回指针怎么办?我会在(* machine_power_off_p)的左边放一个星号吗?

最佳答案 #include< linux / fs.h>声明extern struct filename * getname(const char __user *);.指向此函数的指针的类型为struct filename *(*)(const char __user *).如果声明该类型的变量,则变量名称位于* in(*)之后.因此,您可以声明该类型的变量,并将kallsyms_lookup_name(“getname”)的返回值分配给它,如下所示:

static struct filename *(*getname_p)(const char __user *);

getname_p = (struct filename *(*)(const char __user *))
            kallsyms_lookup_name("getname");

对于您想要使用数字地址的其他情况,只需将kallsyms_lookup_name函数调用替换为实际数字(kallsyms_lookup_name无论如何都将符号值作为数字返回).

点赞