Extração de Histórico de Senhas Wi-Fi no Windows com Python

O utilitário de linha de comando netsh (Network Shell) presente no sistema operacional Windows permite a administração e o diagnóstico de configurações de rede. Por meio dele, é possível recuperar credenciais de redes sem fio salvas localmente na máquina.

Para listar todos os perfis de redes Wi-Fi às quais o dispositivo já se conectou, utiliza-se o seguinte comando:

netsh wlan show profiles

Para revelar a chave de segurança em texto claro de uma rede específica, deve-se adicionar o parâmetro key=clear ao comando de consulta detalhada:

netsh wlan show profile name="NOME_DA_REDE" key=clear

Executar esses comendos manualmente para cada rede é inviável quando há um grande volume de perfis salvos. A automação via Python resolve esse problema iterando sobre a lista de redes e extraindo as chaves correspondentes. O script abaixo utiliza abordagens modernas da linguagem, empregando subprocess.run e expressões regulares (re) para analisar a saída do console de forma robusta. A lógica foi projetada para identificar os padrões de texto independentemente de o sistema operacional estar configurado em português ou inglês. Além disso, a biblioteca pathlib é utilizada para manipular a criação de diretórios e arquivos de forma segura na Área de Trabalho do usuário.


import subprocess
import re
from pathlib import Path

def listar_perfis_wifi():
    """Executa o comando para obter a lista de redes salvas."""
    comando = ['netsh', 'wlan', 'show', 'profiles']
    try:
        resultado = subprocess.run(
            comando, 
            capture_output=True, 
            text=True, 
            encoding='cp850', 
            errors='ignore'
        )
        # Tenta encontrar o padrão em português, com fallback para inglês
        perfis = re.findall(r'Todos os Perfis de Usuários\s*:\s*(.+)', resultado.stdout)
        if not perfis:
            perfis = re.findall(r'All User Profile\s*:\s*(.+)', resultado.stdout)
            
        return [perfil.strip() for perfil in perfis]
    except Exception as e:
        print(f"Falha ao listar redes: {e}")
        return []

def obter_senha_rede(nome_rede):
    """Obtém a senha em texto claro de um perfil específico."""
    comando = ['netsh', 'wlan', 'show', 'profile', f'name={nome_rede}', 'key=clear']
    try:
        resultado = subprocess.run(
            comando, 
            capture_output=True, 
            text=True, 
            encoding='cp850', 
            errors='ignore'
        )
        # Busca por "Conteúdo da Chave" (PT-BR) ou "Key Content" (EN)
        match = re.search(r'Conteúdo da Chave\s*:\s*(.+)', resultado.stdout)
        if not match:
            match = re.search(r'Key Content\s*:\s*(.+)', resultado.stdout)
            
        return match.group(1).strip() if match else None
    except Exception:
        return None

def exportar_relatorio(dados):
    """Salva os dados coletados em um arquivo na Área de Trabalho."""
    diretorio_destino = Path.home() / 'Desktop' / 'Relatorio_Senhas_WiFi'
    diretorio_destino.mkdir(parents=True, exist_ok=True)
    
    arquivo_saida = diretorio_destino / 'credenciais.txt'
    with open(arquivo_saida, 'w', encoding='utf-8') as arquivo:
        arquivo.write('\n'.join(dados))
        
    print(f"Extração concluída. Arquivo salvo em: {arquivo_saida}")

def main():
    redes_encontradas = listar_perfis_wifi()
    relatorio = []

    for rede in redes_encontradas:
        senha = obter_senha_rede(rede)
        if senha:
            relatorio.append(f"[{rede:<30}] Senha: {senha}")
        else:
            relatorio.append(f"[{rede:<30}] Senha: [Não encontrada ou rede aberta]")

    if relatorio:
        exportar_relatorio(relatorio)
    else:
        print("Nenhuma rede Wi-Fi encontrada no histórico.")

if __name__ == '__main__':
    main()

Tags: Python Windows netsh subprocess redes

Publicado em 7-4 19:07