常见的用来制作免杀语言有C/C++、C#、Powershell、Python、Go、Rust:
总结一下,如果你想学好免杀,那么一定要从C/C++开始入手,用C/C++写免杀不需要特别精通,有C语言基础就行了,刚开始入门比较难,但是后面要轻松很多,大部分免杀技术的源代码都是C/C++,想学会免杀必须要看懂别人写的代码才行。
学会C/C++免杀后,触类旁通,转其他语言免杀如Powershell、GO等也很容易,原理都是差不多的,都是调用WindowsAPI。
Python不适合用来制作免杀,写起来复杂体积又大报毒又高,玩玩就好了。
C#、Powershell可以学一下,适合在渗透环境中使用,但是要注意.net版本。
Go也一样写起来复杂体积比Python小一点但是同样很大,但是很多内网工具都是使用Go写的,学会Go后可以对这些工具进行免杀,因此值得学一学。
Rust没用过,听比较多的就是写起来很复杂,但是不像C/C++一样代码一多就容易乱,Rust代码整洁比较有逼格。。
杀毒软件也就是AV(反病毒软件:AntiVirus),国内外常见的主流杀毒软件有火绒、360、WindowsDefender(windows安全中心,简称wdf)、卡巴斯基、ESET、Norton(诺顿)、Symantec(赛门铁克)、McAfee(麦咖啡)。
国外的杀软一般比较强,国内的杀软偏弱,360属于国内最强的一梯队了。
国内比较常见的有火绒、360、WindowsDefender,其它的不太常见但是可能遇到的有Norton,还有些杂七杂小众杀软如电脑管家、金山毒霸等。
国外免杀项目我做的比较少,目前见到的就是WindowsDefender、卡巴斯基了。
一般能免杀火绒、360、WindowsDefender、卡巴斯基这四个杀软,那么免杀其它杀软问题也不大。
一台Windows上有杀软的话,一般不只安装一个杀软,常见的是同时安装两到三个杀软的组合。
国内常见的两种杀软组合有:
杀软一般通过一下几点来检测恶意软件和行为:
常见杀软特点如下:
行为监控是杀软的标配了,所以没有特殊的点上面将不再列出。
按照静态查杀能力强弱排列如下:
火绒<360安全卫士、360杀毒、WindowsDefender、卡巴斯基标准版<卡巴斯基企业版、ESET<360QVM。
目前见过静态查杀能力最强的属360QVM,连国外的杀软都有所不及,可以说360QVM是非常流氓的了。
按照动态查杀能力强弱排列如下:
火绒、360、ESET<卡巴斯基 火绒、360、ESET这几个没有动态查杀。 行为查杀有强有弱,而且不好比较,看自己体验吧。 常见的C2有CS(CobaltStrike)、MSF(Metasploit)、Ghost,比较小众的C2有Supershell、Manjusaka等,还有个人开发的C2。 CS、MSF是使用最多的远控,CS功能丰富还有图形页面,支持多人协作,可以通过c2profile文件修改流量特征,但是CS对linux的支持不友好,很多功能依赖进程注入,容易被杀软拦截,但是通过BOF插件可以一定程度进行弥补。 MSF模块丰富,命令行界面,支持平台较全,新手使用较难上手。 Ghost是Windows上的一个远古远控了,也叫大灰狼远控,功能比较简单,但由于是图形页面使用简单,在开源以后不断有人对其进行二开,其中二开最成功的就是银狐远控了;由于Ghost使用简单,不需要懂技术,因此常被黑灰产业的人员使用。Ghost在虚拟机玩一玩就好了,可以学一下源码,用来做项目就免了。 由于CS、MSF使用比较广泛,已经被各大杀软标记很多特征了,在这个基础上出现了很多小众的C2和个人开发的C2,这些C2都对CS、MSF特征进行了一定的修补,特征更少,免杀性能更好。 C2(Command&Control:命令和控制),通常指的是攻击者用来管理和控制僵尸网络或恶意软件的服务器。 加载器实际上就是对CS、MSF的特征进行隐藏以达到免杀的目的。使用加载器对CS的Shellcode进行免杀时,通过c2pfofile隐藏好流量上的特征,再通过加载器隐藏好内存上的特征,那么不论被标记了多少特征都是没影响的,免杀360、WindowsDefender、和卡巴斯基等杀软上线是没什么问题的了,但是在注入进程时还是会受到影响,因为加载器无法对注入进程内存的特征进行隐藏,不过由于现在反射dll注入技术的发展,通过反射dll注入技术可以对注入进程的内存特征进行隐藏,而CS支持用户自定义自己的反射dll注入技术,一定程序上进行了弥补。 当然,通过免杀加载器虽然上线了,但是行为上还是比较容易被杀的,比如一执行命令就被杀,这种情况多数是加载器隐藏特征不彻底,造成了内存泄露从而被杀软扫描到了,可以通过对内存进行修补来解决;另一种情况是触发了敏感行为从而被杀软拦截了,高级的加载器可以一定程度上更改C2行为从而避免杀软拦截,也可以尝试更换行为特征更少的C2来解决。 要测试免杀是否有效少不了安装杀软环境进行测试,这里讲了安装火绒、360卫士、360杀毒、wdf、卡巴斯基杀软环境的一些注意的点,安装其他杀软环境大同小异。 我习惯是将火绒、360卫士、360杀毒放在一个虚拟机中,wdf单独一个虚拟机,卡巴斯基单独一个虚拟机。新手的话可以将火绒和360卫士单独放一个虚拟机。 同时创建多个虚拟机可能会导致硬盘内存不足,我们可以创建一个wdf虚拟机环境,然后使用克隆: 然后选择链接克隆,这样创建速度快而且占用的内存比较少: 安装完各个杀软之后,可以通过右键菜单对文件进行静态扫描: 直接创建一个Windows10Pro版的虚拟机即可。 创建好之后进行一次Windows更新: 更新完之后,关闭Windows安全中心的管理设置中关闭自动上传样本: 不然还没等你写完免杀就被上传分析透了,写完之后就更不可能免杀了。 之后就可以复制免杀到虚拟机中测试了,测试之前先更新一下病毒库: 官网上直接下载个人免费安装包进行安装即可: 如果能更新版本就更新版本。 360直接从官网上下载安装即可,立即体验是安装360卫士,安全套装是同时安装360卫士和360杀毒: 在360设置中,取消勾选“360用户体验改善计划”和“云安全计划”: 取消勾选“开启Defender”: 取消勾选“自动上传可疑代码”: 点击核晶防护去去管理按钮,可以看到核晶模式在虚拟机中是关闭的,且无法打开: 在虚拟机关机后在设置中打开虚拟化IntelVT-x/EPT: 之后开机就能打开360核晶模式了。 点击查杀引擎,把QVM引擎和鲲鹏引擎打开: 360QVM比较流氓,被360QVM查杀时,病毒类型名称前面会有QVM字样的前缀。 在虚拟机中安装360尽量不要恢复镜像,360在线云查杀不稳定,恢复镜像后可能会出现在本地测试过了,发送给其他人测试时报毒的情况。 官网上下载安装360杀毒。 在设置中取消勾选如下三项: 这里有一个坑,关闭360杀毒后一定要再打开看一遍,有没有真的取消勾选。 在多引擎设置中勾选所有引擎,可以看到其中的360QVM引擎: 直接安装即可,没有什么需要设置的。 安装完成之后更新一下数据库,更新之前要保存一下虚拟机镜像,如果更新后激活失效了就恢复镜像: 如果更新后激活失效了,不更新也没什么,卡巴的静态扫描一般般,我的卡巴数据库三个月没更新了,不过影响不大。 相比于本地搭建杀软环境,在线查杀环境用有比较全名的杀软环境,将文件上传到在线查杀环境会有几十个杀软同时对文件进行静态查杀,用来测试静态免杀能力更能装逼有说服力。 在线查杀环境中个别杀软只要你没有正规签名不管三七二十一就报毒或是报毒误差比较大的不具备参考价值,如果不是为了装比,一般只要能静态免杀前面说到的几个杀软就足够了,上传到在线查杀网站的意义不大还有可能提前暴露。 学习C/C++免杀,安装相应的IDE环境是必不可少的,这里会讲解VisualStudioIDE环境安装要注意的点和使用技巧。 VisualStudio直接从官网下载最新版本安装即可,VS安装占用空间比较大,建议更改保存位置到D盘。 安装选择组件时,把可勾选的编译器勾选上,包括v140、v141、v142编译器: 还有clang编译器: 为什么需要安装这么多编译器? 不同编译器编译后的代码不同,报毒情况也不相同,有的编译器编译的exe在VT上的报毒比较高,如v143编译器编译的空包exe通常有几十个报毒,而有的编译器编译的exe在VT上的报毒比较低,可以自己尝试一下那种编译器报毒比较低,选一个报毒低的编译器来编译。 建议安装IntelC++编译器,Intel的编译器有一些优点,比如支持64位内联汇编,如果搜索Intel没有任何内容,也可以参照我的另一篇帖子进行安装: 之后安装好VS,新建一个控制台项目: 在【项目】->【属性】中的【常规】下的【平台工具集】中就可以切换我们刚刚安装的编译器了: 回到代码页面,上边是菜单栏,左边是解决方案管理器,右边是选择的文件属性,下边是编译的输出和错误列表等: VS支持中文界面,大部分功能直接看也能看得出来如何使用,因此我也不多讲了,只讲一些要注意的点和使用技巧。 调试是一定要会的,开发时经常会出现各种问题,通过调试可以很方便的找出问题点。 编译生成有Debug模式和Release模式,Debug模式是测试时使用的模式,Release模式是正式发布时使用的模式: Debug模式和Release模式都有自己的项目属性,修改Debug模式的项目属性不会影响到Release模式,且两个模式的默认项目属性值不同,VS已经帮我们做了一些设置: Debug模式也叫调试模式,Release模式也叫发布模式。 在Debug模式里我们可以在代码左边打断点,然后点击LocalWindowsDebugger按钮编译并使用调试器执行: 执行到我们的断点时就会中断执行并等待用户输入指令: 逐语句,会逐行执行接下来要执行的所有语句,当遇到函数时就会进入函数内: 逐过程,会执行当前的要执行的所有语句,执行到函数调用时忽略函数内的代码直接到下一行: 跳出,跳出当前函数: 在中断时,可以在反汇编窗口查看当前执行代码的汇编: 汇编非常重要,一定要学会汇编代码,起码要能看懂汇编,在调试时经常会遇到一些莫名其妙的错误,看原代码不能看出来,这些错误是发生在汇编层面,由于编译器会对汇编代码做一些优化导致出现错误,这些错误只能通过查看汇编代码来排查。 上方的是内存窗口,输入地址可以查看其内存: 当我们将鼠标放到当前以执行的变量名上时,可以查看该变量地址和内容: 选择该变量并拖到内存窗口或在地址中直接输入变量名并回车就可以查看该变量内存: 可以看到a的16进制内存48656c6c6f20576f726c64210a00并在右边看到ascii码内容为“HelloWorld!”: 当正在查看的内存发生更改时就会变红: 内存窗口用于查看内容有没有被正确的修改非常有用,如远程加载shellcode有没有成功、shellcode有没有被正确的解密。 在【调试】->【窗口】->【内存】中可以打开多个内存窗口,以方便同时查看多个地址内存,避免频繁更改内存地址: 在寄存器窗口可以查看寄存器的值,还是那句话,学会汇编非常重要: 还有更多的调试窗口可以自己在【调试】->【窗口】中打开,如线程窗口,查看当前线程: 模块窗口,查看已加载的dll模块: VS自带的调试器能力有限,想要查看更详细的信息需要借助其他工具来调试了,启用调试进行打包时会在输出目录下生成调试.pdb文件,其他工具可借助该文件来调试,如Windbg等。 正式打包生成打包生成时要用Release模式进行打包生成,但是在使用Release模式进行打包时要注意几个点。 前面讲了,Debug模式用于调试,Release模式用于正式打包生成,但是在使用Release模式模式时也可以进行调试,Release模式并没有完全关闭调试: Release模式仍然启用了调试,在启用调试进行打包时会在PE文件中留下调试信息。 PE文件的全称是PortableExecutable,意为可移植的可执行的文件,常见的EXE、DLL、OCX、SYS、COM都是PE文件,PE文件是微软Windows操作系统上的程序文件(可能是间接被执行,如DLL) 所以免杀编译编译时一定要在项目属性中关闭调试,在Release项目属性的【链接器】中把【生成调试信息】改成否: 这样打包之后再PE文件中就看不到调试信息了: 再有一点是,最好使用/MT模式打包,再【C/C++】->【代码生成】->【运行库】中把默认的/MD模式改成/MT模式: 什么是/MD模式与/MT模式? C/C++运行时依赖MSVCRT.DLL才能运行,/MD模式就是在运行时动态从系统环境中加载MSVCRT.DLL,/MT模式即将MSVCRT.DLL打包进可执行文件中,运行时不再依赖外部的MSVCRT.DLL。 使用/MD模式与/MT模式有什么优缺点? /MD模式由于MSVCRT.DLL从外部加载,因此打包体积比较小,使用/MT模式则体积会增大100KB左右,同时使用/MT模式在VT上引起的报毒也比较高。 为什么要用/MT模式打包? 在一些旧版Windows和WindowsServer系统上不存在MSVCRT.DLL,导致打包的文件在执行时提示dll缺失无法运行,如果你只在较新的系统上运行,那么可以使用/MD模式打包,如果你需要在所有Windows系统上运行,那么就要考虑谦容性问题,使用/MT模式打包。 还有一点,如无必要都将【链接器】下的【生成清单】改成否: 因为打开该选项会增加VT报毒,前面一直是启用清单的查杀,后面一张是没有使用清单的查杀: 可以看到没有使用清单的查杀报毒明显更低。 当清单文件的【生成清单】为是,【UAC执行级别】为requireAdministrator时: 生成的exe就会在有UAC的环境中显示盾牌图标: 运行时将会自动申请管理员权限执行,如果有UAC则会弹出UAC界面: