CreateProcess 杀死 PC

Posted

技术标签:

【中文标题】CreateProcess 杀死 PC【英文标题】:CreateProcess kills PC 【发布时间】:2014-06-10 16:21:17 【问题描述】:

我尝试编写一个小蛮力程序。密码程序在密码正确时返回 1,错误时返回 0。 所以很简单。

在蛮力程序中,我使用 createprocess() 调用 pw 程序。

我的问题是,当我尝试破解密码时,我的电脑变得非常慢,我必须重新启动。

这里是代码。

STARTUPINFO         siStartupInfo;
PROCESS_INFORMATION piProcessInfo;

memset(&siStartupInfo, 0, sizeof(siStartupInfo));
memset(&piProcessInfo, 0, sizeof(piProcessInfo));

siStartupInfo.cb = sizeof(siStartupInfo);
char newKey[10] = " ";
strcat(newKey, key);

if(CreateProcess("C:\\Users\\Christoph\\Dropbox\\test\\bin\\Debug\\test.exe",     // Application name
                 newKey,                 // Application arguments
                 0,
                 0,
                 FALSE,
                 CREATE_DEFAULT_ERROR_MODE,
                 0,
                 0,                              // Working directory
                 &siStartupInfo,
                 &piProcessInfo) == FALSE)

我必须自己杀死进程吗? 在最初的几秒钟内,我每秒获得超过 1k 个键。 你能帮帮我吗?

谢谢

【问题讨论】:

CreateProcess()没有问题。问题出在test.exe 是的,您应该限制允许运行的测试进程的数量。如果这是现实世界,我猜你只会有一个测试进程并通过启动参数以外的其他方式为其提供密码。 确定吗? test.exe 只是简单的 if 和 else 并返回一个 int。 创建进程是一项非常昂贵的操作。为每个键启动一个新进程会带来绝对糟糕的性能。 嗯我应该使用线程吗?但这不可能是唯一的问题。难道进程没有被杀死? 【参考方案1】:

在这里进行一些猜测,但是您是否正在清理最后一个参数的PROCESS_INFORMATION 结构中CreateProcess 返回给您的句柄?

hProcesshThread 句柄在不使用时需要关闭,否则会像内存泄漏一样泄漏句柄。

话虽如此,以蛮力方式为要尝试的每个密钥生成一个新进程是非常低效的。 CreateProcess 比较贵,不会给你合理的性能。

此外,这是我个人的观察,因此没有真正的证据支持这一点,我看到 Windows 在处理大量进程时遇到了麻烦。通过观察在新进程中生成每个选项卡的谷歌浏览器,我注意到系统变得相对缓慢,偶尔会出现系统范围的挂起。尤其是在 Chrome 的早期。

【讨论】:

是的,这是我的问题。谢谢。但是很慢。每秒只能获得大约 300 个密钥。在带有 fork 的 Ubuntu 上,我每秒获得 1000 个密钥。 @user281874 Fork 的工作方式与 CreateProcess 不同,但即便如此,fork 也不是真正的高性能。如果你想变得更认真,你应该看看多个线程。 但是如何在线程中启动外部程序呢?外部程序需要一个过程吗?我可以在没有 createprocess 的情况下运行外部程序吗? Shellscript 是更好的方法吗?谢谢 @user281874 最好的解决方案是将外部程序中的代码重新编写为您自己的代码。但是,如果这不是您的可执行文件并且您无权访问源代码,那么您确实只剩下CreateProcess,并且您无能为力。保持系统平稳运行的最佳方法是限制您启动的进程数量,并且仅在旧进程终止时启动新进程。 我有源,但我想模拟程序受密码保护。嗯,好吧,我试试 shellExecute 和 system() 也许性能会好一点。非常感谢

以上是关于CreateProcess 杀死 PC的主要内容,如果未能解决你的问题,请参考以下文章

CreateProcess() 不适用于 lpCurrentDirectory

CreateProcess 命令行参数

CreateProcess() C++ 文件未找到

CreateProcess() 无法正常工作

CreateProcess 和命令行参数

forking() 和 CreateProcess()