确保流程关闭

Ensure process closure

本文关键字:程关闭 确保      更新时间:2023-10-16

我有一个程序,它绝对需要能够在每次需要时成功关闭自己。

但我不知道该怎么做。

它在用户模式下运行,虽然我不知道该怎么做,但有人可能会阻止它从内核模式关闭,我想以某种方式防止这种情况发生。

是否有我可以调用的函数,或者我可以覆盖内存的某个部分,以确保我的进程退出?

当然,没有什么是愚蠢的,但我想知道你知道的最好的方法。

总结大量评论:

  • 如果您不能信任底层操作系统,则无法保证任何类型的用户模式行为;世界不是这样运转的。

  • 任何具有管理权限的外部程序都可以对您的代码运行调试器以暂停它,在那里它可以检查内存并窃取机密,更改程序代码,甚至注入一个新线程(至少在Windows上(来运行并在您的";真实的";代码运行。这是一个非常恶劣的工作环境。

  • 你说你不担心秘密被窃取,这很有帮助,所以当你决定停止时,你能做的最好的事情就是调用操作系统原语,让进程退出。用于退出当前程序的ExitProcess(),或在您自己的句柄上调用TerminateProcess()。如果这些不是确定的击杀,你几乎没有其他办法了。

我对volatile/atomic变量的建议更像是对一个荒谬前提的荒谬回应:如果你认为ExitProcess可能已经被钩住了,那么你可以把这个调用放在一个循环中,这样主代码就不会做任何真正的工作,即使它确实留在内存中。

// this is ridiculous
#include <atomic> // hat tip to @Scheff
extern atomic_bool shouldShutdown = false;
void checkShutdown(void)
{
// looping in case unicorns have hooked the OS
while (shouldShutdown) ExitProcess(1);
}

在每个线程的主循环顶部调用checkShutdown(),这样它至少会停止执行实际工作。

然而:尽管我喜欢大声思考有趣的问题,但这是一个完全荒谬的解决方案:如果ExitProcess不起作用,你将面对一个比你更想要它的对手,我同意@jwdonahue的观点,认为这是一种商业模式问题,而不是技术问题。

EDIT考虑到这一点,checkShutdown()不仅可以在检查变量时循环,而且可以递归地执行来破坏堆栈,这意味着所有线程最终都会被杀死。

感觉就像代码高尔夫:-(

此外,我不敢相信我还在考虑这个问题,我们真的需要在这个上下文中使用TerminateProcess而不是ExitProcess,因为后者的声明在<winnt.h>中用__declspec(noreturn)修饰,编译器知道它之外的代码是不可访问的,所以我们的一些疯狂的恶作剧可能会被优化掉。

void checkShutdown(void)
{
while (shouldShutdown) {
TerminateProcess(GetCurrentProcess(), 1);
checkShutdown();
}
}

这个递归调用可以被优化为迭代调用,这可能不是不可能的——它不是完全的尾递归,但很接近——但我不打算看那么多细节来解决它。