moriarty-project 0.1.22__py3-none-any.whl → 0.1.24__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- moriarty/__init__.py +1 -1
- moriarty/cli/app.py +4 -3
- moriarty/cli/domain_cmd.py +5 -1
- moriarty/modules/directory_fuzzer.py +25 -5
- moriarty/modules/web_crawler.py +448 -91
- {moriarty_project-0.1.22.dist-info → moriarty_project-0.1.24.dist-info}/METADATA +3 -3
- {moriarty_project-0.1.22.dist-info → moriarty_project-0.1.24.dist-info}/RECORD +9 -27
- moriarty/modules/wifippler/__init__.py +0 -92
- moriarty/modules/wifippler/cli/__init__.py +0 -8
- moriarty/modules/wifippler/cli/commands.py +0 -123
- moriarty/modules/wifippler/core/__init__.py +0 -94
- moriarty/modules/wifippler/core/attacks/__init__.py +0 -146
- moriarty/modules/wifippler/core/attacks/deauth.py +0 -262
- moriarty/modules/wifippler/core/attacks/handshake.py +0 -402
- moriarty/modules/wifippler/core/attacks/pmkid.py +0 -424
- moriarty/modules/wifippler/core/attacks/wep.py +0 -467
- moriarty/modules/wifippler/core/attacks/wpa.py +0 -446
- moriarty/modules/wifippler/core/attacks/wps.py +0 -474
- moriarty/modules/wifippler/core/models/__init__.py +0 -10
- moriarty/modules/wifippler/core/models/network.py +0 -240
- moriarty/modules/wifippler/core/scanner.py +0 -903
- moriarty/modules/wifippler/core/utils/__init__.py +0 -624
- moriarty/modules/wifippler/core/utils/exec.py +0 -182
- moriarty/modules/wifippler/core/utils/network.py +0 -262
- moriarty/modules/wifippler/core/utils/system.py +0 -153
- {moriarty_project-0.1.22.dist-info → moriarty_project-0.1.24.dist-info}/WHEEL +0 -0
- {moriarty_project-0.1.22.dist-info → moriarty_project-0.1.24.dist-info}/entry_points.txt +0 -0
@@ -1,182 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
Módulo de execução de comandos para o WiFiPPLER.
|
3
|
-
|
4
|
-
Fornece funções para execução segura de comandos de sistema.
|
5
|
-
"""
|
6
|
-
import asyncio
|
7
|
-
import shlex
|
8
|
-
import logging
|
9
|
-
import subprocess
|
10
|
-
from typing import List, Optional, Union, Dict, Any, Tuple
|
11
|
-
|
12
|
-
logger = logging.getLogger(__name__)
|
13
|
-
|
14
|
-
def run_command(
|
15
|
-
cmd: Union[str, List[str]],
|
16
|
-
capture_output: bool = False,
|
17
|
-
check: bool = True,
|
18
|
-
**kwargs
|
19
|
-
) -> subprocess.CompletedProcess:
|
20
|
-
"""Executa um comando no shell com tratamento de erros.
|
21
|
-
|
22
|
-
Args:
|
23
|
-
cmd: Comando a ser executado (string ou lista)
|
24
|
-
capture_output: Se deve capturar a saída padrão e de erro
|
25
|
-
check: Se deve lançar uma exceção em caso de código de saída diferente de zero
|
26
|
-
**kwargs: Argumentos adicionais para subprocess.run()
|
27
|
-
|
28
|
-
Returns:
|
29
|
-
subprocess.CompletedProcess: Resultado da execução do comando
|
30
|
-
|
31
|
-
Raises:
|
32
|
-
subprocess.CalledProcessError: Se check=True e o comando retornar código de saída não zero
|
33
|
-
"""
|
34
|
-
# Configura os argumentos padrão
|
35
|
-
kwargs.setdefault('stdout', subprocess.PIPE if capture_output else None)
|
36
|
-
kwargs.setdefault('stderr', subprocess.PIPE if capture_output else None)
|
37
|
-
kwargs.setdefault('text', True)
|
38
|
-
|
39
|
-
# Converte o comando para lista se for string
|
40
|
-
if isinstance(cmd, str):
|
41
|
-
cmd = shlex.split(cmd)
|
42
|
-
|
43
|
-
# Executa o comando
|
44
|
-
try:
|
45
|
-
logger.debug(f"Executando comando: {' '.join(cmd)}")
|
46
|
-
result = subprocess.run(cmd, check=check, **kwargs)
|
47
|
-
return result
|
48
|
-
except subprocess.CalledProcessError as e:
|
49
|
-
logger.error(f"Erro ao executar comando: {e}")
|
50
|
-
if capture_output:
|
51
|
-
logger.error(f"Saída de erro: {e.stderr}")
|
52
|
-
raise
|
53
|
-
except Exception as e:
|
54
|
-
logger.error(f"Erro inesperado ao executar comando: {e}")
|
55
|
-
raise
|
56
|
-
|
57
|
-
async def run_command_async(
|
58
|
-
cmd: Union[str, List[str]],
|
59
|
-
**kwargs
|
60
|
-
) -> subprocess.CompletedProcess:
|
61
|
-
"""Executa um comando de forma assíncrona.
|
62
|
-
|
63
|
-
Args:
|
64
|
-
cmd: Comando a ser executado (string ou lista)
|
65
|
-
**kwargs: Argumentos adicionais para asyncio.create_subprocess_exec()
|
66
|
-
|
67
|
-
Returns:
|
68
|
-
subprocess.CompletedProcess: Resultado da execução do comando
|
69
|
-
"""
|
70
|
-
# Converte o comando para lista se for string
|
71
|
-
if isinstance(cmd, str):
|
72
|
-
cmd = shlex.split(cmd)
|
73
|
-
|
74
|
-
# Configura os argumentos padrão
|
75
|
-
kwargs.setdefault('stdout', subprocess.PIPE)
|
76
|
-
kwargs.setdefault('stderr', subprocess.PIPE)
|
77
|
-
kwargs.setdefault('text', True)
|
78
|
-
|
79
|
-
logger.debug(f"Executando comando assíncrono: {' '.join(cmd)}")
|
80
|
-
|
81
|
-
try:
|
82
|
-
# Cria o processo assíncrono
|
83
|
-
process = await asyncio.create_subprocess_exec(
|
84
|
-
cmd[0],
|
85
|
-
*cmd[1:],
|
86
|
-
**kwargs
|
87
|
-
)
|
88
|
-
|
89
|
-
# Aguarda a conclusão do processo
|
90
|
-
stdout, stderr = await process.communicate()
|
91
|
-
|
92
|
-
# Cria um objeto CompletedProcess com o resultado
|
93
|
-
return subprocess.CompletedProcess(
|
94
|
-
args=cmd,
|
95
|
-
returncode=process.returncode,
|
96
|
-
stdout=stdout,
|
97
|
-
stderr=stderr
|
98
|
-
)
|
99
|
-
except Exception as e:
|
100
|
-
logger.error(f"Erro ao executar comando assíncrono: {e}")
|
101
|
-
raise
|
102
|
-
|
103
|
-
def run_sudo_command(
|
104
|
-
cmd: Union[str, List[str]],
|
105
|
-
password: Optional[str] = None,
|
106
|
-
**kwargs
|
107
|
-
) -> subprocess.CompletedProcess:
|
108
|
-
"""Executa um comando com privilégios de superusuário.
|
109
|
-
|
110
|
-
Args:
|
111
|
-
cmd: Comando a ser executado (sem o 'sudo')
|
112
|
-
password: Senha do usuário (opcional, pode ser solicitada interativamente)
|
113
|
-
**kwargs: Argumentos adicionais para run_command()
|
114
|
-
|
115
|
-
Returns:
|
116
|
-
subprocess.CompletedProcess: Resultado da execução do comando
|
117
|
-
"""
|
118
|
-
if isinstance(cmd, str):
|
119
|
-
cmd = shlex.split(cmd)
|
120
|
-
|
121
|
-
# Adiciona o sudo ao início do comando
|
122
|
-
sudo_cmd = ['sudo']
|
123
|
-
|
124
|
-
# Se uma senha for fornecida, usa o -S para ler do stdin
|
125
|
-
if password is not None:
|
126
|
-
sudo_cmd.extend(['-S'])
|
127
|
-
|
128
|
-
sudo_cmd.extend(cmd)
|
129
|
-
|
130
|
-
# Se uma senha for fornecida, envia pelo stdin
|
131
|
-
if password is not None:
|
132
|
-
kwargs['input'] = f"{password}\n"
|
133
|
-
|
134
|
-
return run_command(sudo_cmd, **kwargs)
|
135
|
-
|
136
|
-
def command_success(cmd: str) -> bool:
|
137
|
-
"""Verifica se um comando é executado com sucesso.
|
138
|
-
|
139
|
-
Args:
|
140
|
-
cmd: Comando a ser verificado
|
141
|
-
|
142
|
-
Returns:
|
143
|
-
bool: True se o comando for executado com sucesso, False caso contrário
|
144
|
-
"""
|
145
|
-
try:
|
146
|
-
run_command(cmd, capture_output=True, check=True)
|
147
|
-
return True
|
148
|
-
except subprocess.CalledProcessError:
|
149
|
-
return False
|
150
|
-
|
151
|
-
def get_command_output(cmd: Union[str, List[str]], **kwargs) -> str:
|
152
|
-
"""Executa um comando e retorna sua saída padrão.
|
153
|
-
|
154
|
-
Args:
|
155
|
-
cmd: Comando a ser executado
|
156
|
-
**kwargs: Argumentos adicionais para run_command()
|
157
|
-
|
158
|
-
Returns:
|
159
|
-
str: Saída padrão do comando
|
160
|
-
|
161
|
-
Raises:
|
162
|
-
subprocess.CalledProcessError: Se o comando retornar código de saída não zero
|
163
|
-
"""
|
164
|
-
kwargs['capture_output'] = True
|
165
|
-
result = run_command(cmd, **kwargs)
|
166
|
-
return result.stdout.strip()
|
167
|
-
|
168
|
-
def get_command_output_safe(cmd: Union[str, List[str]], default: str = "", **kwargs) -> str:
|
169
|
-
"""Executa um comando e retorna sua saída padrão ou um valor padrão em caso de erro.
|
170
|
-
|
171
|
-
Args:
|
172
|
-
cmd: Comando a ser executado
|
173
|
-
default: Valor padrão a ser retornado em caso de erro
|
174
|
-
**kwargs: Argumentos adicionais para run_command()
|
175
|
-
|
176
|
-
Returns:
|
177
|
-
str: Saída padrão do comando ou o valor padrão em caso de erro
|
178
|
-
"""
|
179
|
-
try:
|
180
|
-
return get_command_output(cmd, **kwargs)
|
181
|
-
except (subprocess.CalledProcessError, FileNotFoundError):
|
182
|
-
return default
|
@@ -1,262 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
Módulo de utilidades de rede para o WiFiPPLER.
|
3
|
-
|
4
|
-
Fornece funções para manipulação de interfaces de rede, endereçamento e operações relacionadas.
|
5
|
-
"""
|
6
|
-
import os
|
7
|
-
import re
|
8
|
-
import socket
|
9
|
-
import fcntl
|
10
|
-
import struct
|
11
|
-
import array
|
12
|
-
import platform
|
13
|
-
from typing import Dict, List, Optional, Union, Any
|
14
|
-
|
15
|
-
# Constantes para chamadas de sistema
|
16
|
-
SIOCGIFHWADDR = 0x8927 # Get hardware address
|
17
|
-
SIOCGIFADDR = 0x8915 # Get IP address
|
18
|
-
SIOCGIFNETMASK = 0x891B # Get netmask
|
19
|
-
SIOCGIFBRDADDR = 0x8919 # Get broadcast address
|
20
|
-
SIOCGIFMTU = 0x8921 # Get MTU
|
21
|
-
SIOCGIFINDEX = 0x8933 # Get interface index
|
22
|
-
SIOCGIFNAME = 0x8910 # Get interface name
|
23
|
-
SIOCGIFFLAGS = 0x8913 # Get interface flags
|
24
|
-
SIOCSIFFLAGS = 0x8914 # Set interface flags
|
25
|
-
|
26
|
-
# Flags de interface
|
27
|
-
IFF_UP = 0x1
|
28
|
-
IFF_BROADCAST = 0x2
|
29
|
-
IFF_DEBUG = 0x4
|
30
|
-
IFF_LOOPBACK = 0x8
|
31
|
-
IFF_POINTOPOINT = 0x10
|
32
|
-
IFF_NOTRAILERS = 0x20
|
33
|
-
IFF_RUNNING = 0x40
|
34
|
-
IFF_NOARP = 0x80
|
35
|
-
IFF_PROMISC = 0x100
|
36
|
-
IFF_ALLMULTI = 0x200
|
37
|
-
IFF_MASTER = 0x400
|
38
|
-
IFF_SLAVE = 0x800
|
39
|
-
IFF_MULTICAST = 0x1000
|
40
|
-
IFF_PORTSEL = 0x2000
|
41
|
-
IFF_AUTOMEDIA = 0x4000
|
42
|
-
IFF_DYNAMIC = 0x8000
|
43
|
-
IFF_LOWER_UP = 0x10000
|
44
|
-
IFF_DORMANT = 0x20000
|
45
|
-
IFF_ECHO = 0x40000
|
46
|
-
|
47
|
-
def get_interface_mac(interface: str) -> Optional[str]:
|
48
|
-
"""Obtém o endereço MAC de uma interface de rede.
|
49
|
-
|
50
|
-
Args:
|
51
|
-
interface: Nome da interface de rede
|
52
|
-
|
53
|
-
Returns:
|
54
|
-
str: Endereço MAC formatado ou None se não encontrado
|
55
|
-
"""
|
56
|
-
try:
|
57
|
-
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
58
|
-
info = fcntl.ioctl(s.fileno(), SIOCGIFHWADDR, struct.pack('256s', interface[:15].encode('utf-8')))
|
59
|
-
return ':'.join(f'{b:02x}' for b in info[18:24])
|
60
|
-
except (IOError, OSError):
|
61
|
-
return None
|
62
|
-
|
63
|
-
def get_interface_ip(interface: str) -> Optional[str]:
|
64
|
-
"""Obtém o endereço IP de uma interface de rede.
|
65
|
-
|
66
|
-
Args:
|
67
|
-
interface: Nome da interface de rede
|
68
|
-
|
69
|
-
Returns:
|
70
|
-
str: Endereço IP ou None se não encontrado
|
71
|
-
"""
|
72
|
-
try:
|
73
|
-
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
74
|
-
return socket.inet_ntoa(fcntl.ioctl(
|
75
|
-
s.fileno(),
|
76
|
-
SIOCGIFADDR,
|
77
|
-
struct.pack('256s', interface[:15].encode('utf-8'))
|
78
|
-
)[20:24])
|
79
|
-
except (IOError, OSError):
|
80
|
-
return None
|
81
|
-
|
82
|
-
def get_interface_netmask(interface: str) -> Optional[str]:
|
83
|
-
"""Obtém a máscara de rede de uma interface.
|
84
|
-
|
85
|
-
Args:
|
86
|
-
interface: Nome da interface de rede
|
87
|
-
|
88
|
-
Returns:
|
89
|
-
str: Máscara de rede ou None se não encontrada
|
90
|
-
"""
|
91
|
-
try:
|
92
|
-
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
93
|
-
return socket.inet_ntoa(fcntl.ioctl(
|
94
|
-
s.fileno(),
|
95
|
-
SIOCGIFNETMASK,
|
96
|
-
struct.pack('256s', interface[:15].encode('utf-8'))
|
97
|
-
)[20:24])
|
98
|
-
except (IOError, OSError):
|
99
|
-
return None
|
100
|
-
|
101
|
-
def get_interface_gateway(interface: str) -> Optional[str]:
|
102
|
-
"""Obtém o gateway padrão de uma interface.
|
103
|
-
|
104
|
-
Args:
|
105
|
-
interface: Nome da interface de rede
|
106
|
-
|
107
|
-
Returns:
|
108
|
-
str: Endereço do gateway ou None se não encontrado
|
109
|
-
"""
|
110
|
-
try:
|
111
|
-
# Lê a tabela de roteamento
|
112
|
-
with open('/proc/net/route') as f:
|
113
|
-
for line in f:
|
114
|
-
fields = line.strip().split()
|
115
|
-
if len(fields) >= 2 and fields[0] == interface and fields[1] == '00000000':
|
116
|
-
# Converte o endereço hex para IP
|
117
|
-
return socket.inet_ntoa(struct.pack('<L', int(fields[2], 16)))
|
118
|
-
except (IOError, OSError):
|
119
|
-
pass
|
120
|
-
return None
|
121
|
-
|
122
|
-
def is_wireless_interface(interface: str) -> bool:
|
123
|
-
"""Verifica se uma interface é sem fio.
|
124
|
-
|
125
|
-
Args:
|
126
|
-
interface: Nome da interface de rede
|
127
|
-
|
128
|
-
Returns:
|
129
|
-
bool: True se for uma interface sem fio, False caso contrário
|
130
|
-
"""
|
131
|
-
# Verifica se a interface existe em /sys/class/net/
|
132
|
-
if not os.path.exists(f'/sys/class/net/{interface}'):
|
133
|
-
return False
|
134
|
-
|
135
|
-
# Verifica se é uma interface wireless
|
136
|
-
wireless_path = f'/sys/class/net/{interface}/wireless'
|
137
|
-
return os.path.exists(wireless_path)
|
138
|
-
|
139
|
-
def get_wireless_interfaces() -> List[Dict[str, Any]]:
|
140
|
-
"""Obtém uma lista de interfaces de rede sem fio.
|
141
|
-
|
142
|
-
Returns:
|
143
|
-
List[Dict[str, Any]]: Lista de dicionários com informações das interfaces
|
144
|
-
"""
|
145
|
-
interfaces = []
|
146
|
-
|
147
|
-
# Lista todos os diretórios em /sys/class/net
|
148
|
-
for iface in os.listdir('/sys/class/net'):
|
149
|
-
if is_wireless_interface(iface):
|
150
|
-
interfaces.append({
|
151
|
-
'name': iface,
|
152
|
-
'mac': get_interface_mac(iface),
|
153
|
-
'ip': get_interface_ip(iface),
|
154
|
-
'wireless': True,
|
155
|
-
'up': is_interface_up(iface),
|
156
|
-
'mtu': get_interface_mtu(iface)
|
157
|
-
})
|
158
|
-
|
159
|
-
return interfaces
|
160
|
-
|
161
|
-
def is_interface_up(interface: str) -> bool:
|
162
|
-
"""Verifica se uma interface de rede está ativa.
|
163
|
-
|
164
|
-
Args:
|
165
|
-
interface: Nome da interface de rede
|
166
|
-
|
167
|
-
Returns:
|
168
|
-
bool: True se a interface estiver ativa, False caso contrário
|
169
|
-
"""
|
170
|
-
try:
|
171
|
-
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
172
|
-
flags = struct.unpack('H', fcntl.ioctl(
|
173
|
-
s.fileno(),
|
174
|
-
SIOCGIFFLAGS,
|
175
|
-
struct.pack('256s', interface[:15].encode('utf-8'))
|
176
|
-
)[16:18])[0]
|
177
|
-
return bool(flags & IFF_UP)
|
178
|
-
except (IOError, OSError):
|
179
|
-
return False
|
180
|
-
|
181
|
-
def get_interface_mtu(interface: str) -> int:
|
182
|
-
"""Obtém o MTU de uma interface de rede.
|
183
|
-
|
184
|
-
Args:
|
185
|
-
interface: Nome da interface de rede
|
186
|
-
|
187
|
-
Returns:
|
188
|
-
int: Valor do MTU ou 1500 (padrão) se não for possível obter
|
189
|
-
"""
|
190
|
-
try:
|
191
|
-
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
192
|
-
ifreq = struct.pack('256s', interface.encode('utf-8')[:15])
|
193
|
-
mtu = fcntl.ioctl(s.fileno(), SIOCGIFMTU, ifreq)
|
194
|
-
return struct.unpack('H', mtu[16:18])[0]
|
195
|
-
except (IOError, OSError, struct.error):
|
196
|
-
return 1500 # Valor padrão para MTU
|
197
|
-
|
198
|
-
|
199
|
-
def get_network_interfaces() -> List[Dict[str, Any]]:
|
200
|
-
"""Obtém uma lista de todas as interfaces de rede.
|
201
|
-
|
202
|
-
Returns:
|
203
|
-
List[Dict[str, Any]]: Lista de dicionários com informações das interfaces
|
204
|
-
"""
|
205
|
-
interfaces = []
|
206
|
-
|
207
|
-
try:
|
208
|
-
# Lista todos os diretórios em /sys/class/net
|
209
|
-
for iface in os.listdir('/sys/class/net'):
|
210
|
-
if iface == 'lo': # Ignora a interface de loopback
|
211
|
-
continue
|
212
|
-
|
213
|
-
# Verifica se é uma interface wireless
|
214
|
-
is_wireless = is_wireless_interface(iface)
|
215
|
-
|
216
|
-
interfaces.append({
|
217
|
-
'name': iface,
|
218
|
-
'mac': get_interface_mac(iface),
|
219
|
-
'ip': get_interface_ip(iface),
|
220
|
-
'wireless': is_wireless,
|
221
|
-
'up': is_interface_up(iface),
|
222
|
-
'mtu': get_interface_mtu(iface)
|
223
|
-
})
|
224
|
-
except Exception as e:
|
225
|
-
print(f"Erro ao listar interfaces de rede: {e}")
|
226
|
-
|
227
|
-
return interfaces
|
228
|
-
|
229
|
-
|
230
|
-
def get_monitor_interfaces() -> List[Dict[str, Any]]:
|
231
|
-
"""Obtém uma lista de interfaces de rede em modo monitor.
|
232
|
-
|
233
|
-
Returns:
|
234
|
-
List[Dict[str, Any]]: Lista de dicionários com informações das interfaces em modo monitor
|
235
|
-
"""
|
236
|
-
monitor_interfaces = []
|
237
|
-
|
238
|
-
try:
|
239
|
-
# Obtém todas as interfaces de rede
|
240
|
-
interfaces = get_network_interfaces()
|
241
|
-
|
242
|
-
# Filtra apenas as interfaces sem fio
|
243
|
-
wireless_interfaces = [iface for iface in interfaces if iface.get('wireless')]
|
244
|
-
|
245
|
-
# Verifica quais interfaces estão em modo monitor
|
246
|
-
for iface in wireless_interfaces:
|
247
|
-
ifname = iface['name']
|
248
|
-
|
249
|
-
# Verifica se a interface está em modo monitor
|
250
|
-
try:
|
251
|
-
with open(f'/sys/class/net/{ifname}/type', 'r') as f:
|
252
|
-
iftype = int(f.read().strip())
|
253
|
-
# O tipo 803 indica modo monitor (IEEE80211_IF_TYPE_MONITOR)
|
254
|
-
if iftype == 803:
|
255
|
-
monitor_interfaces.append(iface)
|
256
|
-
except (IOError, ValueError):
|
257
|
-
continue
|
258
|
-
|
259
|
-
except Exception as e:
|
260
|
-
print(f"Erro ao listar interfaces em modo monitor: {e}")
|
261
|
-
|
262
|
-
return monitor_interfaces
|
@@ -1,153 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
Módulo de utilidades do sistema para o WiFiPPLER.
|
3
|
-
|
4
|
-
Fornece funções para verificação de permissões, dependências e outras operações do sistema.
|
5
|
-
"""
|
6
|
-
import os
|
7
|
-
import sys
|
8
|
-
import subprocess
|
9
|
-
import shutil
|
10
|
-
from typing import List, Optional, Union, Dict, Any
|
11
|
-
|
12
|
-
def is_root() -> bool:
|
13
|
-
"""Verifica se o script está sendo executado como root.
|
14
|
-
|
15
|
-
Returns:
|
16
|
-
bool: True se for root, False caso contrário
|
17
|
-
"""
|
18
|
-
return os.geteuid() == 0
|
19
|
-
|
20
|
-
def command_exists(cmd: str) -> bool:
|
21
|
-
"""Verifica se um comando existe no sistema.
|
22
|
-
|
23
|
-
Args:
|
24
|
-
cmd: Nome do comando a ser verificado
|
25
|
-
|
26
|
-
Returns:
|
27
|
-
bool: True se o comando existir, False caso contrário
|
28
|
-
"""
|
29
|
-
return shutil.which(cmd) is not None
|
30
|
-
|
31
|
-
def check_dependencies() -> List[str]:
|
32
|
-
"""Verifica as dependências necessárias para o funcionamento do WiFiPPLER.
|
33
|
-
|
34
|
-
Returns:
|
35
|
-
List[str]: Lista de dependências ausentes
|
36
|
-
"""
|
37
|
-
required_commands = [
|
38
|
-
'iwconfig',
|
39
|
-
'ifconfig',
|
40
|
-
'iw',
|
41
|
-
'aircrack-ng',
|
42
|
-
'airodump-ng',
|
43
|
-
'aireplay-ng',
|
44
|
-
'airmon-ng',
|
45
|
-
'macchanger'
|
46
|
-
]
|
47
|
-
|
48
|
-
missing = []
|
49
|
-
for cmd in required_commands:
|
50
|
-
if not command_exists(cmd):
|
51
|
-
missing.append(cmd)
|
52
|
-
|
53
|
-
return missing
|
54
|
-
|
55
|
-
def get_os_info() -> Dict[str, str]:
|
56
|
-
"""Obtém informações sobre o sistema operacional.
|
57
|
-
|
58
|
-
Returns:
|
59
|
-
Dict[str, str]: Dicionário com informações do sistema
|
60
|
-
"""
|
61
|
-
import platform
|
62
|
-
|
63
|
-
return {
|
64
|
-
'system': platform.system(),
|
65
|
-
'node': platform.node(),
|
66
|
-
'release': platform.release(),
|
67
|
-
'version': platform.version(),
|
68
|
-
'machine': platform.machine(),
|
69
|
-
'processor': platform.processor(),
|
70
|
-
'python_version': platform.python_version()
|
71
|
-
}
|
72
|
-
|
73
|
-
def ensure_root() -> None:
|
74
|
-
"""Verifica se o script está sendo executado como root.
|
75
|
-
|
76
|
-
Raises:
|
77
|
-
RuntimeError: Se não estiver sendo executado como root
|
78
|
-
"""
|
79
|
-
if not is_root():
|
80
|
-
raise RuntimeError("Este script requer privilégios de superusuário (root). Execute com sudo.")
|
81
|
-
|
82
|
-
def ensure_dependencies() -> None:
|
83
|
-
"""Verifica se todas as dependências estão instaladas.
|
84
|
-
|
85
|
-
Raises:
|
86
|
-
RuntimeError: Se alguma dependência estiver faltando
|
87
|
-
"""
|
88
|
-
missing = check_dependencies()
|
89
|
-
if missing:
|
90
|
-
raise RuntimeError(
|
91
|
-
f"As seguintes dependências estão faltando: {', '.join(missing)}\n"
|
92
|
-
"Por favor, instale-as antes de continuar."
|
93
|
-
)
|
94
|
-
|
95
|
-
def get_available_interfaces() -> List[str]:
|
96
|
-
"""Obtém uma lista de interfaces de rede disponíveis.
|
97
|
-
|
98
|
-
Returns:
|
99
|
-
List[str]: Lista de nomes de interfaces de rede
|
100
|
-
"""
|
101
|
-
try:
|
102
|
-
return [
|
103
|
-
iface for iface in os.listdir('/sys/class/net/')
|
104
|
-
if iface != 'lo' # Ignora interface de loopback
|
105
|
-
]
|
106
|
-
except (OSError, IOError):
|
107
|
-
return []
|
108
|
-
|
109
|
-
def get_wireless_interfaces() -> List[str]:
|
110
|
-
"""Obtém uma lista de interfaces de rede sem fio disponíveis.
|
111
|
-
|
112
|
-
Returns:
|
113
|
-
List[str]: Lista de nomes de interfaces sem fio
|
114
|
-
"""
|
115
|
-
try:
|
116
|
-
return [
|
117
|
-
iface for iface in os.listdir('/sys/class/net/')
|
118
|
-
if os.path.exists(f'/sys/class/net/{iface}/wireless')
|
119
|
-
]
|
120
|
-
except (OSError, IOError):
|
121
|
-
return []
|
122
|
-
|
123
|
-
def get_interface_info(interface: str) -> Dict[str, Any]:
|
124
|
-
"""Obtém informações detalhadas sobre uma interface de rede.
|
125
|
-
|
126
|
-
Args:
|
127
|
-
interface: Nome da interface de rede
|
128
|
-
|
129
|
-
Returns:
|
130
|
-
Dict[str, Any]: Dicionário com informações da interface
|
131
|
-
"""
|
132
|
-
return {
|
133
|
-
'name': interface,
|
134
|
-
'wireless': os.path.exists(f'/sys/class/net/{interface}/wireless'),
|
135
|
-
'state': get_interface_state(interface),
|
136
|
-
'mac_address': get_interface_mac(interface),
|
137
|
-
'ip_address': get_interface_ip(interface)
|
138
|
-
}
|
139
|
-
|
140
|
-
def get_interface_state(interface: str) -> str:
|
141
|
-
"""Obtém o estado atual de uma interface de rede.
|
142
|
-
|
143
|
-
Args:
|
144
|
-
interface: Nome da interface de rede
|
145
|
-
|
146
|
-
Returns:
|
147
|
-
str: Estado da interface (up/down/unknown)
|
148
|
-
"""
|
149
|
-
try:
|
150
|
-
with open(f'/sys/class/net/{interface}/operstate', 'r') as f:
|
151
|
-
return f.read().strip()
|
152
|
-
except (OSError, IOError):
|
153
|
-
return 'unknown'
|
File without changes
|
File without changes
|