简体   繁体   English

Python程序输出到命名管道

[英]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 我想

  1. create a named pipe in python, 在python中创建一个命名管道,
  2. let the external program use that pipe as an output file and 让外部程序使用该管道作为输出文件,然后
  3. read the content that has been written to that pipe into a string. 将已写入该管道的内容读入字符串。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM