排查杀毒软件代码中的错误-1073740791(0xC0000409)
问题概述
开发的杀毒软件执行标准扫描时崩溃,触发错误提示:Process finished with exit code -1073740791 (0xC0000409)。此前通过引入线程解决了程序无响应问题,但当前扫描功能触发该崩溃错误,以下是针对代码的问题分析和修复建议。
关键代码问题分析
1. 扫描线程核心方法命名错误
ScanThread类中定义了run1()方法,但QThread启动时默认调用的是run()方法,导致扫描线程启动后没有实际执行扫描逻辑,同时后续进度更新的错误会直接引发崩溃。
2. 进度更新逻辑严重错误
在run1()方法中,进度更新代码为:
self.progress_updated.emit(self.progress_updated.value() + self.progress_updated.value() + 1)
progress_updated是pyqtSignal对象,没有value()方法,执行这行代码会直接抛出AttributeError,导致线程崩溃,进而触发进程级错误码。
3. 实时检测的病毒判断逻辑完全颠倒
在RealtimeCheckThread的进程扫描部分:
if process_hash and process_hash not in mongo_hashes: print(f"Processo {proc_info['pid']} ({proc_info['name']}) com hash não correspondente: {process_hash}") else: self.result_obtained.emit(f"Arquivo infectado encontrado, matando processo e deletando o arquivo.") p = psutil.Process(proc_info['pid']) p.terminate() os.remove(proc_info['exe'])
逻辑完全反转:当进程哈希不在病毒库时判定为安全,反之则判定为病毒,但代码中写反了条件,会误杀正常进程、删除系统关键文件,这极可能导致系统异常,引发进程崩溃。
4. 命令字符串语法错误
在实时检测的进程终止命令打印部分:
print(comando_final.replace("'%" call terminate", "\"\""))
字符串拼接语法错误,call terminate未被包裹在字符串中,会直接抛出SyntaxError,导致线程异常。
5. 异常捕获不充分
在文件哈希计算、进程操作、文件删除等环节,仅捕获了部分特定异常,遇到权限不足、文件被占用、文件不存在等情况时,未做处理会导致线程崩溃,进而引发整体进程错误。
6. 多线程资源冲突
实时检测线程和扫描线程同时对文件进行操作(如实时线程删除文件,扫描线程同时读取该文件),会触发IO异常,导致线程崩溃。
修复建议
1. 修正扫描线程核心方法
将ScanThread类中的run1()重命名为run(),确保线程启动后执行扫描逻辑:
def run(self): arquivos_infectados = [] count = 0 for root, _, files in os.walk(self.drive_path): for file in files: count += 1 file_path = os.path.join(root, file) if self.check_for_virus(file_path): arquivos_infectados.append(file_path) try: os.remove(file_path) self.file_infected.emit(file_path) except OSError as e: print(f"无法删除文件 {file_path}: {e}") self.progress_updated.emit(count) self.finished.emit(arquivos_infectados)
2. 修复进度更新逻辑
使用独立计数器变量跟踪扫描进度,替代错误的信号对象调用:
# 在run方法内初始化计数器 count = 0 # 每处理一个文件计数器+1,然后发送进度 count += 1 self.progress_updated.emit(count)
3. 修正实时检测的病毒判断逻辑
颠倒条件判断,确保哈希在病毒库中时才执行查杀操作:
if process_hash and process_hash in mongo_hashes: self.result_obtained.emit(f"发现感染文件,终止进程并删除文件: {proc_info['exe']}") try: p = psutil.Process(proc_info['pid']) p.terminate() os.remove(proc_info['exe']) except (psutil.NoSuchProcess, OSError) as e: print(f"查杀失败: {e}") else: print(f"进程 {proc_info['pid']} ({proc_info['name']}) 安全")
4. 修复命令字符串语法错误
修正打印语句的字符串拼接,或直接正确构造终止命令:
# 正确构造终止命令 comando_final = f'wmic process where "commandline like \'%{caminho.replace("\\", "\\\\")}%\'" call terminate' # 直接打印命令即可,无需错误替换 print(f"执行命令: {comando_final}")
5. 增强异常捕获
在文件操作、进程操作环节增加全面的异常捕获,避免单个错误导致线程崩溃:
# 以哈希计算函数为例 def calcular_sha256(arquivo): hasher = hashlib.sha256() try: with open(arquivo, 'rb') as f: while (chunk := f.read(8192)): hasher.update(chunk) return hasher.hexdigest() except (PermissionError, FileNotFoundError, OSError) as e: print(f"计算哈希失败 {arquivo}: {e}") return None
6. 避免多线程资源冲突
可以通过以下方式协调两个线程:
- 给文件操作加锁,同一时间仅允许一个线程操作文件
- 扫描时跳过正在被实时线程处理的文件
- 实时检测线程在扫描期间暂停执行,扫描完成后恢复
7. 运行权限要求
确保程序以管理员权限运行,避免因权限不足导致的进程终止、文件删除失败等问题。
内容的提问来源于stack exchange,提问作者Arcadegame frame

