AES免杀绕过方法全解析:从原理到实战的那些坑
大家好呀,今天咱们来聊一个特别有意思的话题——AES免杀绕过方法,说实话,写这篇文章之前我纠结了好久,因为这玩意儿确实有点敏感,但想了想,做安全研究的朋友们总得了解对手的思路吧?知己知彼才能百战不殆嘛。

先说说我为啥要写这个,前几天群里有个小伙伴问我:“哥,我写的AES加密payload怎么老是被查杀啊?”我当时就笑了,兄弟,你以为加个AES就万事大吉了?Too young too simple啊!
为什么AES加密也会被查杀?
很多新手有个误区,觉得我把shellcode用AES加密了,杀软就认不出来了,嗯……理论上是对的,但现实很骨感,杀软早就不是当年那个只会比对特征码的憨憨了。
现在的EDR和AV会干嘛呢?它们会监控内存行为,你AES解密之后总得执行吧?一执行,内存里就是明文shellcode了,这时候 behavioral detection 就直接把你拿下了,还有就是,你的解密函数本身、密钥硬编码、API调用序列,这些都是明显的特征。
我自己测试的时候就发现,单纯用AES加密,卡巴斯基基本上秒杀,Windows Defender稍微好点但也撑不了多久,所以啊,AES免杀绕过方法的核心不在于加密本身,而在于怎么把解密和执行的过程藏起来。
常见的AES免杀绕过方法有哪些?
分离密钥与密文
这是最基础的思路,别把密钥硬编码在代码里,可以通过网络请求、环境变量、甚至用户输入来获取,我之前写过一个demo,密钥藏在注册表里,密文放在资源段,解密的时候再拼起来,这样静态扫描基本就废了。
白利用+反射加载
这个就高级一点了,找一个签名的白文件(比如某些系统工具),把AES解密后的payload通过反射加载的方式注入进去,杀软一看,哎这是微软签名的进程,放行!实际上里面跑的是你的东西。
具体做法是:先把AES加密的shellcode解密到内存,然后用VirtualAlloc分配可执行内存,接着用CreateThread或者回调函数执行,但注意啊,VirtualAlloc+CreateThread这个组合太经典了,EDR看到就报警,所以得换换花样,比如用NtMapViewOfSection或者QueueUserAPC。
多次加密+混淆
有些朋友喜欢AES套RC4再套Base64,觉得层层加密更安全,其实吧……效果有限,杀软不看你的加密层数,它看的是最终行为,不过适当混淆一下解密函数的控制流还是有点用的,比如用ollvm把解密逻辑搞得乱七八糟,让静态分析的人头疼。
内存加密执行
这个思路我觉得挺有意思的,就是别一次性解密全部shellcode,而是分块解密、分块执行,执行完一块就马上加密回去,这样内存里永远只有一小段明文,虽然实现起来麻烦点,但确实能绕过不少内存扫描。
实战中踩过的坑
说真的,AES免杀绕过方法这东西,理论归理论,实战起来坑多得要命。
有一次我写了个AES解密+APC注入的payload,本地测试Defender完全不报,心里美滋滋,结果拿到VT上一扫,好家伙,32个引擎报毒,为啥呢?因为我的AES解密函数用了Windows Crypto API,那个CryptDecrypt的调用序列太特征了,后来换成自己实现的AES,才勉强降到8个引擎。
,千万别用网上随便抄的AES代码,你以为你抄的是AES,其实里面可能藏着作者留的标记,杀软早就收录了,我建议要么自己手写,要么用一些冷门的加密库。
测试的时候一定要用多引擎扫描,别只看一个杀软,不同的EDR行为监控逻辑不一样,有的吃内存特征,有的吃API调用,有的吃网络行为,你得综合考虑。
防御视角的思考
写到这里,我得提醒一下,咱们学这些AES免杀绕过方法,最终目的是为了做更好的防御,作为蓝队,你得知道攻击者怎么绕过你的检测,才能针对性地布防。
比如说,你可以监控VirtualAlloc+WriteProcessMemory的组合调用;可以检测进程内存中是否存在高熵区域(加密数据特征);还可以hookCryptDecrypt等API,记录调用上下文,这些手段结合起来,哪怕攻击者用了AES免杀,也会留下蛛丝马迹。
总结一下
好了,絮絮叨叨说了这么多,总结一下吧。AES免杀绕过方法不是单一的技巧,而是一整套思路的组合:加密只是起点,关键在于如何隐藏解密过程、如何规避行为检测、如何让payload在内存中“隐身”。
如果你刚入门,建议先从分离密钥和反射加载开始练手;如果你已经有一定经验,可以研究研究内存分块加密和自定义AES实现,但记住啊,技术是把双刃剑,用在正道上才是王道。
有啥问题欢迎在评论区交流,我看到都会回的,下篇文章咱们聊聊“shellcode内存加载的那些骚操作”,敬请期待!
本文仅供安全研究与学习交流,请勿用于非法用途。