[英]Python Program Output to Named Pipe
I use a program (upx.exe) that compresses and extracts packed executables. 我使用一个程序(upx.exe)来压缩和提取打包的可执行文件。 When I decompress an executable the only option is to write a file.
当我解压缩可执行文件时,唯一的选择是写入文件。 I dont want the extracted code to touch the hard drive.
我不希望提取的代码接触硬盘驱动器。
So I thought about writing a python wrapper that starts the executable and reads the decompressed code from a named pipe. 因此,我想到了编写一个python包装程序来启动可执行文件并从命名管道读取解压缩的代码的想法。
I wanted to 我想
I tried the following: 我尝试了以下方法:
import win32pipe, win32file
import win32file
p = win32pipe.CreateNamedPipe(r'\\.\pipe\upx',
win32pipe.PIPE_ACCESS_DUPLEX,
win32pipe.PIPE_TYPE_MESSAGE | win32pipe.PIPE_WAIT,
1, 65536, 65536,300,None)
os.system("upx -d -o\\\\.\\pipe\\upx nbtscan-1.0.35.exe")
win32pipe.ConnectNamedPipe(p, None)
fileHandle = win32file.CreateFile(r'\\.\pipe\upx',
win32file.GENERIC_READ | win32file.GENERIC_WRITE,
0, None,
win32file.OPEN_EXISTING,
0, None)
data = win32file.ReadFile(fileHandle, 4096)
print data
This is what happens: 这是发生了什么:
I have no experience with named pipes and feel very desperate right now. 我没有命名管道的经验,现在感到非常绝望。 Perhaps you have an idea or a tutorial to give me some example.
也许您有一个想法或教程可以给我一些例子。 (The MSDN reference did not help me very much)
(MSDN参考对我没有太大帮助)
My code is based on this code , but when I use the "ConnectNamedPipe" function before the "system" call, the program just hangs and waits or some action on that pipe. 我的代码基于此代码 ,但是当我在“系统”调用之前使用“ ConnectNamedPipe”函数时,该程序只是挂起并在该管道上等待或执行某些操作。
Please help. 请帮忙。
I solved it this way: 我是这样解决的:
class Decompress(object):
# Maximum to read from the decompressed stream
maxsize = 2097152
data = ""
def __init__(self, application_path, type, filePath):
# UPX Decompression
if type == "UPX":
print "Checking UPX file %s" % filePath
try:
p = win32pipe.CreateNamedPipe(r'\\.\pipe\upx', win32pipe.PIPE_ACCESS_DUPLEX, win32pipe.PIPE_TYPE_MESSAGE | win32pipe.PIPE_WAIT, 1, 2097152, 2097152, 300, None)
phandle = p.handle
success, stdout, stderr = run_popen_with_timeout(application_path + r'tools\upx.exe -d --no-color --no-progress --no-backup -o\\.\pipe\upx ' + filePath, 3, "")
#print stdout
#print stderr
data = win32file.ReadFile(phandle, self.maxsize)
p.close()
#print "Read " + str(len(data[1])) + " bytes from decompressed EXE"
self.data = data[1]
#print self.data[:10]
except Exception, e:
traceback.print_exc()
def run_popen_with_timeout(command_string, timeout, input_data):
"""
Run a sub-program in subprocess.Popen, pass it the input_data,
kill it if the specified timeout has passed.
returns a tuple of success, stdout, stderr
"""
kill_check = threading.Event()
def _kill_process_after_a_timeout(pid):
os.kill(pid, signal.SIGTERM)
kill_check.set() # tell the main routine that we had to kill
# use SIGKILL if hard to kill...
return
p = Popen(command_string, stderr=STDOUT, stdout=PIPE)
#print p.communicate()[0]
print command_string
pid = p.pid
watchdog = threading.Timer(timeout, _kill_process_after_a_timeout, args=(pid, ))
watchdog.start()
(stdout, stderr) = p.communicate()
watchdog.cancel() # if it's still waiting to run
success = not kill_check.isSet()
kill_check.clear()
return (success, stdout, stderr)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.