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

时间:2014-03-03 21:07:01

标签: c linux gcc linux-kernel linux-device-driver

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

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

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

2 个答案:

答案 0 :(得分:4)

最基本的方式:

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

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

如果我们想打电话

void __stack_chk_fail(void) 

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

void (*scf)(void) = (int (*)() ) 0xffffffff810519d0;

然后致电:

scf(); 

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

答案 1 :(得分:3)

无论如何,经过一些点击和阅读代码,我可以给你我的想法,虽然它可能不是100%正确。

正如你所说

  

他们的configure脚本生成了一些声明这些的头文件   作为外部函数,然后为每个指定一些指针值   叫做函数。

这可以通过简单调查 System.map 文件来完成。它是一个文本文件,包含带有内核符号的表和他们的地址。拥有该文件的某些脚本可以在 System.map 中查找所需的符号(函数名称),获取该函数的地址并使用找到的指针生成外部函数。好的黑客。