尝试读取内核地址值(task_struct)
写了这段代码:
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define addr 0xe6d63a80
extern int errno;
int main()
{
int i;
unsigned char *kmem;
unsigned char val;
int fd = open("/dev/kmem",O_RDWR|O_SYNC);
if(fd < 0)
{
printf("Can't open /dev/kmem\n");
return 1;
}
kmem = (unsigned char *) mmap(0, getpagesize(), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0xe6d63000);
if(kmem == NULL)
{
printf("Can't mmap\n");
return 1;
}
else
printf("kmem=%p\n",kmem);
return 0;
}
但它产生了:
kmem=0xffffffff
这看起来不像是指向内存值的有效指针。
如何阅读内核内存的内容?在这种情况下:0xe6d63a80。我知道task_struct在那里,因为我用调试器验证了它。
谢谢,
答案 0 :(得分:1)
那是mmap
返回-1。但是,您已经分配了值并且打印为无符号,这就是您看到0xffffffff
的原因。您应该检查mmap
返回和错误,然后检查errno
是否有原因。
kmem = (unsigned char *) mmap(0, getpagesize(), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0xe6d63000);
if (kmem == MAP_FAILED) {
perror("Error mapping memory");
return -1;
}
查看man page。