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

6
我是新手内核编码员,目前正在处理已经为安全目的稍作修改的ELF文件。我需要查看其中一些自定义节头并从中提取唯一的代码加密密钥,以便CPU解密修改后的ELF内容。
目前,上述逻辑已在内核源树中的fs/binfmt_elf.c文件中的load_elf_binary函数中实现,但仅涉及大约250行代码更改,因此我希望通过将其实现为可加载内核模块(LKM)来改进此功能,以便每次加载ELF时都会检查它是否是修改后的ELF,如果是,则从相应的部分提取密钥。
编辑:总之,我正在寻找制作可加载内核模块的方法,以读取ELF的各个部分并获取包含加密密钥和相关元数据的自定义部分的内容,并将这些值设置在CPU寄存器中。
1个回答

3
是的,这是“可能”的,但绝对不容易。甚至有一个支持的内核设施“kprobes”,允许您从指定位置插入到自己的代码(请参阅“Documentation/kprobes.txt”)。如果插入调用到自己的代码是不够的,则需要使用与kprobe相同的机制:通过将 jmp call 指令覆盖为自己的代码来修补所需位置。
我曾在一家公司工作,其安全产品通过运行时修补Windows内核来安装其钩子。这基本上是相同的事情,尽管当时Windows只有有限个版本需要支持。
因此,这是肯定可以做到的,但我不想尝试。它会非常脆弱;实际上您在尝试击中一个移动的目标。每个内核安全补丁或版本升级都可能破坏您的代码。

谢谢,我已经阅读了 Docuementation/kprobes.txt,因为我正在通过这个内核模块设置一些 CPU 寄存器的值,所以我想 kretprobe 应该是最好的选择,对吧? - bawejakunal
kretprobe 无法改变原始代码的行为,只能输出一些内容,我认为。 - WindChaser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接