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

Mel*_*lab 6 c linux kernel-module linux-kernel

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

  • 当我从System.map或 中知道符号的地址时/proc/kallsyms。
  • 当我知道符号的名称并想用于kallsyms_lookup_name检索它时。

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

asmlinkage <return_type> (*<name_for_system_call>)(<the types of the its arguments separated by commas>);
Run Code Online (Sandbox Code Playgroud)

会使用这样的东西吗?在这个对另一个问题的回答中,海报展示的例子是

#include <linux/kallsyms.h>

static void (*machine_power_off_p)(void);
machine_power_off = (void*) kallsyms_lookup_name("machine_power_off");
Run Code Online (Sandbox Code Playgroud)

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

小智 0

访问未导出的函数与访问导出的函数没有什么不同,只是您无法解析其在内核中的地址。你可以这样做:

static void (*your_func)(void);
your_func=0xhex_addr;
Run Code Online (Sandbox Code Playgroud)

或对于结构

strucr your_struct{int i;double j} *stru;
stru=0xhex_addr;
Run Code Online (Sandbox Code Playgroud)

指针的类型仅定义从指针的地址读取或写入多少字节。

对于结构或变量的十六进制地址甚至可能驻留在内核代码段中,但是如果您尝试向该结构或变量写入某些内容,则会出现分段错误 - 读取是合法的。还有一件事......在使用结构进行此技巧时,不要忘记结构数据对齐。