如何修复我的“自我删除”.exe从早期删除自己?

时间:2011-05-20 19:52:36

标签: c++ python windows-xp alternate-data-stream

为了测试和个人概念证明,我有一个.exe文件,它只输出一个简单的字符串,然后调用系统暂停(在C ++中逐字地system("pause"))。

我有一个简单的Python脚本,我在Windows XP VM上进行测试,在搞乱时执行这些操作:

subprocess.call(r'echo Nothing special. > c:\blank.txt', shell=True)
subprocess.call(r'type pause.exe > c:\blank.txt:ads.exe', shell=True)
subprocess.call(r'start c:\blank.txt:ads.exe', shell=True)
subprocess.call(r'del c:\blank.txt', shell=True)

显然,这些命令在命令行上都可以正常运行,为什么它们在通过Python调用时不能正常工作?

我收到此弹出错误消息:

  

blank.txt:ads.exe遇到过   问题和需要关闭。我们是   很抱歉给您带来不便。

     

如果你在中间   什么,你的信息   工作可能会丢失。

该文件确实已删除。似乎系统暂停只是被删除命令压缩,当我希望弹出.exe,等待我按下回车,然后脚本将继续并删除文件。

3 个答案:

答案 0 :(得分:1)

每个subprocess.call(..., shell=True)都会立即返回,因为它们只是告诉shell执行命令。在命令行上,即使exe没有终止,调用exe使用start命令运行仍然会立即返回。 start立即返回,需要告知等待:

subprocess.call(r'echo Nothing special. > c:\blank.txt', shell=True)
subprocess.call(r'type pause.exe > c:\blank.txt:ads.exe', shell=True)
subprocess.call(r'start /wait c:\blank.txt:ads.exe', shell=True)
subprocess.call(r'del c:\blank.txt', shell=True)

答案 1 :(得分:1)

鉴于这些症状,我的理解是,只有在此可执行文件完成初始化后,您才能安全地删除此特定设置中的可执行文件(Windows XP,可能在特定的修补程序级别,当可执行文件来自备用流时)。如果在加载时删除了可执行文件,程序将崩溃。

在提示符下键入这些命令时,在运行start c:\blank.txt:ads.exedel c:\blank.txt之间会有一段时间,为程序提供足够的时间来完成加载。当您从脚本运行它们时,两者之间的间隔要短得多(start分支一个新进程,并且新程序的初始化异步发生)。初始化和删除之间存在竞争条件;哪一个获胜取决于删除的执行时间。

在删除文件之前尝试尝试延迟:

import subprocess, time
subprocess.call(r'echo Nothing special. > c:\blank.txt', shell=True)
subprocess.call(r'type pause.exe > c:\blank.txt:ads.exe', shell=True)
subprocess.call(r'start c:\blank.txt:ads.exe', shell=True)
time.sleep(42)  # 42 seconds is overkill, but the delay isn't predictable
subprocess.call(r'del c:\blank.txt', shell=True)

答案 2 :(得分:0)

windows shell start命令将在新shell中启动程序,然后继续。等待它完成使用call

subprocess.call(r'call c:\blank.txt:ads.exe', shell=True)