控制内核中的函数指针

时间:2015-10-22 14:05:35

标签: c pointers linux-kernel

如果我在内核中控制了一个指向我想要的地方的函数指针,那么让我们在用户区指向我自己设计的函数evil

err = writepage(page) //->writepage is a kernel function pointer pointing to a evil in the userland

printf中只有evil,如果内核取消引用该函数指针会有内核恐慌吗?由于evil在内核模式下运行(如果我错了,请纠正我),但内核不是printf

int evil() {
   printf("I don't think printf will be executed because evil is executed is kernel mode")
}

1 个答案:

答案 0 :(得分:4)

内核永远不会看到" printf&#34 ;;它看到一个不同地址的调用,就像程序没有按名称调用该函数一样,但是相应地设置包含参数的寄存器并调用该函数。

这不会起作用,因为printf呼叫所指向的地址与用户流程相关的地址是'内存,并不存在于内核内存中。

你必须意识到进程在自己的虚拟内存中运行 - 程序中使用的地址都不需要对不同的进程有意义。

所以你即使只是在用户空间进程中调用一个函数也 你首先必须找到内核看到的内存在哪里,然后调用它。当然,它然后在内核模式下运行,但这并不奇怪 - 没有理智的操作系统会允许用户进程以这种方式弯曲内部函数调用。