含键盘输入功能的Python编译.exe被Windows Defender误报病毒的解决方法
Windows Defender误报Python编译助手程序的解决办法
我用Python写了一款支持语音和文本控制的助手程序,编译成.exe文件后被Windows Defender内置杀毒软件检测为病毒,推测原因是代码中使用了keyboard.press_and_release、keyboard.write以及os.startfile这类具有系统操作权限的函数。以下是我的程序代码:
import pyttsx3 import speech_recognition as sr import keyboard import time import os import sys def get_username(): return os.getlogin() def open_ragemp(): ragemp_path = "D:/RAGEMP/updater.exe" try: os.startfile(ragemp_path) return True, "RAGEMP" except Exception as e: return False, str(e) def open_yandex_music(): try: keyboard.press_and_release("win+s") time.sleep(1) keyboard.write("Яндекс.Музыка") keyboard.press_and_release("enter") return True, "Яндекс.Музыка" except Exception as e: return False, str(e) def respond(text): print("Бот:", text) engine.say(text) engine.runAndWait() def greet(username): respond(f"Здравствуйте, {username}! Как я могу помочь вам сегодня?") def close_program(): respond("До свидания! Спасибо за использование помощника.") sys.exit() def main(): global engine engine = pyttsx3.init() recognizer = sr.Recognizer() username = get_username() greet(username) with sr.Microphone() as source: respond(f"{username}, как бы вы хотели вводить команды? Голосом или текстом?") audio = recognizer.listen(source) try: user_input = recognizer.recognize_google(audio, language="ru-RU").lower() print(f"{username} сказал:", user_input) except sr.UnknownValueError: user_input = input("Не удалось распознать. Введите 'голос' или 'текст': ") if "голос" in user_input: respond("Хорошо, буду ждать команды голосом.") while True: with sr.Microphone() as source: print(f"{username}, скажите ваш запрос:") audio = recognizer.listen(source) try: user_input = recognizer.recognize_google(audio, language="ru-RU").lower() print(f"{username} сказал:", user_input) except sr.UnknownValueError: print(f"{username}, не удалось распознать команду.") continue if "кто твой разработчик" in user_input: respond("Меня разработал tareqq. Его Discord и Telegram выведены в консоль.") print('Discord: mewqq. \n Telegram: https://t.me/chvaNNoy') elif "кто тебя разработал" in user_input: respond("Меня разработал tareqq. Его Discord и Telegram выведены в консоль.") print('Discord: mewqq. \n Telegram: https://t.me/chvaNNoy') elif "кто такой джаспер" in user_input: respond("Джаспер - это нефор, бывший руководитель Fours Project.") elif "как дела" in user_input: respond(f"У меня всё отлично, спасибо! Как у вас, {username}?") elif "новости" in user_input: respond("Дайте мне немного времени, и я найду для вас актуальные новости.") elif "анекдот" in user_input: respond("Почему программисты так не любят пляж? Потому что они боятся волны!") elif "способности" in user_input: respond("Я могу отвечать на вопросы, рассказывать шутки, предоставлять информацию и многое другое. Что вас интересует?") elif "игры" in user_input: respond("Я, к сожалению, не умею играть в видеоигры, но могу вам помочь найти информацию о них!") elif "открой рейдж мп" in user_input: success, app_name = open_ragemp() if success: respond(f"Программа {app_name} успешно запущена.") else: respond(f"Программа {app_name} не запустилась. Причина: {app_name}") elif "открой яндекс музыку" in user_input: success, app_name = open_yandex_music() if success: respond(f"Программа {app_name} успешно запущена.") else: respond(f"Программа {app_name} не запустилась. Причина: {app_name}") elif "пока" in user_input: close_program() else: respond("Извините, я не понял ваш запрос. Пожалуйста, переформулируйте его.") elif "текст" in user_input: respond("Хорошо, буду ждать команды в текстовом виде.") while True: user_input = input("Введите команду: ") if "кто твой разработчик" in user_input: respond("Меня разработал tareqq. Его Discord и Telegram выведены в консоль.") print('Discord: mewqq. \n Telegram: https://t.me/chvaNNoy') elif "кто тебя разработал" in user_input: respond("Меня разработал tareqq. Его Discord и Telegram выведены в консоль.") print('Discord: mewqq. \n Telegram: https://t.me/chvaNNoy') elif "кто такой джаспер" in user_input: respond("Джаспер - это нефор, бывший руководитель Fours Project.") elif "выключи компьютер" in user_input: os.system("shutdown /s /t 1") # Выключение через 1 секунду elif "как дела" in user_input: respond(f"У меня всё отлично, спасибо! Как у вас, {username}?") elif "новости" in user_input: respond("Дайте мне немного времени, и я найду для вас актуальные новости.") elif "анекдот" in user_input: respond("Почему программисты так не любят пляж? Потому что они боятся волны!") elif "способности" in user_input: respond("Я могу отвечать на вопросы, рассказывать шутки, предоставлять информацию и многое другое. Что вас интересует?") elif "игры" in user_input: respond("Я, к сожалению, не умею играть в видеоигры, но могу вам помочь найти информацию о них!") elif "открой рейдж мп" in user_input: success, app_name = open_ragemp() if success: respond(f"Программа {app_name} успешно запущена.") else: respond(f"Программа {app_name} не запустилась. Причина: {app_name}") elif "открой яндекс музыку" in user_input: success, app_name = open_yandex_music() if success: respond(f"Программа {app_name} успешно запущена.") else: respond(f"Программа {app_name} не запустилась. Причина: {app_name}") elif "пока" in user_input: close_program() else: respond("Извините, я не понял ваш запрос. Пожалуйста, переформулируйте его.") else: respond("Извините, не удалось понять ваш выбор.") engine.runAndWait() while True: user_input = input("\nВведите команду: ") if user_input.lower() == "голос": # Ввод команд голосом pass elif user_input.lower() == "текст": # Ввод команд текстом pass elif user_input.lower() == "закрыть": close_program() else: print("\nНеверная команда. Пожалуйста, выберите действие из списка.") if __name__ == "__main__": main()
解决误报的具体方案
一、更换或优化编译工具
- 改用Nuitka编译:Nuitka会把Python代码转成C代码再编译成.exe,生成的程序更接近原生软件,误报率远低于PyInstaller。安装Nuitka后,执行以下命令:
nuitka --standalone --windows-disable-console --output-dir=dist your_script_name.py - 调整PyInstaller参数:如果坚持用PyInstaller,添加这些参数降低被检测概率:
--noconsole:不需要控制台时加上,减少程序特征--icon=your_icon.ico:给程序加自定义图标,避免默认图标被识别为可疑--upx-dir=path/to/upx:用UPX压缩程序体积,优化文件结构(注意部分杀毒软件可能对UPX压缩的文件敏感,可按需选择)
二、替换代码中的敏感函数
- 替换
os.startfile:改用subprocess.Popen,参数更透明,减少可疑特征:import subprocess def open_ragemp(): ragemp_path = "D:/RAGEMP/updater.exe" try: subprocess.Popen([ragemp_path], shell=True) return True, "RAGEMP" except Exception as e: return False, str(e) - 替换
keyboard库:改用pyautogui模拟键盘操作,它的行为更贴近真实用户输入,被误报的概率更低:import pyautogui def open_yandex_music(): try: pyautogui.hotkey('win', 's') time.sleep(1) pyautogui.write("Яндекс.Музыка") pyautogui.press('enter') return True, "Яндекс.Музыка" except Exception as e: return False, str(e) - 移除高危操作:代码中的
os.system("shutdown /s /t 1")直接执行关机命令,很容易被标记为恶意行为。可以改成提示用户手动关机,或者增加二次确认步骤。
三、杀毒软件层面处理
- 添加白名单:把生成的.exe文件和编译目录添加到Windows Defender的排除列表,路径:Windows安全中心 → 病毒和威胁防护 → 病毒和威胁防护设置 → 添加或删除排除项
- 提交误报申诉:如果确认程序安全,可通过微软官方渠道提交文件申诉,让官方更新病毒库将程序标记为安全。
内容的提问来源于stack exchange,提问作者tareqq
相关产品推荐
相关产品推荐

