乐趣区

关于安全:内核调试

查看符号表

编译好的内核的符号表通常保留 vmlinux 中,符号表通过 nm 查看
nm -g vmlinux

把符号表加载进去,就能够通过 kasan 的报错信息看源码出错的信息

编写一个内核模块

编写一个内核模块 test.c,该模块作用是判断 CPU 是否反对 intel pt

#include <linux/module.h>
#include <asm/nmi.h>
#include <asm/page.h>
#include <asm/msr.h>
#include <asm/cpufeature.h>
#include <linux/kernel.h>
#include <linux/printk.h>

unsigned a, b, c, d;
#define BIT(x) (1ULL << (x))
#define PRINT_ERROR(msg) printk(KERN_INFO "[VMX-PT] Error:\t%s\n", (msg))

int init_module(void)
{cpuid_count(0x07, 0, &a, &b, &c, &d);
    // 判断是否反对 Intel PT 技术的逻辑是,查看 CPUID 指令返回的寄存器 EBX 的第 25 位是否为 1,如果为 0,则示意不反对 Intel PT 技术
    if ((b & BIT(25)) == 0) {PRINT_ERROR("No PT support!");
        return -EIO;
    }
}

void cleanup_module(void)
{PRINT_ERROR("module unloaded!");
}

Makefile

obj-m += test.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

make 后生成 test.ko 文件, 用 insmod 加载内核文件
sudo insmod test.ko
卸载模块能够应用
sudo rmmod mymodule
如果模块卸载胜利,能够应用 lsmod 命令查看已加载的模块列表,应该不再蕴含该模块。应用 dmesg 查看内核输入

退出移动版