【发布时间】:2011-01-27 00:11:09
【问题描述】:
我有一个可执行文件,它是批处理的一部分。这个可执行文件会打开一个控制台窗口,这很烦人,因为它对最终用户来说毫无用处,并且会从他们的活动任务中转移注意力。
我们无法从源代码(轻松)编译此 EXE 的新版本。有没有一种简单的方法可以在 PE 中调整此设置?
【问题讨论】:
我有一个可执行文件,它是批处理的一部分。这个可执行文件会打开一个控制台窗口,这很烦人,因为它对最终用户来说毫无用处,并且会从他们的活动任务中转移注意力。
我们无法从源代码(轻松)编译此 EXE 的新版本。有没有一种简单的方法可以在 PE 中调整此设置?
【问题讨论】:
找到了。
editbin.exe /subsystem:windows foo.exe
editbin.exe 是 MSVC 的一部分
【讨论】:
我是根据PE规范用python写的 http://msdn.microsoft.com/en-us/library/windows/hardware/gg463119.aspx
我不确定带有控制台|windows 子系统的 Windows EXE 二进制文件是否相同 入口点格式(具有相同的参数),但似乎是这样。
Python 代码:
import sys
import struct
if len(sys.argv) < 4:
print "Change Exe Run Mode Application by burlachenkok@gmail.com\nNot sufficient parametrs. 'exe_src_name.exe' 'exe_dest_name.exe' 'to_console' or 'to_windows'"
sys.exit(-1)
source = open(sys.argv[1], "rb")
dest = open(sys.argv[2], "w+b")
dest.write(source.read())
dest.seek(0x3c)
(PeHeaderOffset,)=struct.unpack("H", dest.read(2))
dest.seek(PeHeaderOffset)
(PeSignature,)=struct.unpack("I", dest.read(4))
if PeSignature != 0x4550:
print "Error in Find PE header"
dest.seek(PeHeaderOffset + 0x5C)
if sys.argv[3].strip() == "to_console":
# console mode
dest.write(struct.pack("H", 0x03))
elif sys.argv[3].strip() == "to_windows":
# window mode
dest.write(struct.pack("H", 0x02))
else:
print "Wrong Format: '" + sys.argv[3] + "'"
source.close()
dest.close()
print "Completed succesfully.."
【讨论】: