在 linux 内核中拦截 ELF 加载程序:通过可加载内核模块 fs/binfmt_elf.c 文件
Intercept ELF loader in linux kernel: fs/binfmt_elf.c file via loadable kernel module
我是内核编码的新手,目前我正在使用 ELF 文件,为了安全起见,我对这些文件进行了一些修改,为此我需要查看其中的一些自定义部分 headers 并提取来自它的唯一代码加密密钥,用于 CPU 解密修改后的 ELF 的内容。
目前上述逻辑已经在内核源码树的fs/binfmt_elf.c
文件中的load_elf_binary
函数中实现了,不过我只需要改250行左右的代码重新编译整个内核,所以我希望通过将其实现为可加载内核模块(LKM)来即兴发挥此功能,以便每次加载 ELF 时,它都会检查它是否是修改后的 ELF,如果是,则提取密钥来自相应的部分。
编辑:总而言之,我正在考虑制作一个可加载的内核模块来读取 ELF 的各个部分并获取包含加密密钥和相关元数据的自定义部分的内容,并将这些值设置在 CPU 注册。
是的,可能,但绝对不容易。甚至还有一个受支持的内核工具 "kprobes",允许您从指定位置插入对您自己的代码的调用(请参阅 Documentation/kprobes.txt
)。如果插入对您自己的代码的调用是不够的,我认为您需要使用与 kprobe 相同的机制:通过将 jmp
s 或 call
s 的指令覆盖到您自己的代码中来修补所需的位置.
我曾经在一家公司工作,该公司的安全产品通过运行时修补 Windows 内核来安装其挂钩。这几乎是一回事,尽管至少 Windows 当时必须支持的版本数量有限。
所以,这绝对是可能的,但我不想尝试。它会很脆;你实际上是在试图击中一个移动的目标。每个内核安全补丁或版本升级都可能破坏您的代码。
我是内核编码的新手,目前我正在使用 ELF 文件,为了安全起见,我对这些文件进行了一些修改,为此我需要查看其中的一些自定义部分 headers 并提取来自它的唯一代码加密密钥,用于 CPU 解密修改后的 ELF 的内容。
目前上述逻辑已经在内核源码树的fs/binfmt_elf.c
文件中的load_elf_binary
函数中实现了,不过我只需要改250行左右的代码重新编译整个内核,所以我希望通过将其实现为可加载内核模块(LKM)来即兴发挥此功能,以便每次加载 ELF 时,它都会检查它是否是修改后的 ELF,如果是,则提取密钥来自相应的部分。
编辑:总而言之,我正在考虑制作一个可加载的内核模块来读取 ELF 的各个部分并获取包含加密密钥和相关元数据的自定义部分的内容,并将这些值设置在 CPU 注册。
是的,可能,但绝对不容易。甚至还有一个受支持的内核工具 "kprobes",允许您从指定位置插入对您自己的代码的调用(请参阅 Documentation/kprobes.txt
)。如果插入对您自己的代码的调用是不够的,我认为您需要使用与 kprobe 相同的机制:通过将 jmp
s 或 call
s 的指令覆盖到您自己的代码中来修补所需的位置.
我曾经在一家公司工作,该公司的安全产品通过运行时修补 Windows 内核来安装其挂钩。这几乎是一回事,尽管至少 Windows 当时必须支持的版本数量有限。
所以,这绝对是可能的,但我不想尝试。它会很脆;你实际上是在试图击中一个移动的目标。每个内核安全补丁或版本升级都可能破坏您的代码。