2013-11-29 5 views
0

Я использую программу (upx.exe), которая сжимает и извлекает упакованные исполняемые файлы. Когда я распаковываю исполняемый файл, единственным вариантом является запись файла. Я не хочу, чтобы извлеченный код касался жесткого диска.

Итак, я подумал о написании оболочки python, которая запускает исполняемый файл и читает декомпрессированный код из именованного канала.

Я хотелВыход программы Python для именованной трубы

  1. создать именованный канал в питоне,
  2. пусть внешняя программа использовать эту трубу в качестве выходного файла и
  3. читать содержимое, которое было написано в эту трубу в строку ,

Я попытался следующие:

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 

Это то, что происходит:

enter image description here

У меня нет опыта работы с именованными каналами и чувствовать себя очень отчаянный прямо сейчас. Возможно, у вас есть идея или учебник, чтобы привести мне пример. (Ссылка MSDN мне очень не помогла)
Мой код основан на this code, но когда я использую функцию «ConnectNamedPipe» перед «системным» вызовом, программа просто зависает и ждет или какое-то действие на этом канале.
Пожалуйста, помогите.

ответ

0

Я решил это так:

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) 
Смежные вопросы