使用/ dev / kmem从内核读取地址值

时间:2018-01-21 18:42:42

标签: c linux memory linux-kernel

尝试读取内核地址值(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在那里,因为我用调试器验证了它。

谢谢,

1 个答案:

答案 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