如果有人要追求在 Linux 中编写内核模块的疯狂而危险的想法...
- 在内核的内部进程表中查找由 PID 指定的进程
- 从表中提取内存中进程的开始/结束地址
- 用 0 覆盖此进程的所有内存
然后 ...
- 这会是一种立即终止任何进程的方法吗?
- 这会有多“不安全”?是否有可能完全不引起内核恐慌?
用零覆盖进程的代码(在 x86 中)很可能不会阻止进程执行,但由于这变成了一条普通指令,我认为 ADD EAX,[EAX],它会一直走到结束代码段 [除非 EAX 指向无效内存]。显然,如果进程的寄存器被设置为一些无效的内存地址[在 64 位中,一个非规范的值将是好的,在 32 位中,一个写保护的东西,例如零],并且/或内存中充满了导致“无效操作码”的东西,那将是另一回事。
我真的不明白这怎么能比使用SIGKILL
(aka KILL -9 pid
) “更好” - 如果进程在内核内部被阻塞并且以某种方式没有离开内核,那么覆盖代码空间将无济于事,因为进程是无论如何都不会运行该代码。如果内核中存在错误,那么您对进程的用户空间内存做了什么并不重要。修复内核错误!