1

我设法通过查看/proc/kallsyms找到了sys_call_table的地址。我有以下代码:

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]);
}

问题是代码导致Fatal Signal Exeption为什么尝试获取sys_call_table 条目 sys_call_table[__NR_open]
我也尝试获取条目 0、1、2,...。

4

1 回答 1

0

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

我将它编译为 LKM 并使用insmod命令加载它并且它工作

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

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

echo 1 > /proc/sys/kernel/kptr_restrict

信息可以在这里找到: https ://blog.duosecurity.com/2012/07/exploit-mitigations-in-android-jelly-bean-4-1/

在这里:http: //insitusec.blogspot.sg/2013/01/kallsyms-on-android.html

于 2012-09-06T03:42:15.587 回答