找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

4724

积分

0

好友

647

主题
发表于 4 小时前 | 查看: 2| 回复: 0

本文旨在为网络安全学习者提供基础知识与技术实践参考,所有操作请在合法授权的环境中进行。

前言

在经历了一段时间的停更后,我们将重新开始更新免杀技术相关的系列文章。后续内容的技术深度会逐渐增加,因此有必要先补上一篇基础性的入门教程,为后续学习铺平道路。本篇内容较长,将分为多部分发布:

  1. 第一篇(本文):讲解免杀基础知识、杀软测试环境搭建以及 Visual Studio 2022 的安装与核心使用技巧。
  2. 第二篇:讲解免杀加载器的编写原理及新手常见问题解答。
  3. 第三篇:视情况而定,可能会探讨更深层次的主题。

一、免杀基础知识

1. 免杀语言的选择

(1)常见免杀语言特点

常用于制作免杀的程序语言包括 C/C++、C#、Powershell、PythonGo、Rust,它们各有特点:

  • C/C++:这是使用最广泛且通常是制作免杀的首选语言。许多高级免杀技术都基于 C/C++ 实现,GitHub 上众多高星、优秀的免杀项目也多采用此语言。
  • C#:它结合了 C++ 的性能与 Java 的易用性,通过 .NET 框架可以方便地调用各种 API,编写免杀逻辑相对简单。但基于 .NET 框架的语言也往往比其他语言更容易被检测。
  • Powershell:基于 .NET 框架的脚本语言,执行方便,也可较容易地转换为 C# 程序。与 C# 类似,容易被检测,且 2.0 以上版本需要绕过 AMSI(反恶意软件扫描接口)。
  • Python:语法简单,易于上手,因此很多刚接触免杀的新手会首选 Python。然而实际情况可能相反,用 Python 编写免杀有时比 C/C++ 更复杂。在 C/C++ 中可以直接调用 Windows API,而 Python 则需要通过一层封装间接调用。此外,Python 打包的程序体积通常较大,且容易被查杀。
  • Go:适合编写高性能网络应用,许多内网穿透和漏洞扫描工具(如 Frp、Fscan)都使用 Go 开发。学习 Go 语言免杀有助于对这些工具进行定制化免杀处理。
  • Rust:性能可与 C/C++ 媲美,代码结构整洁,但语法较为复杂,对新手不太友好。

(2)免杀语言选择总结

如果你想系统性地学习免杀,强烈建议从 C/C++ 开始。使用 C/C++ 进行免杀开发并不要求你成为专家,具备基础的 C 语言知识即可。初期入门可能有些挑战,但一旦掌握,后续会轻松许多。更重要的是,大部分免杀技术的源码都是 C/C++,想要真正学会,必须能读懂别人的代码。

掌握了 C/C++ 免杀的核心思想后,再转向其他语言如 Powershell、Go 等就会触类旁通,因为其底层原理相似,都是围绕 Windows API 的调用展开。

  • Python 并不适合作为制作免杀的主力语言,它编写复杂、体积大、查杀率高,偶尔尝试可以,但不宜作为主要方向。
  • C# 和 Powershell 值得一学,它们在渗透测试环境中使用方便,但需注意 .NET 版本兼容性问题。
  • Go 语言编写的程序体积比 Python 小,但仍相对较大。由于许多优秀的内网工具使用 Go 开发,学习 Go 免杀有助于对这些工具进行改造,因此具有学习价值。
  • Rust 笔者使用不多,普遍反馈是语法复杂,但代码组织结构比 C/C++ 更清晰、更“优雅”。

2. 常见的杀软及其特点

(1)常见的杀软

杀毒软件(Antivirus, AV)种类繁多。国内外主流杀软包括火绒、360、Windows Defender(简称 WDF)、卡巴斯基、ESET、诺顿、赛门铁克、麦咖啡等。

通常,国外杀软的检测能力较强,国内杀软中,360 属于第一梯队。国内常见组合多为火绒、360 和 Windows Defender。其他可能遇到的还有诺顿以及一些用户量较小的软件,如电脑管家、金山毒霸等。

就笔者经验而言,如果制作的免杀能够绕过 火绒、360、Windows Defender、卡巴斯基 这四款杀软,那么应对其他大多数杀软也问题不大。

(2)常见杀软的组合

一台 Windows 主机上往往不会只安装一款杀软,常见的组合是两到三款同时运行。国内常见的组合有:

  • 火绒 + 360
  • 火绒 + Windows Defender
  • Windows Defender + 360杀毒

(3)常见杀软特点总结

杀软通常通过以下几种方式检测恶意软件和行为:

  1. 静态查杀:最基本的方式,通过扫描文件特征码,与已知病毒特征库进行匹配。部分杀软会在静态扫描时,将程序放入沙箱运行数秒以观察行为。
  2. 动态(主动)查杀:在程序运行时,扫描其内存是否匹配病毒特征。在高级的终端检测与响应(EDR)系统中,还会挂钩(Hook)敏感的 Windows API,当程序调用这些 API 时,检查其参数和调用栈。
  3. 流量监控:分析网络数据包,识别异常或已知的恶意流量模式。
  4. 行为监控:监控程序的运行行为,如文件操作、注册表修改等,一旦发现异常行为即可能判定为恶意。

各常见杀软特点如下:

  • 火绒:静态查杀能力较弱,无动态查杀功能。但其横向移动防护较强,可能会影响 frp 等内网穿透工具的正常使用。
  • 360安全卫士/360杀毒:静态查杀能力较强,无动态查杀。若开启“核晶防护”模式,则行为查杀能力会大幅增强,注入进程等敏感操作容易被拦截。该模式在物理机上默认开启,在虚拟机中通常默认关闭。
  • 360QVM:这是 360 利用机器学习辅助查杀的引擎。在 360 杀毒设置中开启 QVM 后,静态查杀会变得异常敏感,稍有特征即可能被报毒。
  • Windows Defender:静态查杀能力较强,动态查杀能力也强,并且会监控 HTTP 流量。
  • 卡巴斯基:标准版静态查杀能力一般,企业版则较强。动态查杀能力优秀。
  • ESET:静态查杀能力强,但无动态查杀功能。

(行为监控是杀软标配,以上未特别列出)

静态查杀能力大致排序如下:
火绒 < 360安全卫士、360杀毒、Windows Defender、卡巴斯基标准版 < 卡巴斯基企业版、ESET < 360QVM
目前遇到的静态查杀最强的是 360QVM,其敏感度甚至超过一些国外杀软。

动态查杀能力大致排序如下:
火绒、360、ESET < 卡巴斯基 < Windows Defender
其中,火绒、360、ESET 基本不具备动态查杀能力。

行为查杀能力强弱因产品而异,且不好直接比较,需自行体验。

3. C2 状况简述

常见的命令与控制(C2)工具有 CobaltStrike (CS)、Metasploit (MSF)、Ghost,以及一些相对小众的如 Supershell、Manjusaka 等,还有个人开发的 C2。

  • CS 和 MSF 是最常用的远控。CS 功能丰富,有图形界面,支持多人协作,可通过 c2profile 文件修改流量特征。但其对 Linux 支持不佳,且很多功能依赖进程注入,易被拦截,不过可以通过 BOF 插件进行一定弥补。
  • MSF 模块极多,采用命令行界面,支持平台全面,但对新手来说上手较难。
  • Ghost 是一款古老的 Windows 远控(也称“大灰狼”),功能简单,图形化界面易于操作。开源后涌现了许多二次开发版本,其中“银狐远控”较为成功。因其使用简单、无需深厚技术背景,常被黑灰产人员使用。仅供学习研究,请勿用于非法用途。
  • 由于 CS 和 MSF 使用广泛,其特征已被各大杀软充分标记。因此出现了许多小众或个人开发的 C2,它们对原有特征进行了规避和修补,特征更少,免杀性更好。

4. 免杀加载器原理

C2(命令与控制)通常指攻击者管理僵尸网络或恶意软件的服务器。免杀加载器的核心目的,就是隐藏 CS、MSF 等工具在内存和流量上的特征。

当使用加载器处理 CS 的 Shellcode 时,若能通过 c2profile 隐藏流量特征,再通过加载器隐藏内存特征,那么即使原始载荷被标记了大量特征,也能有效绕过检测,实现在 360、Windows Defender、卡巴斯基等杀软下的上线。

然而,在注入进程环节仍可能受到阻碍,因为加载器难以隐藏注入到目标进程内存中的特征。不过,随着反射 DLL 注入技术的发展,这个问题得到了一定程度的解决。CS 支持用户自定义反射 DLL 注入方式,这为绕过行为检测提供了更多可能。

当然,即使成功上线,程序的行为仍可能触发杀软。例如,一执行命令就被杀,这通常是因为加载器隐藏特征不彻底导致内存泄露,或被扫描到敏感内存区域。这需要对内存进行更精细的修补。另一种情况是触发了杀软的敏感行为规则。高级的加载器可以尝试更改 C2 的行为模式来规避拦截,或者考虑更换行为特征更少的 C2 框架。

二、杀软测试环境

测试免杀效果离不开真实的杀软环境。本节将介绍搭建火绒、360、Windows Defender、卡巴斯基测试环境时需要注意的要点,其他杀软的安装大同小异。

1. 安装杀软虚拟机测试环境

建议将不同的杀软安装在不同的虚拟机中以便隔离测试。例如,可以将火绒、360卫士、360杀毒放在一个虚拟机里,Windows Defender 单独一个,卡巴斯基也单独一个。对于新手,也可以将火绒和 360 卫士分开。

同时创建多个虚拟机可能消耗大量磁盘空间。一个高效的方法是先创建一个干净的 Windows Defender 虚拟机作为模板,然后使用“链接克隆”功能快速创建多个副本。这种方法创建速度快,且占用磁盘空间较少。

VMware虚拟机管理界面

在克隆时选择“创建链接克隆”:

VMware链接克隆选项

安装完杀软后,通常可以通过右键菜单对文件进行快速静态扫描:

右键菜单杀毒选项

(1)Windows Defender 环境安装

直接创建一个 Windows 10 Pro 版本的虚拟机即可。创建完成后,务必进行一次系统更新,以确保病毒库为最新。

Windows更新界面

更新后,进入 Windows 安全中心,在“病毒和威胁防护设置”中,关闭“自动提交样本”选项。

关闭Windows Defender自动提交样本

这是为了防止你的测试样本被自动上传到微软云端进行分析,导致特征被快速捕获,使后续免杀失效。

测试前,记得手动更新一下病毒库:

更新Windows Defender病毒库

(2)火绒环境安装

从官网下载个人免费版安装包直接安装即可。

火绒安全官网

安装后,如果提示更新,建议更新到最新版本。

(3)360安全卫士环境安装

从官网下载安装。“立即体验”按钮安装的是360安全卫士,“安全套装”则会同时安装360安全卫士和360杀毒。

360安全卫士官网

安装后需要进行几项关键设置(在“360设置中心”):

  1. 取消勾选“360用户体验改善计划”和“云安全计划”。
    360用户体验与云安全计划设置
  2. 取消勾选“开启 Defender”(避免与系统自带杀软冲突)。
    360开启Defender设置
  3. 在“安全防护中心”的“网页安全防护”中,取消勾选“自动上传可疑代码到360安全中心”。
    360自动上传可疑代码设置

关于“核晶防护”模式:在虚拟机中,该模式默认关闭且通常无法直接开启。需要先关闭虚拟机,在VMware设置中为处理器开启“虚拟化 Intel VT-x/EPT”选项。

VMware处理器虚拟化设置

开启后,重新启动虚拟机,即可在360中打开核晶防护模式。

360核晶防护引擎管理
360核晶防护开启提示

最后,在360安全卫士的“查杀引擎”中,建议将“QVM Ⅱ人工智能引擎”和“鲲鹏引擎”打开,以测试最严格的查杀环境。

360查杀引擎控制

被360QVM引擎查杀时,报毒名称前通常会有“QVM”字样前缀。

注意:在虚拟机中安装360后,尽量不要使用快照恢复功能。360的云查杀存在不稳定性,恢复快照可能导致本机测试通过的程序,在他处测试时被报毒。

(4)360杀毒环境安装

从官网下载安装。安装后,在设置中需要取消勾选以下三项:

  • 参与360杀毒用户体验改善计划
  • 自动发送程序错误报告
  • 自动上传发现的可疑程序文件

360杀毒常规设置

注意:关闭设置窗口后,最好重新打开确认一下是否已成功取消勾选。

然后,在“多引擎设置”中,勾选所有可用引擎,其中就包含“QVMⅡ人工智能引擎”。

360杀毒多引擎设置

(5)卡巴斯基环境安装

测试时应使用企业版卡巴斯基。企业版需要付费,可以在一些技术论坛寻找试用版或相关工具。当然,支持正版是最好的。版本不一定要最新,旧版本的企业版(如11.6)同样具有参考价值。

安装过程没有特殊设置。安装完成后,建议更新病毒库。更新前最好保存虚拟机快照,因为更新可能导致激活失效。

卡巴斯基数据库更新界面

如果更新后激活失效,恢复快照即可。实际上,卡巴斯基的静态查杀对病毒库时效性依赖相对较低,短期不更新影响不大。

2. 在线查杀环境

相比本地搭建,在线查杀平台集成了数十款杀软引擎,能同时对文件进行静态扫描,测试结果更具代表性和说服力。

  • VirusTotal (VT):最知名的在线查杀网站,拥有70多个杀软引擎和多个沙箱。但请注意,上传的文件会被公开共享分析,可能导致你的免杀样本特征迅速扩散而失效。因此,切勿随意上传完整的、功能正常的免杀样本。可以上传分离后的载荷、或无法正常执行的测试片段。
    VirusTotal查杀结果
  • 微步在线云沙箱:与 VT 类似,但通常能提供更详细的行为分析报告。
    微步云沙箱分析报告
  • VirScan:另一个在线查杀网站,集成引擎数量少于 VT(约50个),但其优点是上传的文件不会被公开,对新手更为友好。
    VirScan查杀结果

重要提示:在线查杀平台中,个别杀软引擎可能存在误报率高(例如对无签名文件一律报毒)的情况,其结果仅供参考。若非为了全面评估或“测试效果”,通常只要能绕过前文提到的几款主流杀软,静态免杀就算基本成功。过度依赖在线平台测试,反而有提前暴露样本特征的风险。

三、Visual Studio 安装和使用

学习 C/C++ 免杀,一个强大的集成开发环境 (IDE) 必不可少。本节将介绍 Visual Studio (VS) 安装的注意事项和核心使用技巧。

1. Visual Studio 安装

建议从官网下载最新版本的 Visual Studio Community(社区版)。安装时注意,VS 占用空间较大,可自定义安装路径到非系统盘(如 D 盘)。

在选择安装组件时,建议勾选多种编译器,包括:

  • v140, v141, v142 编译器(对应 VS 2015, 2017, 2019 的工具链)。
    VS安装组件选择v14x编译器
  • Clang 编译器 (LLVM)。
    VS安装组件选择Clang编译器

为什么需要安装多个编译器?
不同编译器生成的二进制代码存在差异,这直接影响杀软的检测结果。例如,用 VS2022 默认的 v143 编译器编译一个空项目,上传到 VT 可能就有不少报毒;而换用其他编译器(如 v141 或 Clang),报毒数可能会显著降低。你可以自行测试,选择一个报毒率相对较低的编译器作为主力。

此外,建议尝试安装 Intel C++ 编译器。它有一些独特优势,例如在 64 位模式下支持内联汇编。如果在组件列表没找到,可能需要单独安装 Intel oneAPI 工具包并集成到 VS 中。

VS安装组件中的Intel编译器选项

安装完成后,新建一个控制台项目。

VS创建新项目界面
VS新建控制台项目代码界面

然后,可以在项目属性中切换刚才安装的编译器。路径为:【项目】->【属性】->【常规】->【平台工具集】。

VS项目属性中切换平台工具集

2. Visual Studio 基本使用

VS 界面友好,支持中文,大部分功能一目了然。此处仅强调一些关键点和实用技巧。

回到代码界面,上方是菜单栏,左侧是解决方案资源管理器,右侧是属性窗口,下方是输出、错误列表等窗口。

Visual Studio主界面布局

(1)调试

调试是开发中定位问题的核心技能。VS 有两种主要的生成配置:Debug(调试)模式和 Release(发布)模式。Debug 模式包含调试信息,方便开发时排查问题;Release 模式则进行了优化,用于最终发布。两者拥有独立的项目属性设置。

VS调试与发布模式切换

Debug 模式下,可以在代码行左侧单击设置断点,然后点击 Local Windows Debugger(或按 F5)启动调试。程序执行到断点处会暂停。

在代码中设置断点

暂停后,可以使用几个关键调试命令:

  • 逐语句 (F11):执行下一行代码,如果遇到函数调用,会进入函数内部。
    调试逐语句按钮
  • 逐过程 (F10):执行下一行代码,但将函数调用作为一个整体执行,不进入其内部。
    调试逐过程按钮
  • 跳出 (Shift+F11):执行完当前函数剩余的所有代码,并返回到调用此函数的位置。
    调试跳出按钮

调试时,可以打开“反汇编”窗口,查看当前代码对应的汇编指令。掌握基本的汇编阅读能力至关重要。很多底层错误(尤其是编译器优化导致的)在高级语言层面难以察觉,必须通过汇编代码来诊断。

VS反汇编调试窗口

“内存”窗口是另一个强大工具。你可以输入内存地址来查看该处的数据。将鼠标悬停在已初始化的变量上,会显示其地址和值。

通过鼠标悬停查看变量地址

将该变量拖入内存窗口,或直接在地址栏输入变量名,即可查看其内存内容。这对于验证 Shellcode 是否正确加载、解密是否成功等场景非常有用。

在内存窗口中查看变量内容

当被监视的内存区域内容发生变化时,数值会以红色高亮显示。

内存内容变化高亮显示

你可以通过【调试】->【窗口】->【内存】打开多个内存窗口,方便同时监控不同地址。

打开多个内存窗口

“寄存器”窗口用于查看 CPU 寄存器的实时值。“线程”窗口显示当前所有线程,“模块”窗口显示已加载的 DLL。这些工具在分析复杂问题时很有帮助。

VS寄存器窗口
VS线程窗口
VS模块窗口

使用 Debug 模式编译时,会在输出目录生成一个 .pdb(程序数据库)文件,其中包含了调试符号信息。一些更强大的调试器(如 WinDbg)可以借助此文件进行更深层次的调试。

生成的exe与pdb文件

(2)正式打包生成

正式发布时务必使用 Release 模式。但需注意,Release 模式的默认设置可能并未完全关闭调试信息。

Release模式下依然可以调试

启用调试信息编译,会在生成的 PE(可移植可执行)文件(如 EXE, DLL)中留下痕迹。使用 PE 分析工具(如 PE-bear)查看,可能会发现其中包含编译时的本地路径。如果路径中含有你的用户名等敏感信息,将构成溯源风险。

PE-bear显示PDB文件路径

因此,在最终打包免杀程序前,必须在 Release 配置的项目属性中关闭调试信息生成。
路径:【项目】->【属性】->【链接器】->【调试】->【生成调试信息】,将其设置为“否”。

关闭生成调试信息

修改后重新编译,PE 文件中的调试信息段将消失。

关闭调试信息后的PE文件

另一个重要设置是运行时库。在【C/C++】->【代码生成】->【运行库】中,将默认的“多线程 DLL (/MD)”改为“多线程 (/MT)”。

更改运行库为/MT模式

/MD 与 /MT 模式的区别与选择:

  • /MD(动态链接):程序运行时需要从系统加载 MSVCRT.DLL 等运行时库。优点是生成的程序体积小。
  • /MT(静态链接):将运行时库代码直接打包进最终的可执行文件中。程序体积会增大约 100KB,且在 VT 等平台可能引起稍高的报毒率。

为何建议使用 /MT?
在一些旧版 Windows 或 Windows Server 系统上,可能不存在所需版本的 MSVCRT.DLL,导致程序因“缺少 DLL”而无法运行。如果你的目标环境包含这些旧系统,为保证兼容性,应使用 /MT 静态链接。如果仅在较新的系统(如 Win10 21H2 以后)运行,则可以使用 /MD。

最后,如非必要,建议在【链接器】->【清单文件】中,将“生成清单”设置为“否”。

关闭生成清单

因为启用清单文件可能会增加 VT 的报毒数量。下图对比了启用和关闭清单编译的同一程序在 VT 上的结果(前者报毒更多):

启用清单的VT查杀结果
关闭清单的VT查杀结果

当“生成清单”为“是”,且“UAC 执行级别”设置为 requireAdministrator 时,生成的可执行文件图标会带有盾牌标志,运行时会自动请求管理员权限,并触发 UAC(用户账户控制)弹窗。

带盾牌图标的exe文件
UAC权限申请弹窗

掌握这些基础的开发环境配置和调试技能,是进行后续免杀技术实践的必要前提。希望这篇指南能帮助你打好基础。更多深入的技术讨论,欢迎在 云栈社区 与大家交流。




上一篇:基于bert-as-service快速构建本地问答搜索引擎的Python实践
下一篇:Python实战:基于OpenWeather API从零构建天气查询MCP Server
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-4-8 08:58 , Processed in 0.742751 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表