AMSI绕过有哪些?老网安人含泪整理,这些坑我替你踩过了!
哎,说到AMSI绕过,我这心里就五味杂陈啊!刚入行那会儿,我天真地以为只要把payload扔进PowerShell就万事大吉了,结果呢?直接被AMSI一巴掌拍死在沙滩上,连个水花都没溅起来,那种感觉,真的,就像你精心准备的表白被对方一句“你是个好人”给终结了,憋屈得要命!

后来我痛定思痛,花了大把时间研究AMSI绕过有哪些招数,今天就跟大家掏心窝子聊聊,全是干货,不带半点水分!
第一招:内存补丁法——最经典也最“暴力”
你们知道吗?AMSI本质上就是个DLL,它会在进程启动时被加载到内存里,我当时就在想,既然它是个“活物”,那我能不能让它“闭嘴”呢?还真行!最简单粗暴的方式就是直接修改amsi.dll在内存中的代码,让它的扫描函数变成“残疾人”,就是找到AmsiScanBuffer这个函数的地址,然后把它的开头改成ret指令,嘿,这招下来,AMSI就直接“罢工”了!
不过啊,这招虽然有效,但风险也不小,有些杀软会检测关键DLL的完整性,你一旦动了它的“奶酪”,人家立马就会报警,所以啊,用这招的时候,心脏小的真不适合,我都得提前写好免责声明再动手。
第二招:注册表篡改——剑走偏锋的“阴招”
这招我愿称之为“老六打法”,你有没有想过,AMSI的初始化其实要读取一些配置?那些配置都存在注册表里呢,我之前试过,把HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\AMSI下的某些键值给改了,比如禁用特征更新,或者让AMSI去加载一个不存在的DLL,这样它初始化就失败了,自然也就“睁一只眼闭一只眼”了。
但说实话,这招对防御严密的系统基本没用,而且改注册表太容易被EDR盯上了,我试过一次,屁股还没坐热,蓝队那边就发警报了,吓得我赶紧还原,只能说,这招适合打打“闪电战”,持久战可千万别用。
第三招:PowerShell降级——欺负老同志的“套路”
哎,这一招说出来我都觉得有点“欺负人”,你们知道不?AMSI对PowerShell的防护是有版本限制的,早些年,如果你能强制PowerShell以v2版本运行,那AMSI压根就不会被加载!用了这招,你就能回到那个“没有监控”的快乐时代了。
不过我得提醒大家,现在的系统基本都默认阻止v2版本了,而且就算你降级成功,很多新语法也用不了,我上次就为了一个反射调用,折腾了半天,最后发现v2根本不支持,心态直接崩了,所以啊,这招只能算是个“回忆杀”,实用价值真的不高。
第四招:程序集加载伪造——瞒天过海的“变身术”
这一招就有点技术含量了!既然AMSI会扫描我们加载的程序集,那我们就给它一个“假货”,具体怎么做呢?我们可以利用.NET的反射机制,先把恶意代码加密或者混淆,然后通过Reflection.Assembly.Load()动态加载,并且在加载之前,通过属性修改绕过AMSI的检查点。
我试过用随机密钥去XOR加密payload,然后在内存里解密再加载,那一瞬间,看着AMSI像个傻子一样扫来扫去却什么也发现不了,心里那叫一个爽!不过嘛,这招对代码水平要求挺高的,你要是基本功不扎实,写出来的加密逻辑可能比明文还容易暴露。
第五招:利用WMI或COM对象——借刀杀人的“旁门左道”
有时候啊,我们不一定要直接跟AMSI硬刚,可以换个思路,利用系统自带的组件来绕过去,比如WMI(Windows Management Instrumentation)或者COM对象,它们有些可能不在AMSI的监控范围内。
我当时尝试过用WMI来执行命令,虽然过程繁琐无比,但在某些特定环境下,确实能成为一条“漏网之鱼”,那感觉就像是你跟保安硬碰硬打不过,但偷偷从隔壁狗洞钻过去,虽然狼狈,但好歹进去了啊!
终极大实话奉上!
兄弟们,列了这么多AMSI绕过技巧,其实我最想说的是:没有万能的绕过,只有不变的军备竞赛!今天你绕过去了,明天微软一更新补丁,你的招数可能就变成废铁了。
所以啊,与其钻研这些“旁门左道”,不如多学学真正的东西,比如搞清楚AMSI到底监测的是什么、自己的工具特征在哪里、如何做行为分析和日志规避,这就像追妹子一样,光靠小聪明赢来的好感不长久,你得真正懂她才行!
好了,就说这么多吧,这些都是我拿头发换来的实战经验啊!你们要是有什么更好的思路,欢迎来评论区扯扯淡,但记得,技术无罪,但别乱搞事情啊!咱们下次见!