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()