⼀、免杀基础知识
1. 免杀语⾔的选择
(1)常⻅免杀语⾔特点
(2)免杀语⾔选择总结
2. 常⻅的杀软及其特点
(1)常⻅的杀软
(2)常⻅杀软的组合
(3)常⻅杀软特点总结
3. C2 状况简述
4. 免杀加载器原理
⼆、杀软测试环境
1. 安装杀软虚拟机测试环境
(1)Windows Defender 环境安装
(2)⽕绒环境安装 (3)360安全卫⼠环境安装
(4)360杀毒环境安装
(5)卡巴斯基环境安装
2. 在线查杀环境
三、Visual Studio 安装和使⽤
1. Visual Studio 安装
2. Visual Studio 基本使⽤
(1)调试
(2)正式打包⽣成
本篇文章来自公众号:锦鲤安全
锦鲤安全的技术文章仅供参考,此文所提供的信息仅供网络安全人员学习和参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。如有侵权烦请告知,我们会立即删除并致歉。本文所提供的工具仅用于学习,禁止用于其他,请在24小时内删除工具文件!谢谢!
由于毕设、工作和其他的一些原因导致两个月没发帖了,后面将重回正轨,继续写一些免杀技术的文章,但是由于后面的内容会越来越难,还缺少一篇免杀基础教程的文章,所以现在先补一篇免杀基础文章。
内容比较长分为几篇发布:
第一篇讲解免杀基础知识、杀软环境安装和 VS2022 IDE 安装和使用。
第二篇讲解免杀加载器的编写和新手常见问题解答。
第三篇,看情况可能会有第三篇
1. 免杀语言的选择
常见的用来制作免杀语言有 C/C++、C#、Powershell、Python、Go、Rust:
C/C++:使用最多也是制作免杀的首选语言,很多高级的免杀技术都是使用 C/C++来实现,Github 上很多高星的、优秀的免杀项目也是使用 C/C++来实现。
C#:结合了 C++ 的性能和 Java 的易用性,通过 .NET 框架来访问各种API,写起免杀来更为简单,但是基于.NET框架的语言也比其他语言更容易被检测到。
Powershell:基于.NET 框架的脚本语言,可以很方便的执行,也可以很容易的将 Powershell脚本转为 C# 程序,同 C# 一样也容易被检测到,2.0以上版本需绕过AMSI。
Python:语法简单,写起来容易,大部分学免杀的新手都会 Python,认为 Python 容易,自己也懂Python,于是从 Python 开始学免杀,而结果恰恰相反,Pyhon 写起免杀来比C/C++还要复杂,在 C/C++中可以直接调用 Windows API,在 Python 中则要通过一层转化间接调用 Windows API,而且 Python 打包的程序报毒比较高,体积比较大。
Go:适合编写高性能的网络应用程序,很多内网穿透工具和漏洞扫描工具如 Frp、Fscan 等都使用 Go 进行开发,学习 Go 语言免杀可以对这些工具进行免杀。
Rust:Rust 性能同 C/C++,结构比较整洁但是语法复杂,不适合新手选择。
总结一下,如果你想学好免杀,那么一定要从 C/C++ 开始入手,用 C/C++ 写免杀不需要特别精通,有 C 语言基础就行了,刚开始入门比较难,但是后面要轻松很多,大部分免杀技术的源代码都是 C/C++,想学会免杀必须要看懂别人写的代码才行。
学会 C/C++ 免杀后,触类旁通,转其他语言免杀如 Powershell、GO 等也很容易,原理都是差不多的,都是调用Windows API。
Python 不适合用来制作免杀,写起来复杂体积又大报毒又高,玩玩就好了。
C#、Powershell 可以学一下,适合在渗透环境中使用,但是要注意.net版本。
Go 也一样写起来复杂体积比 Python 小一点但是同样很大,但是很多内网工具都是使用 Go 写的,学会 Go 后可以对这些工具进行免杀,因此值得学一学。
Rust 没用过,听比较多的就是写起来很复杂,但是不像 C/C++ 一样代码一多就容易乱,Rust 代码整洁比较有逼格。。
杀毒软件也就是AV(反病毒软件:Anti Virus),国内外常见的主流杀毒软件有火绒、360、Windows Defender(windows 安全中心,简称 wdf)、卡巴斯基、ESET、Norton(诺顿)、Symantec(赛门铁克)、McAfee(麦咖啡)。
国外的杀软一般比较强,国内的杀软偏弱,360属于国内最强的一梯队了。
国内比较常见的有火绒、360、Windows Defender,其它的不太常见但是可能遇到的有 Norton,还有些杂七杂小众杀软如电脑管家、金山毒霸等。
国外免杀项目我做的比较少,目前见到的就是 Windows Defender、卡巴斯基了。
一般能免杀火绒、360、Windows Defender、卡巴斯基这四个杀软,那么免杀其它杀软问题也不大。
一台 Windows 上有杀软的话,一般不只安装一个杀软,常见的是同时安装两到三个杀软的组合。
国内常见的两种杀软组合有:
火绒、360
火绒、Windows Defender
Windows Defender、360杀毒
杀软一般通过一下几点来检测恶意软件和行为:
静态查杀:最基本的查杀方式,主要通过对文件的特征码进行扫描,匹配已知的病毒特征库。如果发现文件特征码与病毒特征库中的某个病毒特征码相匹配,就判断该文件为病毒;部分杀软会在静态查杀时将程序放入沙箱中运行几秒的方式以检测程序是否是恶意程序。
动态(主动)查杀:通过在程序运行时扫描程序内存是否匹配病毒特征的方式主动发现恶意程序。在 EDR 中还会挂钩敏感的 Windows API,在程序调用到被挂钩的 API 时检查函数参数和调用栈以检测恶意程序。
流量监控:监控网络流量,分析网络数据包,如果发现异常流量或者已知的恶意流量特征,就可能是恶意软件在进行网络活动。
行为监控:监控程序的运行行为,如文件操作、注册表操作等。如果发现某个程序的行为超出了正常范围,就可能是恶意软件。
常见杀软特点如下:
火绒:静态查杀能力弱,没有动态查杀,横向移动防护比较强,frp 等内网穿透工具会受到影响。
360安全卫士/360杀毒:静态查杀能力较强,没有动态查杀,如果开启了核晶模式,则行为查杀比较强,注入进程等敏感行为会被拦截;核晶模式在物理机中默认开启,在虚拟机中默认关闭。
360QVM:360QVM 简单的说就是使用了机器学习辅助查杀,在360杀毒引擎设置中开启 360QVM 后静态查杀会变得非常流氓,有一点特征就会被查杀。
Windows Defender:静态查杀能力较强,动态查杀较强,监控 HTTP 流量。
卡巴斯基:普通版静态查杀能力一般,企业版静态查杀能力较强,动态查杀较强。
ESET:静态查杀能力较强,没有动态查杀。
行为监控是杀软的标配了,所以没有特殊的点上面将不再列出。
按照静态查杀能力强弱排列如下:
火绒 < 360安全卫士、360杀毒、Windows Defender、卡巴斯基标准版 < 卡巴斯基企业版、ESET < 360QVM
。
目前见过静态查杀能力最强的属360QVM,连国外的杀软都有所不及,可以说360QVM是非常流氓的了。
按照动态查杀能力强弱排列如下:
火绒、360、ESET < 卡巴斯基 < Windows Defender
。
火绒、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、Windows Defender、和卡巴斯基等杀软上线是没什么问题的了,但是在注入进程时还是会受到影响,因为加载器无法对注入进程内存的特征进行隐藏,不过由于现在反射 dll 注入技术的发展,通过反射 dll 注入技术可以对注入进程的内存特征进行隐藏,而 CS 支持用户自定义自己的反射 dll 注入技术,一定程序上进行了弥补。
当然,通过免杀加载器虽然上线了,但是行为上还是比较容易被杀的,比如一执行命令就被杀,这种情况多数是加载器隐藏特征不彻底,造成了内存泄露从而被杀软扫描到了,可以通过对内存进行修补来解决;另一种情况是触发了敏感行为从而被杀软拦截了,高级的加载器可以一定程度上更改 C2 行为从而避免杀软拦截,也可以尝试更换行为特征更少的 C2 来解决。
要测试免杀是否有效少不了安装杀软环境进行测试,这里讲了安装火绒、360卫士、360杀毒、wdf、卡巴斯基杀软环境的一些注意的点,安装其他杀软环境大同小异。
我习惯是将火绒、360卫士、360杀毒放在一个虚拟机中,wdf 单独一个虚拟机,卡巴斯基单独一个虚拟机。新手的话可以将火绒和360卫士单独放一个虚拟机。
同时创建多个虚拟机可能会导致硬盘内存不足,我们可以创建一个 wdf 虚拟机环境,然后使用克隆:
然后选择链接克隆,这样创建速度快而且占用的内存比较少:
安装完各个杀软之后,可以通过右键菜单对文件进行静态扫描:
直接创建一个 Windows10 Pro 版的虚拟机即可。
创建好之后进行一次 Windows 更新:
更新完之后,关闭 Windows 安全中心的管理设置中关闭自动上传样本:
不然还没等你写完免杀就被上传分析透了,写完之后就更不可能免杀了。
之后就可以复制免杀到虚拟机中测试了,测试之前先更新一下病毒库:
官网上直接下载个人免费安装包进行安装即可:
如果能更新版本就更新版本。
360直接从官网上下载安装即可,立即体验是安装360卫士,安全套装是同时安装360卫士和360杀毒:
在360设置中,取消勾选“360用户体验改善计划”和“云安全计划”:
取消勾选“开启 Defender”:
取消勾选“自动上传可疑代码”:
点击核晶防护去去管理按钮,可以看到核晶模式在虚拟机中是关闭的,且无法打开:
在虚拟机关机后在设置中打开虚拟化 Intel VT-x/EPT:
之后开机就能打开360核晶模式了。
点击查杀引擎,把 QVM 引擎和鲲鹏引擎打开:
360QVM 比较流氓,被 360QVM 查杀时,病毒类型名称前面会有 QVM 字样的前缀。
在虚拟机中安装360尽量不要恢复镜像,360在线云查杀不稳定,恢复镜像后可能会出现在本地测试过了,发送给其他人测试时报毒的情况。
官网上下载安装360杀毒。
在设置中取消勾选如下三项:
这里有一个坑,关闭360杀毒后一定要再打开看一遍,有没有真的取消勾选。
在多引擎设置中勾选所有引擎,可以看到其中的360QVM引擎:
卡巴斯基要安装企业版的进行测试,卡巴斯基要付费使用,可以在卡饭论坛找到破解版和循环试用工具,如果你有钱也可以支持正版,不必要最新版的,旧版本的企业版也行,在文章末尾可以下载卡巴企业11.6破解版。
直接安装即可,没有什么需要设置的。
安装完成之后更新一下数据库,更新之前要保存一下虚拟机镜像,如果更新后激活失效了就恢复镜像:
如果更新后激活失效了,不更新也没什么,卡巴的静态扫描一般般,我的卡巴数据库三个月没更新了,不过影响不大。
相比于本地搭建杀软环境,在线查杀环境用有比较全名的杀软环境,将文件上传到在线查杀环境会有几十个杀软同时对文件进行静态查杀,用来测试静态免杀能力更能装逼有说服力。
VirusTotal (https://www.virustotal.com/)是比较有名的在线杀网站,有70多个杀软环境及多个沙箱进行检测,但是上传的文件会被共享分析,被上传的免杀很快就会失效,因此不要随便将免杀上传到 VT。当然,话虽如此我还是经常上传分析,不过是本地分离、远程加载或在最后一步不能正常执行的,最好不要上传完整的免杀。
微步沙箱(https://s.threatbook.com/),和 VT 差不多,不同的是能看到更多信息:
VirScan(https://www.virscan.org/)是次一些的在线查杀环境,只有不到50个杀软环境,但是上传的文件不会被公开,更建议新手使用。
在线查杀环境中个别杀软只要你没有正规签名不管三七二十一就报毒或是报毒误差比较大的不具备参考价值,如果不是为了装比,一般只要能静态免杀前面说到的几个杀软就足够了,上传到在线查杀网站的意义不大还有可能提前暴露。
学习 C/C++ 免杀,安装相应的 IDE 环境是必不可少的,这里会讲解 Visual Studio IDE 环境安装要注意的点和使用技巧。
Visual Studio 直接从官网下载最新版本安装即可,VS 安装占用空间比较大,建议更改保存位置到 D 盘。
安装选择组件时,把可勾选的编译器勾选上,包括 v140、v141、v142 编译器:
还有 clang 编译器:
为什么需要安装这么多编译器?
不同编译器编译后的代码不同,报毒情况也不相同,有的编译器编译的 exe 在 VT 上的报毒比较高,如 v143 编译器编译的空包 exe 通常有几十个报毒,而有的编译器编译的 exe 在 VT 上的报毒比较低,可以自己尝试一下那种编译器报毒比较低,选一个报毒低的编译器来编译。
建议安装 Intel C++ 编译器,Intel 的编译器有一些优点,比如支持 64 位内联汇编,如果搜索 Intel 没有任何内容,也可以参照我的另一篇帖子进行安装:
之后安装好 VS,新建一个控制台项目:
在【项目】-> 【属性】中的【常规】下的【平台工具集】中就可以切换我们刚刚安装的编译器了:
回到代码页面,上边是菜单栏,左边是解决方案管理器,右边是选择的文件属性,下边是编译的输出和错误列表等:
VS 支持中文界面,大部分功能直接看也能看得出来如何使用,因此我也不多讲了,只讲一些要注意的点和使用技巧。
调试是一定要会的,开发时经常会出现各种问题,通过调试可以很方便的找出问题点。
编译生成有 Debug 模式和 Release 模式,Debug 模式是测试时使用的模式,Release 模式是正式发布时使用的模式:
Debug 模式和 Release 模式都有自己的项目属性,修改 Debug 模式的项目属性不会影响到 Release 模式,且两个模式的默认项目属性值不同,VS 已经帮我们做了一些设置:
Debug 模式也叫调试模式,Release 模式也叫发布模式。
在 Debug 模式里我们可以在代码左边打断点,然后点击 Local Windows Debugger 按钮编译并使用调试器执行:
执行到我们的断点时就会中断执行并等待用户输入指令:
逐语句,会逐行执行接下来要执行的所有语句,当遇到函数时就会进入函数内:
逐过程,会执行当前的要执行的所有语句,执行到函数调用时忽略函数内的代码直接到下一行:
跳出,跳出当前函数:
在中断时,可以在反汇编窗口查看当前执行代码的汇编:
汇编非常重要,一定要学会汇编代码,起码要能看懂汇编,在调试时经常会遇到一些莫名其妙的错误,看原代码不能看出来,这些错误是发生在汇编层面,由于编译器会对汇编代码做一些优化导致出现错误,这些错误只能通过查看汇编代码来排查。
上方的是内存窗口,输入地址可以查看其内存:
当我们将鼠标放到当前以执行的变量名上时,可以查看该变量地址和内容:
选择该变量并拖到内存窗口或在地址中直接输入变量名并回车就可以查看该变量内存:
可以看到 a 的16进制内存48 65 6c 6c 6f 20 57 6f 72 6c 64 21 0a 00
并在右边看到 ascii 码内容为“Hello World!”:
当正在查看的内存发生更改时就会变红:
内存窗口用于查看内容有没有被正确的修改非常有用,如远程加载 shellcode 有没有成功、shellcode 有没有被正确的解密。
在【调试】-> 【窗口】-> 【内存】中可以打开多个内存窗口,以方便同时查看多个地址内存,避免频繁更改内存地址:
在寄存器窗口可以查看寄存器的值,还是那句话,学会汇编非常重要:
还有更多的调试窗口可以自己在【调试】-> 【窗口】中打开,如线程窗口,查看当前线程:
模块窗口,查看已加载的 dll 模块:
VS 自带的调试器能力有限,想要查看更详细的信息需要借助其他工具来调试了,启用调试进行打包时会在输出目录下生成调试.pdb
文件,其他工具可借助该文件来调试,如 Windbg 等。
正式打包生成打包生成时要用 Release 模式进行打包生成,但是在使用 Release 模式进行打包时要注意几个点。
前面讲了,Debug 模式用于调试,Release 模式用于正式打包生成,但是在使用 Release 模式模式时也可以进行调试,Release 模式并没有完全关闭调试:
Release 模式仍然启用了调试,在启用调试进行打包时会在 PE 文件中留下调试信息。
PE文件的全称是Portable Executable,意为可移植的可执行的文件,常见的EXE、DLL、OCX、SYS、COM都是PE文件,PE文件是微软Windows操作系统上的程序文件(可能是间接被执行,如DLL)
使用 PE bear 可以查看到在调试信息中留下了文件编译时的路径,如果路径中包含名字、QQ等敏感信息就会成为一个溯源的点:
所以免杀编译编译时一定要在项目属性中关闭调试,在 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 模式则体积会增大 100 KB 左右,同时使用 /MT 模式在 VT 上引起的报毒也比较高。
为什么要用 /MT 模式打包?
在一些旧版 Windows 和 Windows Server 系统上不存在 MSVCRT.DLL,导致打包的文件在执行时提示 dll 缺失无法运行,如果你只在较新的系统上运行,那么可以使用 /MD 模式打包,如果你需要在所有 Windows 系统上运行,那么就要考虑谦容性问题,使用 /MT 模式打包。
还有一点,如无必要都将【链接器】下的【生成清单】改成否:
因为打开该选项会增加 VT 报毒,前面一直是启用清单的查杀,后面一张是没有使用清单的查杀:
可以看到没有使用清单的查杀报毒明显更低。
当清单文件的【生成清单】为是,【UAC 执行级别】为 requireAdministrator 时:
生成的 exe 就会在有 UAC 的环境中显示盾牌图标:
运行时将会自动申请管理员权限执行,如果有 UAC 则会弹出 UAC 界面:
关注公众号回复:
31118