PyInstaller打包的Python后门客户端在Windows下出现窗口闪烁问题
解决方案:解决PyInstaller打包后终端窗口闪烁问题
原因分析
- 控制台输出触发窗口闪现:尽管使用了
-w参数隐藏控制台,但代码中的print语句会尝试向标准输出/错误流写入内容,Windows系统为处理这些输出会短暂弹出控制台窗口,对应你观察到的1Hz闪烁(run_command每5秒执行一次,每次可能触发print)。 - 第三方库调用外部命令:
getmac库内部可能调用了Windows系统命令(如getmac.exe或ipconfig),这些命令执行时会创建临时控制台窗口,导致闪烁。
具体修复步骤
1. 移除或重定向控制台输出
删除代码中所有print语句,或者将输出重定向到空设备,避免触发控制台窗口:
import sys from subprocess import PIPE, Popen, CREATE_NO_WINDOW # ... 其他导入 ... # 在代码开头添加,重定向stdout/stderr到空设备 sys.stdout = open('nul', 'w') sys.stderr = open('nul', 'w') # 移除所有print语句,比如get_command中的错误提示
2. 替换getmac库,用纯Python方式获取MAC地址
避免依赖外部命令,直接通过纯Python代码获取MAC地址,示例实现:
import uuid def get_mac() -> str: # 纯Python方式获取本机MAC地址 mac = ':'.join(['{:02x}'.format((uuid.getnode() >> ele) & 0xff) for ele in range(0,8*6,8)][::-1]) return mac.replace(':', '')
或者使用Windows API调用(更稳定):
import ctypes from ctypes import wintypes def get_mac() -> str: IP_ADAPTER_INFO = ctypes.c_byte * 2000 ptr = ctypes.pointer(IP_ADAPTER_INFO()) size = wintypes.DWORD(2000) ctypes.windll.iphlpapi.GetAdaptersInfo(ptr, ctypes.byref(size)) adapter = ptr.contents # 获取第一个有效MAC地址 mac_bytes = adapter.Address[:adapter.AddressLength] mac_str = ''.join(f'{b:02x}' for b in mac_bytes) return mac_str
3. 调整PyInstaller打包参数
使用更明确的参数禁用控制台,同时确保依赖被正确打包:
pyinstaller -F --noconsole program.py
验证修复
修改代码后重新打包,运行生成的exe文件,观察是否还存在窗口闪烁现象。如果问题解决,说明是上述两个原因之一导致的。
内容的提问来源于stack exchange,提问作者haward79
相关产品推荐
相关产品推荐

