Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 无法访问系统调用表_Android_Linux_Linux Kernel - Fatal编程技术网

Android 无法访问系统调用表

Android 无法访问系统调用表,android,linux,linux-kernel,Android,Linux,Linux Kernel,我通过查看/proc/kallsyms找到了sys\u call\u表的地址。我有以下代码: void **sys_call_table; #include <linux/kernel.h> #include <asm/unistd.h> void Java_com_example_testlib_LibLoader_test() { sys_call_table = (void *) 0xc023cd28; LOGD("backup original

我通过查看/proc/kallsyms找到了sys\u call\u表的地址。我有以下代码:

void **sys_call_table;

#include <linux/kernel.h>
#include <asm/unistd.h>

void Java_com_example_testlib_LibLoader_test() {
    sys_call_table = (void *) 0xc023cd28;
    LOGD("backup original sys_open %p", sys_call_table[__NR_open]);
}
问题是,该代码导致致命信号异常,为什么尝试获取sys\u call\u table条目sys\u call\u table[\uu\u NR\u open]
我尝试获取条目0、1、2。。。还有。

好的,答案就像Crhis说的,你不能从用户模式程序修改内核

我将它编译为一个LKM,并使用insmod命令加载它,它运行正常

PS:我还发现只有LKM模块可以读取/proc/kallsyms。由于安卓4.1的内核补丁,用户空间程序不再这样做/proc/sys/kernel/kptr_restrict的引入是为了避免内核地址泄漏

现在为了让用户空间程序看到kallsym地址,我们可以将kptr_restrict设置为0或1

echo 1 > /proc/sys/kernel/kptr_restrict
信息可在此处找到:


这里:

您不能从用户模式程序修改内核!这不仅会打破内核与用户空间的整个安全和组织概念,寻址方案往往不一样,需要转换地址。但操作系统如何保护其内存免受用户空间程序的影响?我对这个机制很感兴趣,它是通过使用处理器和内存管理单元的硬件特性来实现的——简单地说,处理器标志中可能有一个内核模式位。当然,除了缺乏这一点的处理器;如果一个多用户操作系统被移植到其中一个,它可能只会假装有这样的机制,而不会对行为不端的程序进行实际的强制执行。或者,代码可以在虚拟机中运行,当决定是否执行某项操作时,虚拟机将强制执行规则。