控制内核中的函数指针
control a function pointer in the kernel
如果我在内核中控制了一个函数指针指向我想要的地方,让我们让它指向我在用户空间中自己设计的函数evil
。
err = writepage(page) //->writepage is a kernel function pointer pointing to a evil in the userland
evil
中只有一个printf
,如果内核取消引用该函数指针,是否会出现内核恐慌?由于 evil
在内核模式下运行(如果我错了请纠正我),但内核并不像 printf
那样。
int evil() {
printf("I don't think printf will be executed because evil is executed is kernel mode")
}
内核永远不会看到“printf
”;它看到对不同地址的调用,就像程序没有通过名称调用该函数,而是相应地设置包含参数的寄存器并调用该函数一样。
那是行不通的,因为 printf
调用指向的地址是相对于用户态进程的内存,并不存在于内核内存中。
您必须意识到进程 运行 在它们自己的虚拟内存中 -- none 程序中使用的地址需要对不同的进程有意义。
所以你不能甚至只是在用户态进程中调用一个函数;您首先必须找出内核看到它在内存中的位置,然后调用它。当然,它会在内核模式下 运行 ,但这并不奇怪——理智的 OS 不会允许用户进程以这种方式改变内部函数调用。
如果我在内核中控制了一个函数指针指向我想要的地方,让我们让它指向我在用户空间中自己设计的函数evil
。
err = writepage(page) //->writepage is a kernel function pointer pointing to a evil in the userland
evil
中只有一个printf
,如果内核取消引用该函数指针,是否会出现内核恐慌?由于 evil
在内核模式下运行(如果我错了请纠正我),但内核并不像 printf
那样。
int evil() {
printf("I don't think printf will be executed because evil is executed is kernel mode")
}
内核永远不会看到“printf
”;它看到对不同地址的调用,就像程序没有通过名称调用该函数,而是相应地设置包含参数的寄存器并调用该函数一样。
那是行不通的,因为 printf
调用指向的地址是相对于用户态进程的内存,并不存在于内核内存中。
您必须意识到进程 运行 在它们自己的虚拟内存中 -- none 程序中使用的地址需要对不同的进程有意义。
所以你不能甚至只是在用户态进程中调用一个函数;您首先必须找出内核看到它在内存中的位置,然后调用它。当然,它会在内核模式下 运行 ,但这并不奇怪——理智的 OS 不会允许用户进程以这种方式改变内部函数调用。