拦截Linux内核中的ELF加载器:通过可加载的内核模块生成fs / binfmt_elf.c文件

baw*_*nal 5 c kernel elf kernel-module linux-kernel

我是内核编码的新手,目前正在使用ELF文件,出于安全性目的已对其进行了一些修改,为此,我需要查看其中的一些自定义节头,并从中提取唯一的代码加密密钥以用于安全性。 CPU解密修改后的ELF的内容。

目前,以上逻辑已在内核源代码树load_elf_binaryfs/binfmt_elf.c文件中的函数内实现,但是我只需要大约250行代码更改即可重新编译整个内核,因此我希望通过实现来临时实现此功能它作为可加载的内核模块(LKM),以便每次加载ELF时都会检查其是否为修改后的ELF,如果是,则从相应的部分中提取密钥。

编辑:总而言之,我正在寻找一个可加载的内核模块,以通读ELF的各个部分,并获取包含加密密钥和相关元数据的自定义部分的内容,并在CPU寄存器中设置这些值。

Gil*_*ton 3

是的,这是可能的,但绝对不容易。甚至还有一个受支持的内核工具“kprobes”,它允许您从指定位置插入对您自己的代码的调用(请参阅 参考资料Documentation/kprobes.txt)。如果插入对您自己的代码的调用还不够,我认为您需要使用与 kprobe 相同的机制:通过用jmps 或calls 覆盖指令到您自己的代码中来修补所需的位置。

我曾经在一家公司工作,该公司的安全产品通过对 Windows 内核进行运行时修补来安装其钩子。这几乎是同一件事,尽管至少在当时的 Windows 中,必须支持的版本数量是有限的。

所以,这绝对是可能的,但我不想尝试。它会非常脆;你实际上是在试图击中一个移动的目标。每个内核安全补丁或版本升级都可能会破坏您的代码。