我设法通过查看 / 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,......也是。
答案 0 :(得分: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