-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathduck_windows_virus.py
More file actions
317 lines (259 loc) · 11.7 KB
/
duck_windows_virus.py
File metadata and controls
317 lines (259 loc) · 11.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
"""
Vírus Simbólico do Patinho - Versão Windows
Este código é puramente educacional e demonstra como um programa pode
interagir com o cursor do mouse no Windows.
AVISO: Este código deve ser usado apenas para fins educacionais em ambientes controlados.
"""
import tkinter as tk
from PIL import Image, ImageTk
import ctypes
from ctypes import wintypes
import time
import threading
import os
# Comentários linha a linha:
# import tkinter as tk: Biblioteca padrão do Python para criar interfaces gráficas
# from PIL import Image, ImageTk: Biblioteca Pillow para manipulação de imagens
# import ctypes: Biblioteca para chamar funções da API do Windows
# from ctypes import wintypes: Tipos de dados específicos do Windows
# import time: Para controlar o tempo e pausas
# import threading: Para executar tarefas em paralelo
# import os: Para operações do sistema operacional
class WindowsDuckVirus:
def __init__(self):
# Construtor da classe que inicializa o "vírus" do patinho
# Configurações da API do Windows usando ctypes
# user32.dll contém funções para manipular janelas, cursor e entrada do usuário
self.user32 = ctypes.windll.user32
# Definindo tipos de dados para as funções da API do Windows
# Isso garante que os parâmetros sejam passados corretamente
self.user32.SetCursorPos.argtypes = [ctypes.c_int, ctypes.c_int]
self.user32.SetCursorPos.restype = wintypes.BOOL
self.user32.GetCursorPos.argtypes = [ctypes.POINTER(wintypes.POINT)]
self.user32.GetCursorPos.restype = wintypes.BOOL
self.user32.ShowCursor.argtypes = [wintypes.BOOL]
self.user32.ShowCursor.restype = ctypes.c_int
# BlockInput é uma função poderosa que pode bloquear toda entrada do usuário
# CUIDADO: Esta função pode tornar o sistema inutilizável se mal utilizada
self.user32.BlockInput.argtypes = [wintypes.BOOL]
self.user32.BlockInput.restype = wintypes.BOOL
# Variáveis de controle
self.running = True
self.duck_window = None
self.duck_x = 0
self.duck_y = 0
self.movement_speed = 2 # Velocidade do movimento do patinho
# Direção do movimento (para fazer o patinho "andar")
self.direction_x = 1
self.direction_y = 1
def hide_system_cursor(self):
"""
Oculta o cursor do sistema usando a API do Windows
ShowCursor(FALSE) decrementa o contador de exibição do cursor
Quando o contador chega a -1 ou menos, o cursor fica invisível
"""
# ShowCursor(False) oculta o cursor do sistema
# Retorna o novo valor do contador de exibição
cursor_count = self.user32.ShowCursor(False)
print(f"Cursor oculto. Contador: {cursor_count}")
def show_system_cursor(self):
"""
Mostra o cursor do sistema novamente
ShowCursor(TRUE) incrementa o contador de exibição do cursor
"""
# ShowCursor(True) mostra o cursor do sistema
cursor_count = self.user32.ShowCursor(True)
print(f"Cursor restaurado. Contador: {cursor_count}")
def get_cursor_position(self):
"""
Obtém a posição atual do cursor usando a API do Windows
"""
# POINT é uma estrutura que contém coordenadas x e y
point = wintypes.POINT()
# GetCursorPos preenche a estrutura POINT com as coordenadas atuais
if self.user32.GetCursorPos(ctypes.byref(point)):
return point.x, point.y
return 0, 0
def set_cursor_position(self, x, y):
"""
Define a posição do cursor usando a API do Windows
"""
# SetCursorPos move o cursor para as coordenadas especificadas
self.user32.SetCursorPos(x, y)
def block_user_input(self, block=True):
"""
Bloqueia ou desbloqueia a entrada do usuário (mouse e teclado)
CUIDADO: Esta função pode tornar o sistema inutilizável!
"""
# BlockInput(True) bloqueia toda entrada do usuário
# BlockInput(False) desbloqueia a entrada
# NOTA: Esta função requer privilégios elevados para funcionar
result = self.user32.BlockInput(block)
if result:
status = "bloqueada" if block else "desbloqueada"
print(f"Entrada do usuário {status}")
else:
print("Falha ao alterar o bloqueio de entrada (pode precisar de privilégios de administrador)")
def create_duck_window(self):
"""
Cria a janela transparente com o patinho
"""
# Cria a janela principal do Tkinter
self.duck_window = tk.Tk()
# Remove a barra de título e bordas da janela
self.duck_window.overrideredirect(True)
# Mantém a janela sempre no topo
self.duck_window.wm_attributes("-topmost", True)
# Torna o fundo transparente (funciona melhor no Windows)
self.duck_window.wm_attributes("-transparentcolor", "white")
# Define o fundo da janela como branco (que será transparente)
self.duck_window.configure(bg='white')
try:
# Carrega a imagem do patinho
# Certifique-se de que o arquivo duck_follower.png existe no mesmo diretório
duck_image = Image.open("duck_follower.png")
# Redimensiona a imagem para um tamanho adequado
duck_image = duck_image.resize((64, 64), Image.Resampling.LANCZOS)
# Converte para formato compatível com Tkinter
self.duck_photo = ImageTk.PhotoImage(duck_image)
# Cria um label para exibir a imagem
self.duck_label = tk.Label(
self.duck_window,
image=self.duck_photo,
bg='white', # Fundo branco (transparente)
bd=0
)
self.duck_label.pack()
except FileNotFoundError:
# Se a imagem não for encontrada, cria um texto simples
self.duck_label = tk.Label(
self.duck_window,
text="🦆",
font=("Arial", 48),
bg='white',
fg='orange',
bd=0
)
self.duck_label.pack()
# Obtém a posição inicial do cursor
self.duck_x, self.duck_y = self.get_cursor_position()
# Posiciona a janela do patinho
self.update_duck_position()
def update_duck_position(self):
"""
Atualiza a posição da janela do patinho
"""
if self.duck_window:
# Centraliza o patinho nas coordenadas atuais
window_x = self.duck_x - 32 # Metade do tamanho da imagem (64/2)
window_y = self.duck_y - 32
# Move a janela para a nova posição
self.duck_window.geometry(f"+{window_x}+{window_y}")
def duck_movement_thread(self):
"""
Thread que controla o movimento do patinho
Esta função roda em paralelo e faz o patinho "andar" pela tela
"""
# Obtém as dimensões da tela
screen_width = self.user32.GetSystemMetrics(0) # SM_CXSCREEN
screen_height = self.user32.GetSystemMetrics(1) # SM_CYSCREEN
print(f"Dimensões da tela: {screen_width}x{screen_height}")
while self.running:
# Calcula a nova posição do patinho
self.duck_x += self.direction_x * self.movement_speed
self.duck_y += self.direction_y * self.movement_speed
# Verifica os limites da tela e inverte a direção se necessário
if self.duck_x <= 0 or self.duck_x >= screen_width - 64:
self.direction_x *= -1
if self.duck_y <= 0 or self.duck_y >= screen_height - 64:
self.direction_y *= -1
# Mantém o patinho dentro dos limites da tela
self.duck_x = max(32, min(self.duck_x, screen_width - 32))
self.duck_y = max(32, min(self.duck_y, screen_height - 32))
# Move o cursor real para seguir o patinho (simula o "roubo")
self.set_cursor_position(self.duck_x, self.duck_y)
# Atualiza a posição da janela do patinho
if self.duck_window:
try:
self.duck_window.after(0, self.update_duck_position)
except tk.TclError:
# A janela foi fechada
break
# Pausa antes da próxima atualização
time.sleep(0.05) # 50ms = ~20 FPS
def start_virus(self):
"""
Inicia o "vírus" do patinho
"""
print("Iniciando o vírus do patinho...")
print("AVISO: O cursor será 'roubado' pelo patinho!")
print("Pressione Ctrl+C no terminal para parar o programa")
try:
# Cria a janela do patinho
self.create_duck_window()
# Oculta o cursor do sistema
self.hide_system_cursor()
# Inicia a thread de movimento do patinho
movement_thread = threading.Thread(target=self.duck_movement_thread)
movement_thread.daemon = True # Thread será encerrada quando o programa principal terminar
movement_thread.start()
# Inicia o loop principal do Tkinter
self.duck_window.mainloop()
except KeyboardInterrupt:
print("\nParando o vírus do patinho...")
self.stop_virus()
except Exception as e:
print(f"Erro: {e}")
self.stop_virus()
def stop_virus(self):
"""
Para o "vírus" e restaura o sistema
"""
print("Restaurando o sistema...")
# Para o loop de movimento
self.running = False
# Restaura o cursor do sistema
self.show_system_cursor()
# Desbloqueia a entrada do usuário (se estava bloqueada)
self.block_user_input(False)
# Fecha a janela do patinho
if self.duck_window:
try:
self.duck_window.destroy()
except:
pass
print("Sistema restaurado!")
# Função principal
def main():
"""
Função principal que executa o vírus do patinho
"""
print("=" * 50)
print("VÍRUS SIMBÓLICO DO PATINHO - VERSÃO WINDOWS")
print("=" * 50)
print("Este é um programa educacional que demonstra")
print("como um malware pode 'roubar' o cursor do mouse.")
print()
print("CUIDADO: Este programa irá:")
print("1. Ocultar o cursor real do sistema")
print("2. Mover o cursor automaticamente")
print("3. Exibir um patinho que 'rouba' o cursor")
print()
print("Para parar o programa, pressione Ctrl+C no terminal")
print("=" * 50)
# Pergunta se o usuário quer continuar
response = input("Deseja continuar? (s/N): ").lower().strip()
if response in ['s', 'sim', 'y', 'yes']:
# Cria uma instância do vírus do patinho
duck_virus = WindowsDuckVirus()
try:
# Inicia o vírus
duck_virus.start_virus()
except KeyboardInterrupt:
print("\nPrograma interrompido pelo usuário")
duck_virus.stop_virus()
else:
print("Programa cancelado pelo usuário.")
# Executa o programa apenas se for chamado diretamente
if __name__ == "__main__":
main()