Как я могу поставить флажок в Win32 PE, который управляет отображением окна консоли - PullRequest
4 голосов
/ 12 марта 2010

У меня есть исполняемый файл, который является частью пакетного процесса. Этот исполняемый файл открывает консольное окно, что раздражает, поскольку он бесполезен для конечного пользователя, и отвлекает внимание от его активной задачи.

Мы не можем скомпилировать новую версию этого EXE-файла из исходного кода (легко). Есть ли простой способ изменить эту настройку в PE?

Ответы [ 2 ]

11 голосов
/ 13 марта 2010

Нашли.

editbin.exe /subsystem:windows foo.exe

editbin.exe является частью MSVC

5 голосов
/ 11 февраля 2013

Я написал его с помощью Python на основе спецификации PE http://msdn.microsoft.com/en-us/library/windows/hardware/gg463119.aspx

Я не уверен, что бинарные файлы Windows EXE с подсистемой console | windows имеют одинаковые Формат точки входа (с теми же аргументами), но кажется, что это так.

Код 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.."
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...