如何通过Python运行AES加密程序且不保存解密后的exe文件
可行性结论
该需求仅可在Windows平台通过Python实现。Windows操作系统原生的进程创建机制默认要求可执行文件存在于磁盘文件系统,没有提供官方的"直接从内存字节流启动EXE"的接口,所有无落地运行的方案本质都是借助Windows底层的进程、内存API绕过磁盘写入的要求,Linux、macOS系统的进程启动逻辑差异极大,无法套用相同方案。
具体实现方案
方案1:进程镂空(Process Hollowing)实现(适配普通EXE,稳定性最高)
这是目前兼容性最好的无落地运行EXE的方案,全程不需要把解密后的EXE字节写入磁盘,核心流程如下:
- 第一步:在内存中完成AES解密,得到完整的EXE字节流,参考解密代码:
from Crypto.Cipher import AES # 读取加密的EXE文件 with open("encrypted.exe", "rb") as f: enc_content = f.read() # 替换为你实际加密时使用的密钥、IV、加密模式,以下为CBC模式示例 AES_KEY = b"replace_with_your_aes_key_32b" AES_IV = b"replace_with_iv_16b" cipher = AES.new(AES_KEY, AES.MODE_CBC, AES_IV) # 按照加密时使用的填充规则去除填充,示例为PKCS7填充 dec_content = cipher.decrypt(enc_content) pad_length = dec_content[-1] exe_bytes = dec_content[:-pad_length]
- 第二步:调用Windows API创建一个挂起状态的宿主进程,通常选择系统自带的合法签名程序(如
notepad.exe、calc.exe)作为宿主,避免触发安全软件告警 - 第三步:释放宿主进程原本加载的PE镜像内存,将内存中解密得到的EXE字节按照PE节表规则映射到宿主进程的内存空间
- 第四步:修复EXE的导入表、重定位表,将进程主线程的入口点修改为解密后EXE的入口地址
- 第五步:调用API恢复宿主进程的主线程运行,此时解密后的EXE就会完全在内存中启动,全程不会在磁盘生成
decrypted.exe文件。
你可以直接基于pymem、pefile两个Python库封装上述逻辑,不需要自己手写复杂的C类型绑定和PE结构解析代码。
方案2:反射加载迂回实现(适配反射型DLL,隐蔽性更高)
如果你可以把需要运行的程序编译为支持反射加载的DLL格式,实现难度会大幅降低:
- 解密得到DLL字节流后,直接在当前Python进程内申请可读可写可执行的内存空间
- 将DLL字节拷贝到申请的内存中,完成重定位表、导入表修复后直接调用DLL入口函数即可
- 该方案不需要创建额外的宿主进程,内存痕迹更少,但仅支持符合反射加载规范的DLL,无法直接运行普通EXE文件。
注意事项
- 上述所有内存加载行为均属于终端安全软件的重点检测特征,在开启实时防护的设备上运行大概率会被直接拦截查杀
- 该类技术仅可用于合法的软件版权保护、授权校验场景,请勿用于任何违反网络安全法律法规的用途
- 如果待运行的EXE依赖第三方DLL文件,要么将依赖DLL放在系统默认的搜索路径下,要么需要同步实现依赖DLL的内存加载,否则程序启动会抛出找不到依赖的错误
- 部分加壳、带反调试保护的EXE无法直接通过内存注入的方式运行,需要先做脱壳、反调试处理。
内容的提问来源于stack exchange,提问作者rudeus123
相关产品推荐
相关产品推荐

