【问题标题】:Removing a process from existence in Linux [closed]从Linux中删除一个进程[关闭]
【发布时间】:2013-03-10 13:52:41
【问题描述】:

如果有人要追求在 Linux 中编写内核模块的疯狂而危险的想法......

  • 在内核内部进程表中查找PID指定的进程
  • 从表中提取内存中进程的开始/结束地址
  • 用 0 覆盖此进程的所有内存

然后...

  • 这是一种立即终止任何进程的方法吗?
  • 这有多“不安全”?是否有可能完全不引起内核恐慌?

【问题讨论】:

  • 您会完全破坏进程(破坏其堆/堆栈/其他段),但由于您不会影响进程表(或 task_struct 等),因此内核不会不要认为它“已终止”。
  • 这将导致进程下次运行时出现 SIGILL(很可能)。而更简单的方法就是发送信号。
  • 也就是说,你为什么要问这个问题?这是“您面临的实际问题”吗?如果你想终止一个进程,为什么不直接发送SIGKILL
  • @Vimo:你能举个例子说明SIGKILL 不起作用吗?此外,如果这是您的实际问题,那么您可能应该围绕问题而不是可能的解决方案来提出问题。 (见What is the XY problem?
  • 如果进程挂在系统调用 (stackoverflow.com/questions/8600430/…) 中,则 SIGKILL 不起作用。但在这种情况下,你的“解决方案”也行不通。

标签: linux process kernel


【解决方案1】:

用零覆盖进程的代码(在 x86 中)很可能不会阻止进程执行,但由于这变成了一条普通指令,我认为 ADD EAX,[EAX],它会一直走到代码段的结尾[除非 EAX 指向无效内存]。显然,如果进程的寄存器被设置为一些无效的内存地址[在 64 位中,一个非规范的值将是好的,在 32 位中,一个写保护的东西,例如零],并且/或内存中充满了导致“无效操作码”的东西,那将是另一回事。

我真的不明白这怎么能比使用SIGKILL(又名KILL -9 pid)“更好”——如果进程在内核中被阻塞并且不知何故没有离开内核,覆盖将无济于事代码空间,因为该进程无论如何都没有运行该代码。如果内核中存在错误,那么您对进程的用户空间内存做了什么并不重要。修复内核错误!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 2020-06-15
    • 2011-10-12
    • 2016-04-09
    相关资源
    最近更新 更多