You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyInstaller打包的Python后门客户端在Windows下出现窗口闪烁问题

解决方案:解决PyInstaller打包后终端窗口闪烁问题

原因分析

  1. 控制台输出触发窗口闪现:尽管使用了-w参数隐藏控制台,但代码中的print语句会尝试向标准输出/错误流写入内容,Windows系统为处理这些输出会短暂弹出控制台窗口,对应你观察到的1Hz闪烁(run_command每5秒执行一次,每次可能触发print)。
  2. 第三方库调用外部命令: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 06:30:47