如何从内核模块引用非导出的 Linux 内核函数?

heb*_*bbo 1 c linux gcc linux-device-driver linux-kernel

我一直在使用伯克利实验室(即 BLCR)的这个过程检查点项目。我注意到他们一直在引用内核中的一些函数,这些函数没有被导出,也没有在任何头文件中声明。他们的代码由内核模块和一些用户空间实用程序组成。因此,他们不需要应用任何内核补丁。

他们的配置脚本生成了一些头文件,将这些函数声明为外部函数,然后为每个被调用的函数分配一些指针值。我不确定他们如何生成这些指向函数的指针或他们如何使用它们。

我的问题是:有没有办法调用内核函数而不导出该函数并且不在头文件中声明它?

JOg*_*den 8

最基本的方法:

地址可以通过解析 System.map 或 /proc/kallsyms 来定位(您可能需要以 root 身份查看地址,普通用户可能会在这里看到零)。

函数原型可以通过查看内核源代码找到。

如果我们想打电话

void __stack_chk_fail(void) 
Run Code Online (Sandbox Code Playgroud)

如果不使用导出的符号,我们将解析一个地址并声明如下:

void (*scf)(void) = (int (*)() ) 0xffffffff810519d0;
Run Code Online (Sandbox Code Playgroud)

然后调用:

scf(); 
Run Code Online (Sandbox Code Playgroud)

(__stack_chk_fail 实际上是导出的,但它是我在回答问题时看到的第一个没有参数的函数)。